Executable and Linkable Format

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
ELF
Расширение

без расширения, .o, .so, .elf, .prx, .puff

Сигнатура

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.[2] ELF быстро набрал популярность и, после того как компания HP расширила формат и опубликовала стандарт ELF-64, распространился и на 64-разрядных платформах.[3]

Типы[править | править вики-текст]

Стандарт формата ELF различает несколько типов файлов:

  • Перемещаемый файл — хранит инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такой связи может быть разделяемый объектный файл или исполняемый файл. К этому типу относятся объектные файлы статических библиотек.
  • Разделяемый объектный файл — также содержит инструкции и данные и может быть связан с другими перемещаемыми файлами и разделяемыми объектными файлами, в результате чего будет создан новый объектный файл, либо при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о разделяемых библиотеках.
  • Исполняемый файл — содержит полное описание, позволяющее системе создать образ процесса. В том числе: инструкции, данные, описание необходимых разделяемых объектных файлов и необходимую символьную и отладочную информацию.

Формат[править | править вики-текст]

Файлы ELF имеют два типа разбиений. Программный заголовок (program header) соответствует сегментам, которые будут использованы при исполнении. Заголовок секций (section header) перечисляет секции исполняемого файла

Каждый ELF файл состоит из следующих частей:

Заголовок файла[править | править вики-текст]

Заголовок файла (ELF Header) имеет фиксированное расположение в начале файла и содержит общее описание структуры файла и его основные характеристики, такие как: тип, версия формата, архитектура процессора, виртуальный адрес точки входа, размеры и смещения остальных частей файла.

Поля заголовка файла ELF
Поле Описание
e_ident[] Массив байт, каждый из которых определяет общую характеристику файла. Первые четыре байта в массиве определяют сигнатуру файла и всегда должны содержать 0x7f 0x45 0x4c 0x46 соответственно.
e_type Тип файла.
e_machine Архитектура аппаратной платформы, для которой файл создан.
e_version Номер версии формата.
e_entry Точка входа.
e_phoff Расположение[4] таблицы заголовков программы.
e_shoff Расположение таблицы заголовков разделов.
e_flags Связанные с файлом флаги, зависящие от процессора.
e_ehsize Размер[5] заголовка файла.
e_phentsize Размер каждого заголовка программы.
e_phnum Число заголовков программы.
e_shentsize Размер каждого заголовка разделов.
e_shnum Число заголовков разделов.
e_shstrndx Расположение сегмента, содержащего таблицу строк.

Таблица заголовков программы[править | править вики-текст]

Таблица заголовков программы или таблица заголовков сегментов расположена сразу после заголовка файла и содержит заголовки сегментов, каждый из которых описывает отдельный сегмент программы и его атрибуты, такие как:

  • Тип сегмента и действия операционной системы с данным сегментом.
  • Расположение сегмента.
  • Точка входа сегмента.
  • Размер сегмента.
  • Флаги доступа к сегменту (запись, чтение, выполнение).

Информация содержащаяся в этой таблице представляет интерес для ядра системы, т.к. указывает ему, как собрать образ процесса из сегментов.

Таблица заголовков разделов[править | править вики-текст]

Содержимое разделов и сегментов[править | править вики-текст]

Сегменты содержат данные, необходимые для исполнения файла, а разделы содержат информацию для линковки и обработку relocation. Каждый байт в файле может относиться не более чем к одной секции.

Утилиты[править | править вики-текст]

Существует множество утилит для работы с файлами elf, основные из них содержатся в наборе программных инструментов GNU Binutils:

  • elfedit - обновляет заголовок файла ELF.
  • objdump - показывает информацию об объектных файлах (в том числе и ELF).
  • readelf - показывает подробную информацию о файле.


См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. System V Application Binary Interface Edition 4.1 (1997-03-18)
  2. Спецификация ELF (англ.)
  3. ELF-64 Object File Format
  4. Количество байт от начала файла
  5. В байтах

Ссылки[править | править вики-текст]