Стандартный формат файла для исполняемых файлов, объектного кода, общих библиотек и дампов ядра.
Файл ELF имеет два представления: заголовок программы показывает сегменты , используемые во время выполнения, тогда как заголовок раздела перечисляет набор разделов .
Пример шестнадцатеричного дампа заголовка файла ELF [4]
Заголовок файла
Заголовок 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. [11]
elfdump— это команда для просмотра информации ELF в файле ELF, доступная в Solaris и FreeBSD .
objdumpпредоставляет широкий спектр информации о файлах ELF и других форматах объектов. objdumpиспользует библиотеку дескрипторов двоичных файлов в качестве серверной части для структурирования данных ELF.
Утилита Unix fileможет отображать некоторую информацию о файлах ELF, включая архитектуру набора команд , для которой предназначен код в перемещаемом, исполняемом или общем объектном файле или для которого был создан дамп ядра ELF.
Приложения
Unix-подобные системы
Формат ELF заменил старые исполняемые форматы в различных средах. Он заменил форматы a.out и COFF в Unix-подобных операционных системах:
Другие (операционные) системы, работающие на PowerPC и использующие ELF:
AmigaOS 4 , исполняемый файл ELF заменил предыдущий формат Extended Hunk Format (EHF), который использовался на Amigas, оснащенных картами расширения процессора PPC.
Android использует библиотеки ELF .so (общий объект [20] ) для собственного интерфейса Java . [ нужна цитация ] С помощью Android Runtime (ART), используемого по умолчанию, начиная с Android 5.0 «Lollipop» , все приложения при установке компилируются в собственные двоичные файлы ELF. [21] Также можно использовать собственное программное обеспечение Linux из менеджеров пакетов, таких как Termux, или скомпилировать их из исходников через Clang или GCC, которые также доступны в репозиториях.
Некоторые телефоны могут запускать файлы ELF с помощью патча , который добавляет ассемблерный код в основную прошивку , что является функцией, известной как ELFPack в подпольной культуре моддинга . Формат файла ELF также используется с микроконтроллерами Atmel AVR (8-бит), AVR32 [22]
и Texas Instruments MSP430 . Некоторые реализации открытой прошивки также могут загружать файлы ELF, в первую очередь реализация Apple, используемая почти во всех машинах PowerPC , производимых компанией.
Технические характеристики
Общий:
Двоичный интерфейс приложения System V, версия 4.1 (18 марта 1997 г.)
Стандартная база Linux (LSB) дополняет некоторые из приведенных выше спецификаций для архитектур, в которых она указана. [23] Например, так обстоит дело с дополнением System V ABI, AMD64. [24] [25]
86открыть
86open был проектом по формированию консенсуса относительно общего формата двоичных файлов для Unix и Unix-подобных операционных систем на общей архитектуре x86 , совместимой с ПК , чтобы побудить разработчиков программного обеспечения перейти на эту архитектуру. [26] Первоначальная идея заключалась в стандартизации небольшого подмножества Spec 1170, предшественника Единой спецификации UNIX , и библиотеки GNU C (glibc), чтобы обеспечить возможность запуска немодифицированных двоичных файлов в Unix-подобных операционных системах x86. Первоначально проект получил обозначение «Spec 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 года [27] , а позже перешла на интегрированную поддержку двоичного формата Linux через контейнеры Solaris для приложений Linux .
Поскольку BSD уже давно поддерживают двоичные файлы Linux (через уровень совместимости ), а основные поставщики x86 Unix добавили поддержку этого формата, проект решил, что Linux ELF — это формат, выбранный отраслью, и «объявил [d] о своем распаде» 25 июля 1999 г. [28]
FatELF: универсальные двоичные файлы для Linux
FatELF — это расширение двоичного формата ELF, которое добавляет возможности «толстого» двоичного кода . [29] Он предназначен для Linux и других Unix-подобных операционных систем. В дополнение к абстракции архитектуры ЦП ( порядок байтов , размер слова , набор инструкций ЦП и т. д.) существует потенциальное преимущество абстракции программной платформы, например двоичные файлы, которые поддерживают несколько версий ABI ядра . По состоянию на 2021 год FatELF не интегрирован в основное ядро Linux. [30] [31] [32][обновлять]
^ «sourceware.org Git — glibc.git/blob — sysdeps/gnu/ldsodefs.h». Архивировано из оригинала 07 марта 2021 г. Проверено 28 октября 2019 г.
^ «Заголовок программы». Sco.com. Июль 2000 года . Проверено 05 апреля 2017 г.
Ссылки _ исходное программное обеспечение.org . Проверено 30 апреля 2017 г. .
^ «Двоичные форматы». Архивировано из оригинала 31 марта 2019 г. Проверено 31 марта 2019 г.
^ "MinixReleases - Minix Wiki" . Wiki.minix3.org. Архивировано из оригинала 30 марта 2013 г. Проверено 19 января 2014 г.
^ «Архивная копия» (PDF) . Архивировано из оригинала (PDF) 15 сентября 2020 г. Проверено 19 октября 2016 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
^ "GCCSDK - ОС RISC" . Рискос.инфо. 22 апреля 2012 г. Проверено 19 января 2014 г.
^ «Руководство программиста Guardian» (PDF) . Хьюлетт Паккард Энтерпрайз. Архивировано из оригинала (PDF) 30 мая 2018 г. Проверено 30 мая 2018 г.п. 44. Архивировано из оригинала. Архивировано 30 мая 2018 г. на Wayback Machine 30 мая 2018 г.
^ Фоли, Мэри Джо. «Под капотом подсистемы Microsoft Windows для Linux | ZDNet». ЗДНет . Проверено 19 августа 2016 г.
^ PlayStation Portable использует зашифрованный и перемещенный ELF: PSP
^ Формат исполняемого файла ОС Symbian.
^ Розен, Кеннет; Ведущий, Дуглас; Клее, Рэйчел; Росински, Ричард (2007). UNIX: Полный справочник (2-е изд.). МакГроу Хилл Профессионал. п. 707. ИСБН9780071706988. Проверено 8 июня 2017 г. Динамически подключаемые библиотеки также называются общими объектами (.so).
^ Томас, Ромен. «Форматы Android». Кварковая лаборатория . Архивировано из оригинала 16 февраля 2023 года . Проверено 17 января 2023 г.
^ «Глава 4: Объектные файлы», Двоичный интерфейс приложения System V , 26 октября 2009 г., e_machine
^ «Спецификации, ссылающиеся на LSB» . linuxfoundation.org . Проверено 27 апреля 2015 г.
^ «Формат исполняемых файлов и ссылок (ELF)» . linuxfoundation.org . Проверено 27 апреля 2015 г.
^ «Введение». linuxfoundation.org . Проверено 27 апреля 2015 г.
^ Лейбович, Эван (23 декабря 1997 г.). «86Открытые часто задаваемые вопросы». Архивировано из оригинала 11 марта 2007 г. Проверено 6 июня 2007 г.
^ Запись, Рональд (21 мая 1998 г.). «Бюллетень о статусе открытия в ШОС». Архивировано из оригинала 8 декабря 2008 г. Проверено 6 мая 2008 г.
^ Лейбович, Эван (25 июля 1999 г.). «Проект The86open – финальное обновление». Архивировано из оригинала 27 февраля 2007 г. Проверено 6 мая 2007 г.
^ Гордон, Райан. "Fatelf-спецификация v1". icculus.org . Проверено 25 июля 2010 г.
^ Гордон, Райан. «FatELF: Оказывается, неопределенность мне нравилась больше». icculus.org . Проверено 13 июля 2010 г.
^ Холверда, Том (3 ноября 2009 г.). «Райан Гордон останавливает проект FatELF» . osnews.com . Проверено 5 июля 2010 г.
↑ Брокмайер, Джо (23 июня 2010 г.). «САМ: Анатомия (предполагаемой) неудачи». Еженедельные новости Linux . Проверено 6 февраля 2011 г.
дальнейшее чтение
Левин, Джон Р. (2000) [октябрь 1999 г.]. Линкеры и загрузчики. Серия Моргана Кауфмана по разработке программного обеспечения и программированию (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0. OCLC 42413382. Архивировано из оригинала 5 декабря 2012 г. Проверено 12 января 2020 г.Код: [1][2] Ошибки: [3]
Дреппер, Ульрих (20 августа 2006 г.). «Как писать общие библиотеки» (PDF) . 4.0 . Проверено 20 июня 2007 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
Невоспетый герой: трудолюбивый ЭЛЬФ Питера Сибаха, 20 декабря 2005 г., заархивировано из оригинала 24 февраля 2007 г.
LibElf и GElf — библиотека для управления файлами ELf на Wayback Machine (архивировано 25 февраля 2004 г.)