Расширение имени файла | нет,.axf,.bin,.elf,.o,.prx,.puff,.ko,. mod и.so |
---|---|
Магическое число | 0x7F 'E' 'L' 'F' |
Разработано | Unix System Laboratories |
Тип формата | Двоичный, исполняемый файл, объект, общая библиотека, дамп ядра |
Контейнер для | многих исполняемых двоичных форматов |
В вычислениях, исполняемый и связываемый формат ( ELF, ранее называвшийся Extensible Linking Format ), является распространенным стандартным форматом файла для исполняемых файлов, объектный код, разделяемые библиотеки и дампы ядра. Впервые опубликовано в спецификации для двоичного интерфейса приложения (ABI) версии операционной системы Unix с именем System V Release 4 (SVR4), а затем в Стандарт интерфейса инструментов, он был быстро принят различными поставщиками систем Unix. В 1999 году он был выбран в качестве стандартного формата двоичных файлов для Unix и Unix-подобных систем на процессорах x86 проектом 86open.
По замыслу, формат ELF является гибким, расширяемым и кроссплатформенным. Например, он поддерживает различные значения порядка байтов и размеры адресов, поэтому он не исключает какой-либо конкретный центральный процессор (ЦП) или архитектуру набора команд. Это позволило использовать его во многих различных операционных системах на множестве различных аппаратных платформ.
Каждый файл ELF состоит из одного заголовка ELF, за которым следуют данные файла. Данные могут включать:
Сегменты содержат информацию, необходимую для выполнения выполнения файла, а разделы содержат важные данные для связывания и перемещения. Любой байт во всем файле может принадлежать не более чем одному разделу, и могут возникнуть лишние байты, не принадлежащие ни одному разделу.
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............ |
00000010 02 00 3e 00 01 00 00 00 c5 48 40 00 00 00 00 00 |..>...... H @..... |
Пример шестнадцатеричного дампа заголовка файла ELF
Заголовок ELF определяет, следует ли используйте 32-битные или 64-битные адреса. Заголовок содержит три поля, на которые влияет этот параметр и смещает другие поля, следующие за ними. Заголовок ELF имеет длину 52 или 64 байта для 32-битных и 64-битных двоичных файлов соответственно.
Смещение | Размер (байты) | Поле | Назначение | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32-битный | 64-битный | 32-разрядный | 64-разрядный | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x00 | 4 | e_ident [EI_MAG0] до e_ident [EI_MAG3] | 0x7F , за которым следует ELF (45 4c 46 ) в ASCII ; эти четыре байта составляют магическое число. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x04 | 1 | e_ident [EI_CLASS] | Этот байт устанавливается в 1 или 2 для обозначения 32- или 64-битный формат соответственно. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x05 | 1 | e_ident [EI_DATA] | Этот байт имеет значение 1 или 2 для обозначения малого или большого порядка байтов соответственно. Это влияет на интерпретацию многобайтовых полей, начиная со смещения 0x10 . | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x06 | 1 | e_ident [EI_VERSION] | Устанавливается в 1 для исходной и текущей версии ELF. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x07 | 1 | e_ident [EI_OSABI] | Определяет целевую операционную систему ABI.
Часто устанавливается на | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x08 | 1 | e_ident [EI_ABIVERSION] | Далее указывает версию ABI. Его интерпретация зависит от целевого ABI. Ядро Linux (по крайней мере, версии 2.6) не имеет его определения, поэтому оно игнорируется для статически связанных исполняемых файлов. В этом случае смещение и размер EI_PAD равны 8 . glibc 2.12+ в случае, если {{{1}}} рассматривает это поле как ABI-версию динамического компоновщика : он определяет список функции динамического компоновщика рассматривает e_ident [EI_ABIVERSION] как уровень функции, запрошенный совместно используемым объектом (исполняемой или динамической библиотекой), и отказывается загружать его, если запрашивается неизвестная функция, то есть e_ident [EI_ABIVERSION] больше, чем самая крупная из известных функций. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x09 | 7 | e_ident [EI_PAD] | в настоящее время не используется, следует заполнить нулями. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x10 | 2 | e_type | Определяет тип объектного файла.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x12 | 2 | e_machine | Задает целевую архитектуру набора команд . Вот несколько примеров:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x14 | 4 | e_version | Установите значение 1 для исходной версии ELF. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x18 | 4 | 8 | e_entry | Это адрес памяти точки входа, с которой процесс начинает выполнение. Это поле имеет длину 32 или 64 бита в зависимости от формата, определенного ранее. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x1C | 0x20 | 4 | 8 | e_phoff | Указывает на начало таблицы заголовков программы. Обычно он следует сразу за заголовком файла, делая смещение 0x34 или 0x40 для 32- и 64-битных исполняемых файлов ELF соответственно. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x20 | 0x28 | 4 | 8 | e_shoff | Указывает на начало таблицы заголовков раздела. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x24 | 0x30 | 4 | e_flags | Интерпретация этого поля зависит от целевой архитектуры. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x28 | 0x34 | 2 | e_ehsize | Содержит размер этого заголовка, обычно 64 байта для 64-битного и 32 байта для 32-битного формата. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x2A | 0x36 | 2 | e_phentsize | Содержит размер записи таблицы заголовков программы. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x2C | 0x38 | 2 | e_phnum | Содержит количество записей в таблице заголовков программы. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x2E | 0x3A | 2 | e_shentsize | Содержит размер записи таблицы заголовков раздела. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x30 | 0x3C | 2 | e_shnum | Содержит количество записей в таблице заголовков раздела. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x32 | 0x3E | 2 | e_shstrndx | Содержит индекс записи таблицы заголовков раздела, содержащей имена разделов. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x34 | 0x40 | Конец заголовка ELF (размер) |
Таблица заголовков программы сообщает системе, как создать образ процесса. Он находится по смещению файла e_phoff и состоит из записей e_phnum, каждая размером e_phentsize. Макет немного отличается в 32-битном ELF и 64-битном ELF, потому что p_flags находятся в другом месте структуры по причинам выравнивания. Каждая запись имеет следующую структуру:
Смещение | Размер (байты) | Поле | Назначение | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32-битное | 64-битный | 32-битный | 64-битный | ||||||||||||||||||||||||||||||||||||||
0x00 | 4 | p_type | Определяет тип сегмента.
to PT_HIOS (от PT_LOPROC до PT_HIPROC) - это включающие зарезервированные диапазоны для специфической семантики операционной системы (процессора). | ||||||||||||||||||||||||||||||||||||||
0x04 | 4 | p_flags | Флаги, зависящие от сегмента (позиция для 64-битной структуры). | ||||||||||||||||||||||||||||||||||||||
0x04 | 0x08 | 4 | 8 | p_offset | Смещение сегмента в изображении файла. | ||||||||||||||||||||||||||||||||||||
0x08 | 0x10 | 4 | 8 | p_vaddr | Виртуальный адрес сегмента в памяти. | ||||||||||||||||||||||||||||||||||||
0x0C | 0x18 | 4 | 8 | p_paddr | В системах, где важен физический адрес, зарезервирован для физического адреса сегмента. | ||||||||||||||||||||||||||||||||||||
0x10 | 0x20 | 4 | 8 | p_filesz | Размер в байтах сегмента в файле изображения. Может быть 0. | ||||||||||||||||||||||||||||||||||||
0x14 | 0x28 | 4 | 8 | p_memsz | Размер сегмента в памяти в байтах. Может быть 0. | ||||||||||||||||||||||||||||||||||||
0x18 | 4 | p_flags | Флаги, зависящие от сегмента (позиция для 32-битной структуры). | ||||||||||||||||||||||||||||||||||||||
0x1C | 0x30 | 4 | 8 | p_align | 0 и 1 не указывают выравнивания. В противном случае должна быть положительная интегральная степень двойки, где p_vaddr равняется p_offset modulus p_align. | ||||||||||||||||||||||||||||||||||||
0x20 | 0x38 | Заголовок конца программы (размер) |
Смещение | Размер (байты) | Поле | Назначение | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32-бит | 64-бит | 32-бит | 64-бит | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x00 | 4 | sh_name | Смещение строки в разделе .shstrtab, который представляет имя этого раздела. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x04 | 4 | sh_type | Определяет тип этого заголовка.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x08 | 4 | 8 | sh_flags | Определяет атрибуты раздела.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x0C | 0x10 | 4 | 8 | sh_addr | Виртуальный адрес раздела в памяти для загружаемых разделов. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x10 | 0x18 | 4 | 8 | sh_offset | Смещение раздела в изображении файла. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x14 | 0x20 | 4 | 8 | sh_size | Размер в байтах раздела в образе файла. Может быть 0. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x18 | 0x28 | 4 | sh_link | Содержит индекс раздела связанного раздела. Это поле используется для нескольких целей в зависимости от типа раздела. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x1C | 0x2C | 4 | sh_info | Содержит дополнительную информацию о разделе. Это поле используется для нескольких целей в зависимости от типа раздела. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x20 | 0x30 | 4 | 8 | sh_addralign | Содержит необходимое выравнивание раздела. Это поле должно быть степенью двойки. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x24 | 0x38 | 4 | 8 | sh_entsize | Содержит размер в байтах каждой записи для разделов, содержащих записи фиксированного размера. В противном случае это поле содержит ноль. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x28 | 0x40 | Заголовок конца раздела (размер) |
readelf
- это двоичная утилита Unix, которая отображает информацию об одном или нескольких файлах ELF. Реализация бесплатного программного обеспечения предоставляется GNU Binutils.elfutils
предоставляет альтернативные инструменты для GNU Binutils исключительно для Linux.elfdump
является Команда для просмотра информации ELF в файле ELF, доступная в Solaris, и FreeBSD.objdump
предоставляет широкий спектр информации о файлах ELF и других форматах объектов. objdump
использует библиотеку дескрипторов двоичных файлов в качестве серверной части для структурирования данных ELF.файл
может отображать некоторую информацию о файлах ELF, в том числе об архитектуре набора инструкций , для которой предназначен код в перемещаемом, исполняемом или совместно используемом объектном файле или на котором дамп ядра ELF .Формат ELF заменил старые исполняемые форматы в различных средах. Он заменил форматы a.out и COFF в Unix-подобных операционных системах:
ELF также получил некоторое распространение в операционных системах, отличных от Unix, например:
Некоторые игровые консоли также используют ELF:
Другие (операционные) системы, работающие на PowerPC и использующие ELF:
Некоторые операционные системы для мобильных телефонов и мобильных устройств используют ELF:
Некоторые телефоны могут запускать файлы ELF через использование патча, который добавляет ассемблерный код к основной прошивке, что является функцией, известной как ELFPack в подпольной культуре моддинга. Формат файла ELF также используется с архитектурами микроконтроллеров Atmel AVR (8-бит), AVR32 и Texas Instruments MSP430. Некоторые реализации Open Firmware также могут загружать файлы ELF, в первую очередь реализация Apple, используемая почти во всех машинах PowerPC, производимых компанией.
Дополнения Linux Standard Base (LSB) некоторые из вышеперечисленных спецификаций для архитектур, в которых он указан. Например, это относится к System V ABI, AMD64 Supplement.
86open был проектом по формированию консенсуса по общему формату двоичного файла для Unix и Unix-like операционные системы на общей совместимой с ПК x86 архитектуре, чтобы побудить разработчиков программного обеспечения к переносу к архитектуре. Первоначальная идея заключалась в том, чтобы стандартизировать небольшое подмножество Spec 1170, предшественника Single UNIX Specification, и библиотеки GNU C (glibc), чтобы немодифицированные двоичные файлы могли работать в Unix-подобных операционных системах x86.. Первоначально проект получил обозначение «Спец 150».
В итоге был выбран формат ELF, в частности, реализация ELF в Linux, после того, как он оказался стандартом де-факто, поддерживаемым всеми вовлеченными поставщиками и операционными системами.
Группа начала обсуждение по электронной почте в 1997 году и впервые встретилась вместе в офисе Операции в Санта-Крус 22 августа 1997 года.
Руководящим комитетом был Марк Юинг., Дион Джонсон, Эван Лейбович, Брюс Перенс, Эндрю Роуч, Брайан Уэйн Спаркс и Линус Торвальдс. Другими участниками проекта были Кит Бостик, Чак Крэнор, Майкл Дэвидсон, Крис Дж. Деметриу, Ульрих Дреппер, Дон Даггер, Стив Гинзбург, Джон «сумасшедший» Холл, Рон Холт, Джордан Хаббард, Дэйв Дженсен, Кин Джонстон, Эндрю Джози, Роберт Липе, Бела Лубкин, Тим Марсленд, Грег Пейдж, Рональд Джо Рекорд, Тим Ракл, Джоэл Сильверстайн, Чиа-пи Тьен и Эрик Троан. Представленные операционные системы и компании: BeOS, BSDI, FreeBSD, Intel, Linux, NetBSD., SCO и SunSoft.
Проект продолжался, и в середине 1998 года SCO приступила к разработке lxrun, уровня совместимости с открытым исходным кодом может запускать двоичные файлы Linux на OpenServer, UnixWare и Solaris. SCO объявила об официальной поддержке lxrun на LinuxWorld в марте 1999 года. Sun Microsystems начала официально поддерживать lxrun для Solaris в начале 1999 года, а затем перешла на интегрированную поддержку двоичного формата Linux через Контейнеры Solaris для приложений Linux.
Поскольку BSD уже давно поддерживают двоичные файлы Linux (через уровень совместимости ), а основные поставщики Unix x86 добавили поддержку этого формата, проект решил, что Linux ELF был формат, выбранный отраслью, и «объявить [d] сам распущенный» 25 июля 1999 года.
FatELF - это расширение двоичного формата ELF, которое добавляет толстые двоичные возможности. Он предназначен для Linux и других Unix-подобных операционных систем. Помимо абстракции архитектуры ЦП (порядок байтов, размер слова, CPU набор команд и т. Д.), Существует потенциальное преимущество абстракция программной платформы, например двоичные файлы, которые поддерживают несколько версий ядра ABI. По состоянию на 25 апреля 2020 года FatELF не был интегрирован в основное ядро Linux.
| journal =
()