По своей конструкции формат ELF является гибким, расширяемым и кроссплатформенным . Например, он поддерживает различные порядки байтов и размеры адресов, поэтому не исключает какую-либо конкретную архитектуру ЦП или набора инструкций . Это позволило принять его во многих различных операционных системах на многих различных аппаратных платформах .
Расположение файла
Каждый файл ELF состоит из одного заголовка ELF, за которым следуют данные файла. Данные могут включать:
Таблица заголовков программ, описывающая ноль или более сегментов памяти
Таблица заголовков разделов, описывающая ноль или более разделов
Данные, на которые ссылаются записи в таблице заголовков программ или таблице заголовков разделов
Заголовок ELF определяет, использовать ли 32-битные или 64-битные адреса. Заголовок содержит три поля, на которые влияет эта настройка, и смещает другие поля, которые следуют за ними. Заголовок ELF имеет длину 52 или 64 байта для 32-битных и 64-битных двоичных файлов соответственно.
Заголовок программы
Таблица заголовков программы сообщает системе, как создать образ процесса. Она находится по смещению файла e_phoff и состоит из записей e_phnum , каждая размером e_phentsize . Макет немного отличается в 32-битном ELF по сравнению с 64-битным ELF, поскольку p_flags находятся в другом месте структуры для выравнивания. Каждая запись структурирована следующим образом:
Заголовок раздела
Инструменты
readelf— это двоичная утилита Unix, которая отображает информацию об одном или нескольких файлах ELF. Свободная программная реализация предоставляется GNU Binutils .
elfutilsпредоставляет альтернативные инструменты GNU Binutils исключительно для Linux. [10]
elfdump— команда для просмотра ELF-информации в ELF-файле, доступная в Solaris и FreeBSD .
objdumpпредоставляет широкий спектр информации о файлах ELF и других форматах объектов. objdumpиспользует библиотеку Binary File Descriptor в качестве внутреннего инструмента для структурирования данных ELF.
Утилита Unix fileможет отображать некоторую информацию о файлах ELF, включая архитектуру набора инструкций , для которой предназначен код в перемещаемом, исполняемом или общем объектном файле или на основе которого был создан дамп ядра ELF.
Приложения
Unix-подобные системы
Формат ELF заменил старые исполняемые форматы в различных средах. Он заменил форматы a.out и COFF в Unix-подобных операционных системах:
Другие (операционные) системы, работающие на PowerPC , которые используют ELF:
В AmigaOS 4 исполняемый файл ELF заменил предыдущий формат Extended Hunk Format (EHF), который использовался на компьютерах Amiga, оснащенных платами расширения процессора PPC.
Android использует библиотеки ELF .so (shared object [19] ) для Java Native Interface . [ требуется ссылка ] С Android Runtime (ART), используемым по умолчанию с Android 5.0 «Lollipop» , все приложения компилируются в собственные двоичные файлы ELF при установке. [20] Также можно использовать собственное программное обеспечение Linux из менеджеров пакетов, таких как Termux, или компилировать их из исходников через Clang или GCC, которые доступны в репозиториях.
Некоторые телефоны могут запускать файлы ELF с помощью патча , который добавляет код сборки к основной прошивке , что является функцией, известной как ELFPack в культуре андеграундного моддинга . Формат файла ELF также используется с архитектурами микроконтроллеров Atmel AVR (8-бит), AVR32 [21]
и Texas Instruments MSP430 . Некоторые реализации Open Firmware также могут загружать файлы ELF, в частности, реализация Apple , используемая почти во всех машинах PowerPC , производимых компанией.
Блокчейн-платформы
Solana использует формат ELF для своих on-chain программ ( смарт-контрактов ). Платформа обрабатывает файлы ELF, скомпилированные в байт-код BPF ( Berkeley Packet Filter ), которые затем развертываются как общие объекты и выполняются в среде выполнения Solana. Загрузчик BPF проверяет и обрабатывает эти файлы ELF во время развертывания программы. [22]
Технические характеристики
Общий:
System V Application Binary Interface Edition 4.1 (1997-03-18)
Linux Standard Base (LSB) дополняет некоторые из вышеперечисленных спецификаций для архитектур, в которых она указана. [23] Например, это касается System V ABI, AMD64 Supplement. [24] [25]
86открыто
86open был проектом по формированию консенсуса по общему двоичному формату файлов для Unix и Unix-подобных операционных систем на общей PC-совместимой архитектуре x86 , чтобы побудить разработчиков программного обеспечения портировать на эту архитектуру. [26] Первоначальная идея состояла в том, чтобы стандартизировать небольшое подмножество Spec 1170, предшественника Single UNIX Specification , и GNU C Library (glibc), чтобы позволить немодифицированным двоичным файлам работать на x86 Unix-подобных операционных системах. Первоначально проект назывался «Spec 150».
В конечном итоге был выбран формат ELF, а точнее реализация ELF для Linux, после того как он стал фактическим стандартом, поддерживаемым всеми вовлеченными поставщиками и операционными системами.
Группа начала проводить обсуждения по электронной почте в 1997 году и впервые встретилась в офисе Santa Cruz Operation 22 августа 1997 года.
Руководящий комитет состоял из Марка Юинга , Диона Джонсона, Эвана Лейбовича, Брюса Перенса , Эндрю Роуча, Брайана Уэйна Спаркса и Линуса Торвальдса . Другими людьми, принимавшими участие в проекте, были Кейт Бостик , Чак Крейнор, Майкл Дэвидсон, Крис Г. Деметриу, Ульрих Дреппер, Дон Даггер, Стив Гинзбург, Джон «maddog» Холл , Рон Холт, Джордан Хаббард , Дэйв Дженсен, Кин Джонстон, Эндрю Джози, Роберт Липе, Бела Лабкин, Тим Марсланд, Грег Пейдж, Рональд Джо Рекорд, Тим Ракл, Джоэл Сильверстайн, Чиа-пи Тиен и Эрик Троан. Были представлены следующие операционные системы и компании: BeOS , BSDI , FreeBSD , Intel , Linux , NetBSD , SCO и SunSoft .
Проект развивался, и в середине 1998 года SCO начала разрабатывать lxrun — слой совместимости с открытым исходным кодом, способный запускать двоичные файлы Linux на OpenServer , UnixWare и Solaris . SCO объявила об официальной поддержке lxrun на LinuxWorld в марте 1999 года. Sun Microsystems начала официально поддерживать lxrun для Solaris в начале 1999 года [27] , а затем перешла к интегрированной поддержке двоичного формата Linux через Solaris Containers for Linux Applications .
Поскольку BSD уже давно поддерживают двоичные файлы Linux (через уровень совместимости ), а основные поставщики x86 Unix добавили поддержку формата, проект решил, что Linux ELF — это формат, выбранный отраслью, и «объявил о своем роспуске» 25 июля 1999 года. [28]
FatELF: универсальные двоичные файлы для Linux
FatELF — это расширение двоичного формата ELF, которое добавляет возможности двоичного формата fat . [29] Он предназначен для Linux и других Unix-подобных операционных систем. Помимо абстракции архитектуры ЦП ( порядок байтов , размер слова , набор инструкций ЦП и т. д.), существует потенциальное преимущество абстракции программной платформы, например, двоичные файлы, которые поддерживают несколько версий ABI ядра . По состоянию на 2021 год FatELF не был интегрирован в основное ядро Linux. [30] [31] [32][обновлять]
^ Фоли, Мэри Джо. «Под капотом подсистемы Windows от Microsoft для Linux». ZDNet . Получено 19 августа 2016 г.
^ PlayStation Portable использует зашифрованный и перемещенный ELF: PSP
^ Формат исполняемого файла ОС Symbian
^ Розен, Кеннет; Хост, Дуглас; Клее, Рэйчел; Росински, Ричард (2007). UNIX: Полный справочник (2-е изд.). McGraw Hill Professional. стр. 707. ISBN9780071706988. Получено 2017-06-08 . Динамически подключаемые библиотеки также называются разделяемыми объектами (.so).
^ Томас, Ромен. "Форматы Android". Quarks Lab . Архивировано из оригинала 16 февраля 2023 г. Получено 17 января 2023 г.
^ "Глава 4: Объектные файлы", System V Application Binary Interface , 2009-10-26, e_machine
^ "Solana Programs". Solana Foundation. 2024-11-11 . Получено 2024-11-11 . Solana использует инфраструктуру компилятора LLVM для компиляции программ в файлы Executable and Linkable Format (ELF).
^ "LSB Referenced Specifications". linuxfoundation.org . Получено 27 апреля 2015 г. .
^ "Executable and Linking Format (ELF)". linuxfoundation.org . Получено 27 апреля 2015 г. .
^ "Введение". linuxfoundation.org . Получено 27 апреля 2015 г. .
^ Гордон, Райан. "FatELF: Оказывается, мне больше понравилась неопределенность". icculus.org . Получено 13 июля 2010 г.
^ Холверда, Том (3 ноября 2009 г.). «Райан Гордон останавливает проект FatELF» . osnews.com . Проверено 5 июля 2010 г.
^ Брокмейер, Джо (23 июня 2010 г.). "SELF: Анатомия (предполагаемой) неудачи". Linux Weekly News . Получено 2011-02-06 .
Дальнейшее чтение
Левин, Джон Р. (2000) [октябрь 1999]. Линкеры и загрузчики. Серия Моргана Кауфмана по программной инженерии и программированию (1-е изд.). Сан-Франциско, США: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382. Архивировано из оригинала 2012-12-05 . Получено 2020-01-12 .Код: [1][2] Опечатки: [3]
Ульрих Дреппер, Как писать общие библиотеки, версия 4.1.2 (2011). Опубликовано на веб-странице автора, https://www.akkadia.org/drepper.
Невоспетый герой: трудолюбивый эльф Питера Зеебаха, 20 декабря 2005 г., архивировано из оригинала 24 февраля 2007 г.
LibElf и GElf – библиотека для работы с файлами ELf на Wayback Machine (архивировано 25 февраля 2004 г.)