Получение разницы между виртуальным адресом и смещением в файле ELF - PullRequest
0 голосов
/ 18 февраля 2020

readelf -S конкретного двоичного файла дает следующий вывод

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000400238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
       0000000000000020  0000000000000000   A       0     0     4
  [ 3] .hash             HASH             0000000000400278  00000278
       0000000000000a7c  0000000000000004   A       4     0     8
  [ 4] .dynsym           DYNSYM           0000000000400cf8  00000cf8
.
.
.

Разница между виртуальным адресом и смещением первой секции .interp равна 0x400000. Мне любопытно:

  • как это рассчитывается?
  • Есть ли программный c способ определения этого?

1 Ответ

1 голос
/ 19 февраля 2020

как рассчитывается?

Вы только что рассчитали сами: 0x400238 - 0x238 == 0x400000. Ваш вопрос, вероятно, «почему именно этот адрес выбран?».

Это адрес ссылки по умолчанию для Linux x86_64 позиции зависимых двоичных файлов. Вы можете изменить этот адрес с помощью -Ttext=... флага компоновщика. По умолчанию для ix86 (32-разрядных) двоичных файлов другое значение: 0x8048000.

Я не уверен, почему были выбраны эти конкретные значения по умолчанию.

Есть ли программные средства? c способ определения этого?

Конечно: прочитайте Elf64_Ehdr с начала файла. Он сообщит вам смещение к началу заголовков программы (.e_phoff). Найдите это смещение и прочитайте Elf64_Phdr с. Теперь итерируйте их, и их .p_vaddr и .p_offset будут иметь одинаковые значения.

PS. Вы просматриваете программы разделы , которые не используются и не обязательно присутствуют. в полностью связанном бинарном файле. Вы должны смотреть на программу сегментов . Используйте readelf -Wl a.out, чтобы изучить их.

...