Executable and Linkable Format
ELF | |
---|---|
![]() | |
Расширение |
.axf , .bin , .elf , .o , .prx , .so или .exe |
Сигнатура | 7f 45 4c 46 |
Разработчик | Unix System Laboratories |
Тип формата | двоичный, исполняемый, объектный, динамическая библиотека, дамп памяти |
![]() |
ELF (англ. Executable and Linkable 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] |
Массив байт, каждый из которых определяет общую характеристику файла. Первые четыре байта в массиве определяют сигнатуру файла и всегда должны содержать 0x7f 0x45 0x4c 0x46 соответственно.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_type |
Тип файла.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_machine |
Архитектура аппаратной платформы, для которой файл создан. Определено большое количество значений, самые часто используемые из которых:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_version |
Номер версии формата. На данный момент корректным считается только одно значение.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_entry |
Виртуальный адрес точки входа, которому система передает управление при запуске процесса. Если у файла нет точки входа, это поле содержит 0 .
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phoff |
Смещение таблицы заголовков программы от начала файла в байтах. Если у файла нет таблицы заголовков программы, это поле содержит 0 .
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shoff |
Смещение таблицы заголовков разделов от начала фйла в байтах. Если у файла нет таблицы заголовков разделов, это поле содержит 0 .
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_flags |
Связанные с файлом флаги, зависящие от процессора. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_ehsize |
Размер заголовка файла в байтах. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phentsize |
Размер одного заголовка программы. Все заголовки программы имеют одинаковый размер. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phnum |
Число заголовков программы. Если у файла нет таблицы заголовков программы, это поле содержит 0 .
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shentsize |
Размер одного заголовка секции. Все заголовки секций имеют одинаковый размер. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shnum |
Число заголовков секций. Если у файла нет таблицы заголовков секций, это поле содержит 0 .
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shstrndx |
Индекс заголовка секции в таблице секций, указывающей на таблицу названий секций. Если файл не содержит таблицы названий секций, это поле содержит 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 определяют отсутствие выравнивания. В противном случае должно быть положительной двойкой в определённой степени.
|
Таблица заголовков разделов
Это пустой раздел, который еще не написан. |
Содержимое разделов и сегментов
Сегменты содержат данные, необходимые для исполнения файла, а разделы содержат информацию для линковки и обработку relocation. Каждый байт в файле может относиться не более чем к одной секции.
![]() | Этот раздел нужно дополнить. |
Утилиты
Существует множество утилит для работы с файлами elf, основные из них содержатся в наборе программных инструментов GNU Binutils:
elfedit
— обновляет заголовок файла ELF.objdump
— показывает информацию об объектных файлах (в том числе и ELF).readelf
— показывает подробную информацию о файле.
См. также
Примечания
- ↑ System V Application Binary Interface Edition 4.1 (1997-03-18)
- ↑ Спецификация ELF (англ.)
- ↑ ELF-64 Object File Format
Ссылки
- Секреты покорения эльфов / Крис Касперски // Хакер. – 2005. – № 11/05 (83). – С. 106–110.
- ELF. Структура файлов
- Как запускается функция main() в Linux
- Как сделать Linux программы меньше
- Использование дополнительных .ELF сегментов в QNX