ELF (англ. Executable and Linkable Format — формат виконання та зв'язування, раніше звався англ. Extensible Linking Format — розширюваний зв'язувальний формат) — формат виконуваного файла, об'єктних модулів, розділювальних бібліотек та системних дампів; використовується в багатьох Unix-подібних операційних системах, наприклад, в Linux, FreeBSD і Solaris.
Історія
ELF формат був розроблений і опублікований UNIX System Laboratories (USL), як частина двійкового бінарного інтерфейсу (ABI). Комітет з стандартів інтерфейсу (TIS) визначив ELF, як стандарт для портативних об'єктних файлів, що працюють на 32-бітних архітектурах компанії Intel, для різних операційних систем.
Структура
В заголовному файлі <elf.h> визначена структура, що описує ELF файли.
ELF файли бувають:
- виконуваними (normal executable files) — файли придатні для виконання, створює образ процесу (process image);
- об'єктними (relocatable object files) — містять код та дані, придатні для зв'язування (linking) з іншими об'єктними файлами для створення виконуваних;
- спільні об'єктні файли (shared object file) — містять код та дані, придатні для зв'язування у двох сенсах: статичне зв'язування (зв'язування з іншими об'єктними файлами під час процесу зв'язування для створення виконуваних файлів), динамічне зв'язування (звертання виконуваного файлу до спільних об'єктних файлів, для створення образу процесу).
Кожен файл формату ELF має ELF-заголовок (ELF header) (обов'язково), потім йде таблиця програмних заголовків (program header table) чи таблиця заголовків секцій (section header table), або і те, і інше. ELF-заголовок обов'язково має нульове зміщення у файлі (тобто знаходиться на його початку). Зміщення у файлі для таблиці програмних заголовків і таблиці заголовків секцій визначається у ELF-заголовку.
ELF-заголовок, таблиця програмних заголовків, таблиця заголовків секцій описуються, як структури C, які включають в себе інші типи, що також визначені у заголовному файлі <elf.h>.
Нижче перераховані типи, які використовують для N-бітної архітектури (N = 32 чи 64):
ElfN_Addr Беззнакова адреса, uintN_t
ElfN_Off Беззнакове зміщення, uintN_t
ElfN_Section Беззнаковий індекс секції, uint16_t
ElfN_Versym Unsigned version symbol information, uint16_t
Elf_Byte Беззнаковий char
ElfN_Half uint16_t
ElfN_Sword int32_t
ElfN_Word uint32_t
ElfN_Sxword int64_t
ElfN_Xword uint64_t
Поля цієї таблиці використовує завантажувач (ELF interpreter) для запису програми в оперативну пам'ять перед виконуванням.
Робота з ELF файлами
Для роботи з ELF файлами використовують бібліотеку libelf.
Також можна використовувати програми з пакету GNU Binutils.
Література
Посилання