Как просмотреть информацию о макете раздела, записанную в файле ELF?

Предположим, что следующий скрипт компоновщика используется для разметки исполняемого файла.

SECTIONS
{
. = 0x10000;
.text : { *(.text) }
.data : { *(.data) }
.bss  : { *(.bss) }
}

OUTPUT_FORMAT(ELF)

Мои вопросы:

  1. Я думаю, что такая информация о макете должна храниться в выходном файле ELF, чтобы загрузчик мог загрузить исполняемый файл на основе этой информации. Правильно?

  2. Если 1 верно, как просмотреть такую ​​информацию о макете в ELF? обждамп?


person smwikipedia    schedule 07.07.2016    source источник


Ответы (3)


  1. Я думаю, что такая информация о макете должна храниться в выходном файле ELF, чтобы загрузчик мог загрузить исполняемый файл на основе этой информации. Правильно?

ELF означает формат исполняемого файла и ссылки.

.text, .data и т. д. являются частью формата linking. Хотя они обычно присутствуют в полностью связанном двоичном файле, их можно удалить.

Информация, необходимая загрузчику для загрузки исполняемого файла, хранится в виде таблицы сегментов (Elf{36,64}_Phdr[]).

  1. Если 1 верно, как просмотреть такую ​​информацию о макете в ELF? обждамп?

Вы можете просматривать сегменты (и, если присутствует необязательная таблица разделов, сопоставление разделов с сегментами) с помощью readelf -Wl a.out.

person Employed Russian    schedule 10.07.2016

Я немного поискал и нашел кое-что.

Для 1. Согласно формату ELF в Википедии, есть program headers, которые записывают информацию о макете адреса.

Для 2. readelf перспективный инструмент.

person smwikipedia    schedule 07.07.2016

Вы можете вывести информацию из командного сценария компоновщика, взглянув на вывод опции -S в readelf.

$ readelf -S $(which ls)
There are 28 section headers, starting at offset 0x1f6f8:

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] .note.gnu.build-i NOTE             0000000000400274  00000274
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
       0000000000000104  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000004003a0  000003a0
       0000000000000c48  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           0000000000400fe8  00000fe8
       0000000000000582  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           000000000040156a  0000156a
...

Если вы хотите знать, откуда это взялось, взгляните на командные сценарии компоновщика по умолчанию для вашей цепочки инструментов; это значение по умолчанию используется, если вы явно не создали свой собственный. Я думаю, что между ними также может быть какое-то наследство, но я не могу сказать наверняка.

$ ls -l /usr/lib/ldscripts/ | grep elf
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.x
-rw-r--r-- 1 root root 8880 Mar 22 04:05 elf32_x86_64.xbn
-rw-r--r-- 1 root root 8706 Mar 22 04:05 elf32_x86_64.xc
-rw-r--r-- 1 root root 9024 Mar 22 04:05 elf32_x86_64.xd
-rw-r--r-- 1 root root 8720 Mar 22 04:05 elf32_x86_64.xdc
-rw-r--r-- 1 root root 8680 Mar 22 04:05 elf32_x86_64.xdw
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.xn
-rw-r--r-- 1 root root 5443 Mar 22 04:05 elf32_x86_64.xr
-rw-r--r-- 1 root root 8551 Mar 22 04:05 elf32_x86_64.xs
-rw-r--r-- 1 root root 8247 Mar 22 04:05 elf32_x86_64.xsc
-rw-r--r-- 1 root root 8207 Mar 22 04:05 elf32_x86_64.xsw
-rw-r--r-- 1 root root 5489 Mar 22 04:05 elf32_x86_64.xu
-rw-r--r-- 1 root root 8666 Mar 22 04:05 elf32_x86_64.xw
-rw-r--r-- 1 root root 8396 Mar 22 04:05 elf_i386.x
-rw-r--r-- 1 root root 8249 Mar 22 04:05 elf_i386.xbn
-rw-r--r-- 1 root root 8209 Mar 22 04:05 elf_i386.xc
-rw-r--r-- 1 root root 8389 Mar 22 04:05 elf_i386.xd
-rw-r--r-- 1 root root 8219 Mar 22 04:05 elf_i386.xdc
...
person sherrellbc    schedule 19.05.2017