Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
У файла ELF есть два представления: заголовок программы показывает сегменты, используемые во время выполнения, тогда как заголовок раздела перечисляет набор разделов двоичного файла .

В вычислении , то формат исполняемых и Linkable ( ELF , ранее названный Extensible Linking Format ), является общим стандартом формат файла для исполняемых файлов, объектного кода , разделяемых библиотек , а также основных свалках . Впервые опубликованный в спецификации для бинарного интерфейса приложения (ABI) версии операционной системы Unix , названной System V Release 4 (SVR4), [2] и позже в Стандарте интерфейса инструментов [1], он был быстро принят среди различных поставщиков Unixсистемы. В 1999 году он был выбран в качестве стандартного формата двоичных файлов для Unix и Unix-подобных систем на процессорах x86 проектом 86open .

По своей конструкции формат ELF является гибким, расширяемым и кроссплатформенным . Например, он поддерживает разные порядки следования байтов и размеры адресов, поэтому он не исключает какой-либо конкретный центральный процессор (ЦП) или архитектуру набора команд . Это позволило использовать его во многих операционных системах на различных аппаратных платформах .

Макет файла [ править ]

Каждый файл 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 [3]

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

Заголовок 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использует библиотеку дескрипторов двоичных файлов в качестве серверной части для структурирования данных ELF.
  • fileУтилита Unix может отображать некоторую информацию о файлах ELF, включая архитектуру набора инструкций, для которой предназначен код в перемещаемом, исполняемом или совместно используемом объектном файле или на котором был создан дамп ядра ELF .

Приложения [ править ]

Unix-подобные системы [ править ]

Формат ELF заменил старые исполняемые форматы в различных средах. Он заменил форматы a.out и COFF в Unix-подобных операционных системах:

  • Linux
  • Solaris / Illumos
  • IRIX
  • FreeBSD [11]
  • NetBSD
  • OpenBSD
  • Редокс
  • DragonFly BSD
  • Слог
  • HP-UX (за исключением 32-разрядных программ PA-RISC, которые продолжают использовать SOM )
  • QNX Neutrino
  • МИНИКС [12]

Принятие не-Unix [ править ]

ELF также получил некоторое распространение в операционных системах, отличных от Unix, таких как:

  • OpenVMS в версиях Itanium и amd64 [13]
  • BeOS Revision 4 и более поздние версии для компьютеров на базе x86 (где он заменил формат Portable Executable ; версия PowerPC осталась с Preferred Executable Format )
  • Haiku , повторная реализация BeOS с открытым исходным кодом
  • ОС RISC [14]
  • Stratus VOS , в версиях PA-RISC и x86
  • Юбилейное обновление Windows 10 с использованием подсистемы Windows для Linux . [15] [16]
  • SkyOS
  • Фуксия ОС
  • Z / TPF
  • ОС HPE NonStop [17]
  • Деос

Игровые консоли [ править ]

Некоторые игровые консоли также используют ELF:

  • PlayStation Portable , [18] PlayStation Vita , PlayStation 2 , PlayStation 3 , PlayStation 4
  • GP2X
  • Dreamcast
  • Gamecube
  • Wii
  • Wii U

PowerPC [ править ]

Другие (операционные) системы, работающие на PowerPC , использующие ELF:

  • AmigaOS 4 , исполняемый файл ELF, заменил предыдущий Extended Hunk Format (EHF), который использовался на Amigas, оснащенных платами расширения процессора PPC.
  • MorphOS
  • AROS

Мобильные телефоны [ править ]

Некоторые операционные системы для мобильных телефонов и мобильных устройств используют ELF:

  • Symbian OS v9 использует формат E32Image [19] , основанный на формате файла ELF;
  • Sony Ericsson , например, W800i , W610 , W300 и т. Д.
  • Siemens , платформы SGOLD и SGOLD2: от Siemens C65 до S75 и BenQ-Siemens E71 / EL71 ;
  • Motorola , например, E398, SLVR L7 , v360, v3i (и все телефоны LTE2, к которым применен патч).
  • Bada , например, Samsung Wave S8500 .
  • Телефоны или планшеты Nokia с ОС Maemo или Meego, например Nokia N900 .
  • Android использует библиотеки ELF .so (общий объект [20] ) для собственного интерфейса Java . В среде выполнения Android (ART), которая используется по умолчанию с Android 5.0 «Lollipop» , все приложения при установке компилируются в собственные двоичные файлы ELF.

Некоторые телефоны могут запускать файлы ELF с помощью патча, который добавляет код сборки в основную прошивку , что является функцией, известной как ELFPack в культуре подпольного моддинга . Формат файла ELF также используется в архитектурах микроконтроллеров Atmel AVR (8-бит), AVR32 [21] и Texas Instruments MSP430 . Некоторые реализации Open Firmware также могут загружать файлы ELF, в первую очередь реализация Apple , используемая почти во всех машинах PowerPC, производимых компанией.

Технические характеристики [ править ]

  • Общий:
    • Двоичный интерфейс приложений System V, версия 4.1 (18 марта 1997 г.)
    • Обновление System V ABI (октябрь 2009 г.)
  • AMD64 :
    • Система V ABI, приложение AMD64
  • ARM :
    • ELF для архитектуры ARM
  • IA-32 :
    • System V ABI, Дополнение к архитектуре Intel386 для процессоров
  • IA-64 :
    • Соглашения по программному обеспечению Itanium и руководство по времени выполнения (сентябрь 2000 г.)
  • M32R :
    • M32R ELF ABI Supplement Version 1.2 (2004-08-26)
  • MIPS :
    • System V ABI, Дополнение к процессору MIPS RISC
    • Документация MIPS EABI (11.06.2003)
  • Motorola 6800 :
    • Motorola 8- и 16-битный встроенный ABI
  • PA-RISC :
    • Дополнение ELF для PA-RISC версии 1.43 (6 октября 1997 г.)
  • PowerPC :
    • Система V ABI, Дополнение к PPC
    • 32- разрядная реализация двоичного интерфейса встроенного приложения PowerPC (01.10.1995)
    • 64-битное приложение к бинарному интерфейсу приложения PowerPC ELF, версия 1.9 (2004)
  • SPARC :
    • Система V ABI, Дополнение к SPARC
  • S / 390 :
    • S / 390 32-битное приложение ELF ABI
  • zСерия :
    • zSeries 64bit ELF ABI Supplement
  • Symbian OS 9:
    • Формат файла E32Image в Symbian OS 9

Standard Base Linux (LSB) дополняет некоторые из вышеупомянутых спецификаций для архитектур , в которых он указан. [22] Например, это относится к System V ABI, AMD64 Supplement. [23] [24]

86open [ править ]

86open был проектом по формированию консенсуса по общему формату двоичного файла для Unix и Unix-подобных операционных систем на общей архитектуре x86, совместимой с ПК , чтобы побудить разработчиков программного обеспечения перейти на эту архитектуру. [25] Первоначальная идея заключалась в том, чтобы стандартизировать небольшое подмножество 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 года [26], а позже перешла на интегрированную поддержку двоичного формата Linux через контейнеры Solaris для приложений Linux .

Поскольку BSD долгое время поддерживали двоичные файлы Linux (через уровень совместимости ), а основные поставщики x86 Unix добавили поддержку этого формата, проект решил, что Linux ELF был форматом, выбранным отраслью, и «объявил [d] сам распущенный» на 25 июля 1999 г. [27]

FatELF: универсальные двоичные файлы для Linux [ править ]

FatELF - это расширение двоичного формата ELF, которое добавляет толстые двоичные возможности. [28] Он предназначен для Linux и других Unix-подобных операционных систем. В дополнение к абстракции архитектуры ЦП ( порядок байтов , размер слова , набор команд ЦП и т. Д.) Существует потенциальное преимущество абстракции программной платформы, например двоичные файлы, которые поддерживают несколько версий ядра ABI . По состоянию на 2 марта 2021 года FatELF не интегрирован в основное ядро ​​Linux. [29] [30] [31]

См. Также [ править ]

  • Бинарный интерфейс приложения
  • Сравнение форматов исполняемых файлов
  • DWARF  - формат для отладки данных
  • Стандарт двоичной совместимости Intel
  • Portable Executable  - формат, используемый Windows
  • vDSO  - виртуальный DSO
  • Позиционно-независимый код

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

  1. ^ a b Стандарт интерфейса инструментов (TIS), исполняемый файл и формат связывания (ELF), версия 1.2 (май 1995 г.)
  2. ^ System V Application Binary Interface Edition 4.1 (18 марта 1997 г.)
  3. ^ "Доступные лексеры - Пигменты" . pygments.org .
  4. ^ "Заголовок ELF" . Sco.com. Июль 2000 . Проверено 7 февраля 2014 .
  5. ^ "LXR linux / include / linux / elf.h" . linux.no . Проверено 27 апреля 2015 года .
  6. ^ "glibc 2.12 анонс" .
  7. ^ "sourceware.org Git - glibc.git / blob - libc-abis" .
  8. ^ "sourceware.org Git - glibc.git / blob - sysdeps / gnu / ldsodefs.h" .
  9. ^ «Заголовок программы» . Sco.com. Июль 2000 . Проверено 5 апреля 2017 .
  10. ^ "elfutils" . sourceware.org . Проверено 30 апреля 2017 года .
  11. ^ «Двоичные форматы» .
  12. ^ "MinixReleases - Minix Wiki" . Wiki.minix3.org. Архивировано из оригинала на 2013-03-30 . Проверено 19 января 2014 .
  13. ^ https://vmssoftware.com/pdfs/State_of_Port_20160906.pdf
  14. ^ "GCCSDK - ОС RISC" . Riscos.info. 2012-04-22 . Проверено 19 января 2014 .
  15. ^ «Объявление о выпуске Windows 10 Insider Preview Build 14316» . Блог Windows Experience . 2016-04-06 . Проверено 10 апреля 2016 .
  16. ^ Фоли, Мэри Джо. «Под капотом подсистемы Microsoft Windows для Linux | ZDNet» . ZDNet . Проверено 19 августа 2016 .
  17. ^ "Руководство программиста Guardian" (PDF) . Hewlett Packard Enterprise. Архивировано из оригинального (PDF) 30 мая 2018 года . Проверено 30 мая 2018 . п. 44 архивировано из оригинала на 2018-5-30
  18. ^ PlayStation Portable использует зашифрованный и перемещенный файл ELF: PSP
  19. ^ Формат исполняемого файла ОС Symbian
  20. ^ Розен, Кеннет; Ведущий, Дуглас; Клее, Рэйчел; Розински, Ричард (2007). UNIX: Полный справочник (2-е изд.). McGraw Hill Professional. п. 707. ISBN. 9780071706988. Проверено 8 июня 2017 . Динамически подключаемые библиотеки также называются общими объектами (.so).
  21. ^ «Глава 4: Объектные файлы» , Двоичный интерфейс приложения System V , 2009-10-26, e_machine
  22. ^ «Спецификации, на которые ссылаются LSB» . linuxfoundation.org . Проверено 27 апреля 2015 года .
  23. ^ «Исполняемый и связывающий формат (ELF)» . linuxfoundation.org . Проверено 27 апреля 2015 года .
  24. ^ «Введение» . linuxfoundation.org . Проверено 27 апреля 2015 года .
  25. ^ Лейбович, Evan (1997-12-23). «86Открытые часто задаваемые вопросы» . Архивировано из оригинала на 2007-03-11 . Проверено 6 июня 2007 .
  26. ^ Запись, Рональд (1998-05-21). «Бюллетень о статусе 86open в ШОС» . Архивировано из оригинала на 2008-12-08 . Проверено 6 мая 2008 .
  27. ^ Лейбович, Evan (1999-07-25). «Проект The86open - Финальное обновление» . Архивировано из оригинала на 2007-02-27 . Проверено 6 мая 2007 .
  28. ^ Гордон, Райан. "Fatelf-спецификация v1" . icculus.org . Проверено 25 июля 2010 .
  29. ^ Гордон, Райан. «FatELF: Оказывается, мне больше нравилась неопределенность» . icculus.org . Проверено 13 июля 2010 .
  30. ^ Holwerda, Том (2009-11-03). «Райан Гордон останавливает проект FatELF» . osnews.com . Проверено 5 июля 2010 .
  31. ^ Brockmeier, Джо (23 июня 2010). «СЕБЯ: Анатомия (предполагаемой) неудачи» . Еженедельные новости Linux . Проверено 6 февраля 2011 .

Дальнейшее чтение [ править ]

  • Левин, Джон Р. (2000) [октябрь 1999]. Линкеры и загрузчики . Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0. OCLC  42413382 . Архивировано 05 декабря 2012 года . Проверено 12 января 2020 .Код: [1] [2] Ошибки: [3]
  • Дреппер, Ульрих ( 20 августа 2006 г. ). «Как писать общие библиотеки» (PDF) . 4.0 . Проверено 20 июня 2007 . Цитировать журнал требует |journal=( помощь )
  • Незаметный герой: трудолюбивый ELF Питера Зеебаха, 20 декабря 2005 г., архивировано с оригинала 24 февраля 2007 г.
  • LibElf и GElf - Библиотека для управления файлами ELf на Wayback Machine (архив 25 февраля 2004 г.)
  • Формат объектного файла ELF от Dissection Эрика Янгдейла (1995-05-01)
  • Учебник Whirlwind по созданию действительно крохотных исполняемых файлов ELF для Linux от Брайана Райтера
  • Перенос ELF в неперемещаемые объекты , Жюльен Ванег (13-08-2003)
  • Встроенная отладка ELF без ptrace командой ELFsh (2005-08-01)
  • Исследование загрузки и релокации в формате ELF , Пэт Бейрн (1999-08-03)

Внешние ссылки [ править ]

  • Справочник FreeBSD: Двоичные форматы (заархивированная версия)
  • Страница справочника FreeBSD elf (5)
  • NetBSD ELF FAQ
  • Страница справочника Linux elf (5)
  • Руководство по компоновщику и библиотекам Oracle Solaris
  • Проект ERESI: реверс-инжиниринг операционных систем на базе ELF
  • Linux Today статья от 86открыта 26 июля 1999 г.
  • Объявление 86open в списке рассылки Debian Announce 10 октября 1997 г., Брюс Перенс
  • Заявление Ульриха Дреппера (PDF) в документе «Группа SCO против IBM» , 19 сентября 2006 г.
  • 86open и обсуждение ELF на Groklaw , 13 августа 2006 г.