Executable and Linkable Format
| ELF | |
|---|---|
| |
| Расширение |
.без расширения; .axf, .bin, .elf, .o, .out, .prx, .puff, .ko, .mod, .so |
| Сигнатура | 7f 45 4c 46 |
| Разработчик | Unix System Laboratories |
| Тип формата | двоичный, исполняемый, объектный, динамическая библиотека, дамп памяти |
ELF (англ. Executable and Linking Format — формат исполнимых и компонуемых файлов) — формат исполняемых двоичных файлов, используемый во многих современных UNIX-подобных операционных системах, таких как FreeBSD, Linux, Solaris и др.
История
Стандарт формата ELF изначально был разработан и опубликован компанией USL как часть двоичного интерфейса приложений операционной системы UNIX System V[1]. Затем он был выбран комитетом TIS и развит в качестве переносимого формата для различных операционных систем, работающих на 32-разрядной аппаратной архитектуре Intel x86.[2] ELF быстро набрал популярность и, после того как компания HP расширила формат и опубликовала стандарт ELF-64, распространился и на 64-разрядных платформах.[3]
Типы
Стандарт формата ELF различает несколько типов файлов:
- Перемещаемый файл — хранит инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такой связи может быть совместно используемый объектный файл или исполняемый файл. К этому типу относятся объектные файлы статических библиотек.
- Совместно используемый объектный файл — также содержит инструкции и данные и может быть связан с другими перемещаемыми файлами и совместно используемыми объектными файлами, в результате чего будет создан новый объектный файл, либо при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о совместно используемых библиотеках.
- Исполняемый файл — содержит полное описание, позволяющее системе создать образ процесса. В том числе: инструкции, данные, описание необходимых совместно используемых объектных файлов и необходимую символьную и отладочную информацию.
Формат
Каждый ELF файл состоит из следующих частей:
Заголовок файла
Заголовок файла (ELF Header) имеет фиксированное расположение в начале файла и содержит общее описание структуры файла и его основные характеристики, такие как: тип, версия формата, архитектура процессора, виртуальный адрес точки входа, размеры и смещения остальных частей файла. Заголовок имеет размер 52 байта для 32-битных файлов или 64 для 64-битных. Данное различие обуславливается тем, что в заголовке файла содержится три поля, имеющих размер указателя, который составляет 4 и 8 байт для 32- и 64-битных процессоров соответственно. Такими полями являются e_entry, e_phoff и e_shoff.
| Размер | Название | Назначение | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32 |
64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_ident[16] | Общая характеристика файла.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_type | Тип файла.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_machine | Архитектура аппаратной платформы, для которой файл создан:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_version | Номер версии формата. На данный момент корректным считается только одно значение.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_entry | Виртуальный адрес точки входа, которому система передает управление при запуске процесса. Если у файла нет точки входа, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phoff | Смещение таблицы заголовков программы от начала файла в байтах. Если у файла нет таблицы заголовков программы, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shoff | Смещение таблицы заголовков секций от начала файла в байтах. Если у файла нет таблицы заголовков секций, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_flags | Связанные с файлом флаги, зависящие от процессора. При их отсутствии это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_ehsize | Размер заголовка файла в байтах (52 для 32-битных файлов и 64 для 64-битных).
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phentsize | Размер одного заголовка программы. Все заголовки программы имеют одинаковый размер (32 для 32-битных файлов и 56 для 64-битных).
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phnum | Число заголовков программы. Если у файла нет таблицы заголовков программы, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shentsize | Размер одного заголовка секции. Все заголовки секций имеют одинаковый размер (40 для 32-битных файлов и 64 для 64-битных).
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shnum | Число заголовков секций. Если у файла нет таблицы заголовков секций, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shstrndx | Индекс записи в таблице заголовков секций, описывающей таблицу названий секций (обычно эта таблица называется .shstrtab и представляет собой отдельную секцию). Если файл не содержит таблицы названий секций, это поле содержит 0.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Таблица заголовков программы
Таблица заголовков программы содержит заголовки, каждый из которых описывает отдельный сегмент программы и его атрибуты либо другую информацию, необходимую операционной системе для подготовки программы к исполнению.
Данная таблица может располагаться в любом месте файла, её местоположение (смещение относительно начала файла) описывается в поле e_phoff заголовка ELF.
При анализе структуры заголовка программы можно обнаружить различное местоположение поля p_flags для 32- и 64-битных ELF файлов. Данное различие обуславливается выравниванием структуры для увеличения эффективности обработки.
| Размер | Название | Назначение | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ELF
32 |
ELF
64 | |||||||||||||||||||||||||||||||||||
p_type |
Тип сегмента, который описывает данный заголовок, или каким образом интерпретировать значения полей этого заголовка.
| |||||||||||||||||||||||||||||||||||
p_flags |
Флаги, относящиеся к сегменту (для ELF64).
| |||||||||||||||||||||||||||||||||||
p_offset |
Смещение сегмента от начала файла. | |||||||||||||||||||||||||||||||||||
p_vaddr |
Виртуальный адрес сегмента в памяти, куда должен быть загружен сегмент при отображении в память. | |||||||||||||||||||||||||||||||||||
p_paddr |
Физический адрес сегмента (для систем, в которых он важен). | |||||||||||||||||||||||||||||||||||
p_filesz |
Размер сегмента в файле. Может быть нулевым. | |||||||||||||||||||||||||||||||||||
p_memsz |
Размер сегмента в памяти. Может быть нулевым. | |||||||||||||||||||||||||||||||||||
p_flags |
Флаги, относящиеся к сегменту (для ELF32) (возможные значения см. выше). | |||||||||||||||||||||||||||||||||||
p_align |
Выравнивание сегмента. 0 и 1 определяют отсутствие выравнивания. В противном случае должно быть положительной двойкой в определённой степени. | |||||||||||||||||||||||||||||||||||
Таблица заголовков секций
Таблица заголовков секций содержит атрибуты секций файла. Данная таблица необходима только компоновщику, исполняемые файлы в наличии этой таблицы не нуждаются (ELF загрузчик её игнорирует). Предоставленную в таблице заголовков секций информацию компоновщик использует для оптимального размещения данных секций по сегментам при сборке файла с учётом их атрибутов.
| Размер | Название | Назначение | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ELF
32 |
ELF
64 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_name |
Смещение строки, содержащей название данной секции, относительно начала таблицы названий секций. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_type |
Тип заголовка.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_flags |
Атрибуты секции.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_addr |
Если секция должна быть загружена в память при загрузке объектного файла, это поле указывает адрес, начиная с которого секция будет загружена, в противном случае поле содержит 0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_offset |
Смещение секции от начала файла в байтах. Секции типа SHT_NOBITS не занимают места в файле, для них данное поле содержит концептуальное местоположение в файле. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_size |
Размер секции в файле. Может быть нулевым. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_link |
Индекс ассоциированной секции. Данное поле может иметь различное предназначение в зависимости от типа заголовка.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_info |
Дополнительная информация о секции (возможные значения см. выше). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_addralign |
Необходимое выравнивание секции. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sh_entsize |
Размер в байтах каждой записи (в том случае, если секция содержит массив записей фиксированного размера, в противном случае поле содержит 0). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Содержимое секций и сегментов
Утилиты
Существует множество утилит для работы с файлами формата ELF, основные из них содержатся в наборе программных инструментов GNU Binutils:
elfedit— изменение заголовка файла ELF, часть набора GNU Binutils.objdump— вывод информации об объектных файлах (в том числе и ELF), часть набора GNU Binutils.readelf— вывод подробной информации об объектном файле формата ELF, часть набора GNU Binutils.elfdump— вывод информации о ELF файле, часть набора GNU Binutils.elfutils— альтернатива для GNU Binutils, официально доступна только для GNU/Linux, но существуют порты на другие операционные системы[4].file— вывод небольшого количества информации о файлах известных программе форматов (доступна для большинства UNIX-подобных операционных систем).
См. также
Примечания
- ↑ System V Application Binary Interface Архивная копия от 21 мая 2015 на Wayback Machine Edition 4.1 (1997-03-18)
- ↑ Спецификация ELF Архивная копия от 16 июня 2012 на Wayback Machine (англ.)
- ↑ ELF-64 Object File Format Архивная копия от 1 июля 2015 на Wayback Machine
- ↑ FreshPorts -- devel/elfutils. www.freshports.org. Дата обращения: 31 марта 2018. Архивировано 16 февраля 2018 года.
Ссылки
- Секреты покорения эльфов / Крис Касперски // Хакер. – 2005. – № 11/05 (83). – С. 106–110.
- ELF. Структура файлов
- Как запускается функция main() в Linux
- Как сделать Linux программы меньше
- Использование дополнительных .ELF сегментов в QNX
- Разбор файла в 64-битном формате ELF
