Ответ 1
Я до сих пор не совсем понимаю, где хранятся разделы для сегментных сопоставлений.
Они нигде не хранятся.
Скорее, readelf
вычисляет отображение, просматривая смещение файла и размер разделов и сегментов.
В рамках попытки полностью написать компилятор с нуля, я в настоящее время работаю над частью обработки файлов 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.
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 fileSize: 0x00cf4
.init_array начало раздела addr: 10000h
конец раздела .bss адрес: hex (0x00f2e8 + 0) = 0x10cf4
Вы видите, что readelf
обязательно печатает разделы в сегментах по вычислениям. Они хорошо сочетаются.