LINUX.ORG.RU

ELF


0

0

Зачем в бинарях ELF так много секций? В винде используют на порядок меньше.
К примеру, OOffice содержит
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000013 08048134 08048134 00000134 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 08048148 08048148 00000148 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .hash 0000248c 08048168 08048168 00000168 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym 000051a0 0804a5f4 0804a5f4 000025f4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr 00010d22 0804f794 0804f794 00007794 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .gnu.version 00000a34 080604b6 080604b6 000184b6 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version_r 00000100 08060eec 08060eec 00018eec 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .rel.dyn 00000088 08060fec 08060fec 00018fec 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rel.plt 00000e20 08061074 08061074 00019074 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init 00000017 08061e94 08061e94 00019e94 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt 00001c50 08061eac 08061eac 00019eac 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text 00029f44 08063b00 08063b00 0001bb00 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini 0000001a 0808da44 0808da44 00045a44 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata 00014338 0808da60 0808da60 00045a60 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .eh_frame_hdr 00000ba4 080a1d98 080a1d98 00059d98 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame 0000356c 080a293c 080a293c 0005a93c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .gcc_except_table 00002ff8 080a5ea8 080a5ea8 0005dea8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .data 0000309c 080a9ea0 080a9ea0 00060ea0 2**5
CONTENTS, ALLOC, LOAD, DATA
18 .dynamic 00000178 080acf3c 080acf3c 00063f3c 2**2
CONTENTS, ALLOC, LOAD, DATA
19 .ctors 00000028 080ad0b4 080ad0b4 000640b4 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .dtors 00000020 080ad0dc 080ad0dc 000640dc 2**2
CONTENTS, ALLOC, LOAD, DATA
21 .jcr 00000004 080ad0fc 080ad0fc 000640fc 2**2
CONTENTS, ALLOC, LOAD, DATA
22 .got 00000738 080ad100 080ad100 00064100 2**2
CONTENTS, ALLOC, LOAD, DATA
23 .bss 00000724 080ad840 080ad840 00064840 2**5
ALLOC


В PEшных бинарях встречал максимум 4-5. Зачем нужны все эти .hash, .dynsym, .eh_frame и пр.?

anonymous

.interp - имя интерпретатора (в разных UNIX используются разные, да и в одном при изменениях в ABI изменяется интерпретатор);
.text - код
.data, .rodata - данные
.bss - область для неинициализированных переменных (заполняется нулями при загрузке)
.dynsym, .dynstr, .plt, .got, .dynamic - нужны для компоновщика(раннее связывание символов)
хэши полезно иметь для ускорения связывания
.init, .fini, .ctors, .dtors - ссылки на процедуры инициализации/деинициализации (по смыслу зависит от языка)
и т.д.

Это не столько свойства ELF, сколько свойства компилятора и компоновщика (ld-linux). Существуют, вероятно, ELF файлы с раза в два меньшим числом разделов.

Murr ★★
()
Ответ на: комментарий от anonymous

например на случай если ты захочеш использовать линуксовые бинарники под фрёй.

cvv ★★★★★
()
Ответ на: комментарий от anonymous

точнее здесь имеется ввиду интерпретатор бинарного кода.

ето идеологически похоже на ява-машину

cvv ★★★★★
()
Ответ на: комментарий от anonymous

>Понял, только одно не ясно - зачем в БИНАРНОМ файле нужна инфа об интерпретаторе?

В Linux для загрузки и для scripts и для executables используется интерпретатор (он,как правило, реализует компоновку, настройку среды для исполняемого процесса и др), ядро при вызове execve(для ELF) делает минимум действий(отображает в память интерпретатор и сам бинарник ,формирует пакет параметров и передает управление интерпретатору). В разных UNIX используется разный интерпретатор, в одном UNIX могут быть использованы разные при смене версии ABI.

Так в LynxOS, например, реализована поддержка Linux приложений: интерпретатор ld-linux - родное статическое LynxOS приложение,
glibc собрано с прослойкой, транслирующей системные вызовы Linux в системные вызовы LynxOS.
В итоге есть поддержка Linux приложений без(по большому счету) специальной поддержки в ядре.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.