Исполняемый и связываемый формат - Executable and Linkable Format

ELF
Расширение имени файла
никто, .axf, .bin, .elf, .o, .prx, .puff, .ko, .mod и .так
Магическое число0x7F 'E' L 'F'
РазработанЛаборатории Unix System[1]:3
Тип форматаДвоичный, исполняемый файл, объект, общая библиотека, дамп ядра
Контейнер дляМножество исполняемых двоичных форматов
Файл ELF имеет два представления: заголовок программы показывает сегменты используется во время выполнения, тогда как в заголовке раздела перечислен набор разделы двоичного файла.

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

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

Макет файла

Каждый файл 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-битных двоичных файлов соответственно.

Заголовок ELF[4]
КомпенсироватьРазмер (байты)ПолеЦель
32-битный64-битный32-битный64-битный
0x004e_ident [EI_MAG0] через e_ident [EI_MAG3]0x7F с последующим ELF(45 4c 46) в ASCII; эти четыре байта составляют магическое число.
0x041e_ident [EI_CLASS]Этот байт установлен в 1 или же 2 для обозначения 32- или 64-битного формата соответственно.
0x051e_ident [EI_DATA]Этот байт установлен в 1 или же 2 означать маленький или большой порядок байтов, соответственно. Это влияет на интерпретацию многобайтовых полей, начинающихся со смещения. 0x10.
0x061e_ident [EI_VERSION]Установлен в 1 для исходной и текущей версии ELF.
0x071e_ident [EI_OSABI]Определяет целевую операционную систему ABI.
ЦенитьABI
0x00Система V
0x01HP-UX
0x02NetBSD
0x03Linux
0x04GNU Hurd
0x06Солярис
0x07AIX
0x08IRIX
0x09FreeBSD
0x0ATru64
0x0BNovell Modesto
0x0COpenBSD
0x0DOpenVMS
0x0EЯдро NonStop
0x0FAROS
0x10ОС Феникс
0x11CloudABI
0x12Stratus Technologies OpenVOS

Часто устанавливается на 0 независимо от целевой платформы.[нужна цитата ]

0x081e_ident [EI_ABIVERSION]Далее указывает версию ABI. Его интерпретация зависит от целевого ABI. Ядро Linux (по крайней мере после 2.6) не имеет его определения,[5] поэтому он игнорируется для статически связанных исполняемых файлов. В этом случае смещение и размер EI_PAD равны 8.

glibc 2.12+ в случае e_ident [EI_OSABI] == 3 обрабатывает это поле как версию ABI динамический компоновщик:[6] он определяет список функций динамического компоновщика,[7] лечит e_ident [EI_ABIVERSION] в качестве уровня функции, запрашиваемого общим объектом (исполняемой или динамической библиотекой), и отказывается загружать его, если запрашивается неизвестная функция, т.е. e_ident [EI_ABIVERSION] больше, чем самая большая известная особенность.[8]

0x097e_ident [EI_PAD]в настоящее время не используется, следует заполнить нулями.
0x102e_typeОпределяет тип объектного файла.
ЦенитьТип
0x00ET_NONE
0x01ET_REL
0x02ET_EXEC
0x03ET_DYN
0x04ET_CORE
0xFE00ET_LOOS
0xFEFFET_HIOS
0xFF00ET_LOPROC
0xFFFFET_HIPROC
0x122e_machineУказывает цель архитектура набора команд. Вот несколько примеров:
ЦенитьЭТО
0x00Нет специального набора инструкций
0x01AT&T WE 32100
0x02SPARC
0x03x86
0x04Motorola 68000 (M68k)
0x05Motorola 88000 (M88k)
0x06Intel MCU
0x07Intel 80860
0x08MIPS
0x09IBM_System / 370
0x0AMIPS RS3000 Little-endian
0x0B - 0x0DЗарезервировано для использования в будущем
0x0EHewlett-Packard PA-RISC
0x0FЗарезервировано для использования в будущем
0x13Intel 80960
0x14PowerPC
0x15PowerPC (64-битный)
0x16S390, в том числе S390x
0x28РУКА (до ARMv7 / Aarch32)
0x2ASuperH
0x32IA-64
0x3Eamd64
0x8CСемейство TMS320C6000
0xB7ARM 64 бит (ARMv8 / Aarch64)
0xF3RISC-V
0x101WDC 65C816
0x144e_versionУстановлен в 1 для оригинальной версии ELF.
0x1848e_entryЭто адрес памяти входная точка откуда начинается выполнение процесса. Это поле имеет длину 32 или 64 бита в зависимости от формата, определенного ранее.
0x1C0x2048e_phoffУказывает на начало таблицы заголовков программы. Обычно он следует сразу за заголовком файла, делая смещение 0x34 или же 0x40 для 32- и 64-битных исполняемых файлов ELF соответственно.
0x200x2848e_shoffУказывает на начало таблицы заголовков раздела.
0x240x304e_flagsИнтерпретация этого поля зависит от целевой архитектуры.
0x280x342e_ehsizeСодержит размер этого заголовка, обычно 64 байта для 64-битного и 52 байта для 32-битного формата.
0x2A0x362e_phentsizeСодержит размер записи таблицы заголовков программы.
0x2C0x382e_phnumСодержит количество записей в таблице заголовков программы.
0x2E0x3A2e_shentsizeСодержит размер записи таблицы заголовков раздела.
0x300x3C2е_шнумСодержит количество записей в таблице заголовков раздела.
0x320x3E2e_shstrndxСодержит индекс записи таблицы заголовков раздела, содержащей имена разделов.
0x340x40Конец заголовка ELF (размер)

Заголовок программы

Таблица заголовка программы сообщает системе, как создать образ процесса. Он находится по смещению файла e_phoff, и состоит из e_phnum записи, каждая размером e_phentsize. Компоновка немного отличается в 32-битный ELF против 64-битный ELF, потому что p_flags находятся в другом месте конструкции по причинам выравнивания. Каждая запись имеет следующую структуру:

Заголовок программы[9]
КомпенсироватьРазмер (байты)ПолеЦель
32-битный64-битный32-битный64-битный
0x004p_typeОпределяет тип сегмента.
ЦенитьИмяСмысл
0x00000000PT_NULLЗапись в таблице заголовков программы не используется
0x00000001PT_LOADЗагружаемый сегмент
0x00000002PT_DYNAMICИнформация о динамической компоновке
0x00000003PT_INTERPИнформация переводчика
0x00000004PT_NOTEВспомогательная информация
0x00000005PT_SHLIBзарезервированный
0x00000006PT_PHDRсегмент, содержащий саму таблицу заголовков программы
0x00000007PT_TLSШаблон локального хранилища потока
0x60000000PT_LOOSСмотри ниже
0x6FFFFFFFPT_HIOS
0x70000000PT_LOPROC
0x7FFFFFFFPT_HIPROC

PT_LOOS к PT_HIOS (PT_LOPROC к PT_HIPROC) - это включающий зарезервированный диапазон для специфической семантики операционной системы (процессора).

0x044p_flagsСегментно-зависимые флаги (позиция для 64-битной структуры).
0x040x0848p_offsetСмещение сегмента в изображении файла.
0x080x1048p_vaddrВиртуальный адрес сегмента в памяти.
0x0C0x1848p_paddrВ системах, где важен физический адрес, зарезервирован для физического адреса сегмента.
0x100x2048p_fileszРазмер сегмента изображения в байтах. Может быть 0.
0x140x2848p_memszРазмер сегмента в памяти в байтах. Может быть 0.
0x184p_flagsФлаги, зависящие от сегмента (позиция для 32-битной структуры).
0x1C0x3048p_align0 и 1 не указывать выравнивания. В противном случае должна быть положительная целая степень двойки, при этом p_vaddr приравнивание p_offset модуль p_align.
0x200x38Заголовок конца программы (размер)

Заголовок раздела

КомпенсироватьРазмер (байты)ПолеЦель
32-битный64-битный32-битный64-битный
0x004sh_nameСмещение строки в .shstrtab раздел, представляющий имя этого раздела.
0x044sh_typeОпределяет тип этого заголовка.
ЦенитьИмяСмысл
0x0SHT_NULLЗапись в таблице заголовков раздела не используется
0x1SHT_PROGBITSДанные программы
0x2SHT_SYMTABТаблица символов
0x3SHT_STRTABТаблица строк
0x4SHT_RELAЗаписи о перемещении с дополнениями
0x5SHT_HASHХеш-таблица символов
0x6SHT_DYNAMICИнформация о динамической компоновке
0x7SHT_NOTEПримечания
0x8SHT_NOBITSПространство программы без данных (bss)
0x9SHT_RELЗаписи о перемещении, без дополнений
0x0ASHT_SHLIBЗарезервированный
0x0BSHT_DYNSYMТаблица символов динамического компоновщика
0x0ESHT_INIT_ARRAYМассив конструкторов
0x0FSHT_FINI_ARRAYМассив деструкторов
0x10SHT_PREINIT_ARRAYМассив предварительных конструкторов
0x11SHT_GROUPГруппа разделов
0x12SHT_SYMTAB_SHNDXРасширенные указатели разделов
0x13SHT_NUMКоличество определенных типов.
0x60000000SHT_LOOSЗапуск в зависимости от ОС.
.........
0x0848sh_flagsОпределяет атрибуты раздела.
ЦенитьИмяСмысл
0x1SHF_WRITEВозможность записи
0x2SHF_ALLOCЗанимает память во время выполнения
0x4SHF_EXECINSTRИсполняемый
0x10SHF_MERGEМожет быть объединен
0x20SHF_STRINGSСодержит строки с завершающим нулем
0x40SHF_INFO_LINK'sh_info' содержит индекс SHT
0x80SHF_LINK_ORDERСохраните порядок после объединения
0x100SHF_OS_NONCONFORMINGТребуется нестандартная обработка, специфичная для ОС
0x200SHF_GROUPРаздел является членом группы
0x400SHF_TLSРаздел содержит локальные данные потока
0x0ff00000SHF_MASKOSЗависит от ОС
0xf0000000SHF_MASKPROCЗависит от процессора
0x4000000SHF_ORDEREDОсобые требования к заказу (Solaris)
0x8000000SHF_EXCLUDEРаздел исключается, если не указан или не выделен (Solaris)
0x0C0x1048sh_addrВиртуальный адрес раздела в памяти для загружаемых разделов.
0x100x1848sh_offsetСмещение раздела в изображении файла.
0x140x2048sh_sizeРазмер в байтах раздела в образе файла. Может быть 0.
0x180x284sh_linkСодержит индекс раздела связанного раздела. Это поле используется для нескольких целей в зависимости от типа раздела.
0x1C0x2C4sh_infoСодержит дополнительную информацию о разделе. Это поле используется для нескольких целей в зависимости от типа раздела.
0x200x3048sh_addralignСодержит необходимое выравнивание раздела. Это поле должно быть степенью двойки.
0x240x3848sh_entsizeСодержит размер в байтах каждой записи для разделов, содержащих записи фиксированного размера. В противном случае это поле содержит ноль.
0x280x40Конец заголовка раздела (размер)

Инструменты

  • Readelf - это двоичная утилита Unix, которая отображает информацию об одном или нескольких файлах ELF. А бесплатно программное обеспечение реализация обеспечивается GNU Binutils.
  • elfutils предоставляет альтернативные инструменты GNU Binutils чисто для линукса.[10]
  • elfdump - это команда для просмотра информации ELF в файле ELF, доступная в Solaris и FreeBSD.
  • objdump предоставляет широкий спектр информации о файлах ELF и других форматах объектов. objdump использует Библиотека дескрипторов двоичных файлов как серверная часть для структурирования данных ELF.
  • Unix файл утилита может отображать некоторую информацию о файлах ELF, включая архитектура набора команд для которого предназначен код в перемещаемом, исполняемом или совместно используемом объектном файле, или на котором ELF дамп ядра был произведен.

Приложения

Unix-подобные системы

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

Принятие не-Unix

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

Игровые приставки

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

PowerPC

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

Мобильные телефоны

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

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

Характеристики

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

86открыто

86открыто был проектом по формированию консенсуса по общему двоичный файл формат для Unix и Unix-подобный операционные системы на общем Совместимость с ПК x86 архитектура, чтобы побудить разработчиков программного обеспечения перейти на архитектуру.[25] Первоначальная идея заключалась в стандартизации небольшого подмножества Spec 1170, предшественника Единая спецификация UNIX и библиотека GNU C (glibc), чтобы немодифицированные двоичные файлы могли работать в Unix-подобных операционных системах x86. Первоначально проект получил обозначение «Спец 150».

В конечном итоге был выбран формат ELF, в частности, реализация ELF в Linux, после того, как она оказалась де-факто стандарт поддерживается всеми вовлеченными производителями и операционными системами.

Группа начала обсуждения по электронной почте в 1997 году и впервые встретилась вместе на Операция Санта-Крус офисы 22 августа 1997 г.

Руководящий комитет был Марк Юинг, Дион Джонсон, Эван Лейбович, Брюс Перенс, Эндрю Роуч, Брайан Уэйн Спаркс и Линус Торвальдс. Остальные участники проекта были Кейт Бостик, Чак Крэнор, Майкл Дэвидсон, Крис Дж. Деметриу, Ульрих Дреппер, Дон Даггер, Стив Гинзбург, Джон "Мэддог" Холл, Рон Холт, Джордан Хаббард, Дэйв Дженсен, Кин Джонстон, Эндрю Джози, Роберт Лайп, Бела Лубкин, Тим Марсленд, Грег Пейдж, Рональд Джо Рекорд, Тим Ракл, Джоэл Сильверстайн, Чиа-пи Тьен и Эрик Троан. Представленные операционные системы и компании были BeOS, BSDI, FreeBSD, Intel, Linux, NetBSD, ШОС и SunSoft.

Проект продолжался, и в середине 1998 года ШОС начала развиваться. lxrun, открытый исходный код уровень совместимости возможность запускать двоичные файлы Linux на OpenServer, UnixWare, и Солярис. SCO объявила об официальной поддержке lxrun на LinuxWorld в марте 1999 г. Sun Microsystems начал официально поддерживать lxrun для Solaris в начале 1999 г.,[26] а позже перешел на интегрированную поддержку двоичного формата Linux через Контейнеры Solaris для приложений Linux.

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

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

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

Смотрите также

Рекомендации

  1. ^ а б Стандарт интерфейса инструмента (TIS) Спецификация исполняемого файла и формата связывания (ELF) Версия 1.2 (Май 1995 г.)
  2. ^ Двоичный интерфейс приложения System V Выпуск 4.1 (18 марта 1997 г.)
  3. ^ «Доступные лексеры - пигменты». pygments.org.
  4. ^ "Заголовок ELF". Sco.com. Июль 2000 г.. Получено 2014-02-07.
  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 г.. Получено 2017-04-05.
  10. ^ "эльфутилс". sourceware.org. Получено 30 апреля 2017.
  11. ^ «Двоичные форматы».
  12. ^ «MinixReleases - Minix Wiki». Wiki.minix3.org. Архивировано из оригинал на 2013-03-30. Получено 2014-01-19.
  13. ^ https://vmssoftware.com/pdfs/State_of_Port_20160906.pdf
  14. ^ «GCCSDK - RISC OS». Riscos.info. 2012-04-22. Получено 2014-01-19.
  15. ^ «Анонс Windows 10 Insider Preview Build 14316». Блог Windows Experience. 2016-04-06. Получено 2016-04-10.
  16. ^ Фоли, Мэри Джо. «Под капотом подсистемы Microsoft Windows для Linux | ZDNet». ZDNet. Получено 2016-08-19.
  17. ^ "Руководство программиста Guardian" (PDF). Hewlett Packard Enterprise. Архивировано из оригинал (PDF) на 2018-05-30. Получено 2018-05-30. п. 44 архивировано из оригинал на 2018-5-30
  18. ^ PlayStation Portable использует зашифрованный и перемещенный файл ELF: PSP
  19. ^ Формат исполняемого файла ОС Symbian
  20. ^ Розен, Кеннет; Ведущий, Дуглас; Клее, Рэйчел; Розински, Ричард (2007). UNIX: полный справочник (2-е изд.). McGraw Hill Professional. п. 707. ISBN  9780071706988. Получено 2017-06-08. Динамически подключаемые библиотеки также называются общими объектами (.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. ^ Лейбович, Эван (1997-12-23). «86Открытые часто задаваемые вопросы». Архивировано из оригинал на 2007-03-11. Получено 2007-06-06.
  26. ^ Рекорд, Рональд (1998-05-21). «Бюллетень о статусе 86open в ШОС». Архивировано из оригинал на 2008-12-08. Получено 2008-05-06.
  27. ^ Лейбович, Эван (1999-07-25). «Проект The86open - Финальное обновление». Архивировано из оригинал на 2007-02-27. Получено 2007-05-06.
  28. ^ Гордон, Райан. "Fatelf-спецификация v1". icculus.org. Получено 2010-07-25.
  29. ^ Гордон, Райан. «FatELF: Оказывается, мне больше нравилась неопределенность». icculus.org. Получено 2010-07-13.
  30. ^ Холверда, Том (3 ноября 2009 г.). «Райан Гордон останавливает проект FatELF». osnews.com. Получено 2010-07-05.
  31. ^ Брокмайер, Джо (23 июня 2010 г.). «СЕБЯ: анатомия (предполагаемой) неудачи». Еженедельные новости Linux. Получено 2011-02-06.

дальнейшее чтение

внешняя ссылка