Где в файлах ELF хранится «Сопоставление разделов с сегментами»?

StackOverflow https://stackoverflow.com//questions/23018496

Вопрос

В рамках попытки написать компилятор полностью с нуля я сейчас работаю над той частью, которая обрабатывает файлы ELF.

Пролистав несколько статей и спецификаций к ним, я до сих пор не совсем понимаю, где хранятся сопоставления разделов и сегментов.Наблюдая за небольшими исполняемыми файлами, генерируемыми NASM+ld, я вижу, что раздел .text каким-то образом отображается в заголовке программы типа LOAD, но как?

Небольшой фрагмент вывода readelf, когда на входе указан небольшой (рабочий) исполняемый файл:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000084 0x0000000000000084  R E    200000

 Section to Segment mapping:
  Segment Sections...
   00     .text 

Требуется ли это сопоставление для наличия работающего исполняемого файла?Или их можно полностью опустить, и у вас все равно останется действительный исполняемый файл?

Это было полезно?

Решение

Я до сих пор не совсем понимаю, где хранятся сопоставления разделов и сегментов.

Они есть нет хранится где угодно.

Скорее, readelf вычисляет сопоставление, просматривая смещение файла и размер разделов и сегментов.

Другие советы

Я делала тест по версии @Employed Russian.

readelf -l ./libandroid_servers.so

Elf file type is DYN (Shared object file)
Entry point 0x0
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00000034 0x00000034 0x000c0 0x000c0 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x0f830 0x0f830 R E 0x1000
  LOAD           0x010000 0x00010000 0x00010000 0x00cf4 0x011ac RW  0x1000
  DYNAMIC        0x010540 0x00010540 0x00010540 0x00130 0x00130 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX          0x00f2e8 0x0000f2e8 0x0000f2e8 0x00548 0x00548 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .hash .dynsym .dynstr .rel.plt .rel.dyn .plt .text .rodata .ARM.extab .ARM.exidx 
   02     .init_array .fini_array .data.rel.ro .dynamic .got .data .bss 
   03     .dynamic 
   04     
   05     .ARM.exidx 

01 Смещение загрузки: 0x000000 fileSize 0x0f830
Конечный адрес раздела .ARM.exidx: hex(0x00f2e8 + 0x00548) = 0xf830

02 Смещение НАГРУЗКИ:0x010000Размер файла:0x00cf4
Начальный адрес раздела .init_array: 10000h
Конечный адрес раздела .bss: hex(0x00f2e8 + 0) = 0x10cf4

Вы видите readelf обязательно распечатайте разделы в сегментах по вычислениям.Они хорошо сочетаются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top