Формат исполняемых и связываемых файлов

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

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

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

Содержание
  • 1 Структура файла
    • 1.1 Заголовок файла
    • 1.2 Заголовок программы
    • 1.3 Заголовок раздела
  • 2 Инструменты
  • 3 Приложения
    • 3.1 Unix-подобные системы
    • 3.2 Внедрение не-Unix
    • 3.3 Игровые консоли
    • 3.4 PowerPC
    • 3.5 Мобильные телефоны
  • 4 Технические характеристики
  • 5 86open
  • 6 FatELF: универсальные двоичные файлы для Linux
  • 7 См. Также
  • 8 Ссылки
  • 9 Дополнительная литература
  • 10 Внешние ссылки
Макет файла

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

Заголовок ELF
СмещениеРазмер (байты)ПолеНазначение
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
0x00System V
0x01HP-UX
0x02NetBSD
0x03Linux
0x04GNU Hurd
0x06Solaris
0x07AIX
0x08IRIX
0x09FreeBSD
0x0ATru64
0x0BNovell Modesto
0x0COpenBSD
0x0DOpenVMS
0x0ENonStop Kernel
0x0FAROS
0x10Fenix ​​OS
0x11
0x12Stratus Technologies OpenVOS

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

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

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

0x097e_ident [EI_PAD]в настоящее время не используется, следует заполнить нулями.
0x102e_typeОпределяет тип объектного файла.
ЗначениеТип
0x00ET_NONE
0x01ET_REL
0x02ET_EXEC
0x03ET_DYN
0x04ET_CORE
0xFE00ET_LOOS
0xFEFFET_HIOS
0xFF00ET_LOPROC 481>0xFFFFET_HIPROC
0x122e_machineЗадает целевую архитектуру набора команд . Вот несколько примеров:
ValueISA
0x00Нет специального набора инструкций
0x01ATT 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
0x28ARM (до ARMv7 / Aarch32)
0x2ASuperH
0x32IA-64
0x3Eamd64
0x8CСемейство TMS320C6000
0xB764-битное ARM (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-битного и 32 байта для 32-битного формата.
0x2A0x362e_phentsizeСодержит размер записи таблицы заголовков программы.
0x2C0x382e_phnumСодержит количество записей в таблице заголовков программы.
0x2E0x3A2e_shentsizeСодержит размер записи таблицы заголовков раздела.
0x300x3C2e_shnumСодержит количество записей в таблице заголовков раздела.
0x320x3E2e_shstrndxСодержит индекс записи таблицы заголовков раздела, содержащей имена разделов.
0x340x40Конец заголовка ELF (размер)

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

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

Заголовок программы
СмещениеРазмер (байты)ПолеНазначение
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

to 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 modulus 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_MASKOSOS- специфический
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 исключительно для Linux.
  • elfdumpявляется Команда для просмотра информации ELF в файле ELF, доступная в Solaris, и FreeBSD.
  • objdump предоставляет широкий спектр информации о файлах ELF и других форматах объектов. objdumpиспользует библиотеку дескрипторов двоичных файлов в качестве серверной части для структурирования данных ELF.
  • Unix файл может отображать некоторую информацию о файлах ELF, в том числе об архитектуре набора инструкций , для которой предназначен код в перемещаемом, исполняемом или совместно используемом объектном файле или на котором дамп ядра ELF .
Приложения

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

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

Использование не-Unix

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

Игровые консоли

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

PowerPC

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

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

Mobile телефоны

Некоторые операционные системы для мобильных телефонов и мобильных устройств используют 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

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: универсальные двоичные файлы для Linux

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

См. Также
  • значок Портал компьютерного программирования
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-19 09:35:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте