В Unix-подобных системах довольно часто можно встретить аббревиатуру
ELF.Executable and Linkable Format. Это в принципе формат организации исполняемого бинарного файла.
Общая информация (заголовки):
$ readelf -h /bin/ls
Заголовок ELF:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Класс: ELF64
Данные: дополнение до 2, от младшего к старшему
Version: 1 (current)
OS/ABI: UNIX - System V
Версия ABI: 0
Тип: DYN (Position-Independent Executable file)
Машина: Advanced Micro Devices X86-64
Версия: 0x1
Адрес точки входа: 0x54f0
Начало заголовков программы: 64 (байт в файле)
Начало заголовков раздела: 160680 (байт в файле)
Флаги: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 14
Size of section headers: 64 (bytes)
Number of section headers: 28
Section header string table index: 27
Инструкции к памяти:
$ readelf -l /bin/ls
Тип файла ELF — DYN (Position-Independent Executable file)
Entry point 0x54f0
There are 14 program headers, starting at offset 64
Заголовки программы:
Тип Смещ. Вирт.адр Физ.адр
Рзм.фйл Рзм.пм Флаги Выравн
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x0000000000000310 0x0000000000000310 R 0x8
INTERP 0x0000000000000374 0x0000000000000374 0x0000000000000374
0x000000000000001c 0x000000000000001c R 0x1
[Запрашиваемый интерпретатор программы: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000002468 0x0000000000002468 R 0x1000
LOAD 0x0000000000003000 0x0000000000003000 0x0000000000003000
...
Секции бинарника
$ readelf -S /bin/ls
There are 28 section headers, starting at offset 0x273a8:
Заголовки разделов:
[Нм] Имя Тип Адрес Смещение
Размер Разм.Ent Флаги Ссылк Инфо Выравн
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .note.gnu.bu[...] NOTE 0000000000000350 00000350
0000000000000024 0000000000000000 A 0 0 4
[ 2] .interp PROGBITS 0000000000000374 00000374
000000000000001c 0000000000000000 A 0 0 1
[ 3] .gnu.hash GNU_HASH 0000000000000390 00000390
...
Динамические зависимости:
$ readelf -d /bin/ls | grep NEEDED
0x0000000000000001 (NEEDED) Совм. исп. библиотека: [libcap.so.2]
0x0000000000000001 (NEEDED) Совм. исп. библиотека: [libc.so.6]
Типы ELF-файлов:
-
ET_REL (Relocatable): объектный файл (.o)-
ET_EXEC (Executable): обычная программа-
ET_DYN (Shared Object): динамические библиотеки (.so)В целом это почти то же самое, что EXE в Windows - там используется формат `PE` (Portable Executable), а здесь ELF. Но исторически сложилось так, что EXE это буквально стандарт упаковки программ, а ELF это базовый, но скрытый за динамическими зависимостями компонент.