Некоторые управляющие структуры объектных файлов могут увеличиваться в размерах, так как заголовок ELF содержит их действительный размер. Если формат объектного файла изменился, программа может встретить управляющие структуры, которые больше или меньше, чем ожидалось. Программы могут игнорировать лишнюю информацию. Способ обработки недостающей информации зависит от контекста и указывается при определении расширения.
Заголовок ELF
#define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shtrndx; } Elf32_Ehdr; typedef struct { unsigned char e_ident[EI_NIDENT]; Elf64_Half e_type; Elf64_Half e_machine; Elf64_Word e_version; Elf64_Addr e_entry; Elf64_Off e_phoff; Elf64_Off e_shoff; Elf64_Word e_flags; Elf64_Half e_ehsize; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64_Half e_shtrndx; } Elf64_Ehdr; |
Имя | Значение | Описание |
---|---|---|
ET_NONE | 0 | Тип не указан |
ET_REL | 1 | Перемещаемый файл |
ET_EXEC | 2 | Исполняемый файл |
ET_DYN | 3 | Общий объектный файл |
ET_CORE | 4 | Файл ядра |
ET_LOOS | 0xfe00 | Определяется операционной системой |
ET_HIOS | 0xfeff | Определяется операционной системой |
ET_LOPROC | 0xff00 | Определяется процессором |
ET_HIPROC | 0xffff | Определяется процессором |
Имя | Значение | Описание |
---|---|---|
EM_NONE | 0 | Нет компьютера |
EM_M32 | 1 | AT&T WE 32100 |
EM_SPARC | 2 | SPARC |
EM_386 | 3 | Intel 80386 |
EM_68K | 4 | Motorola 68000 |
EM_88K | 5 | Motorola 88000 |
RESERVED | 6 | Зарезервировано для использования в будущем |
EM_860 | 7 | Intel 80860 |
EM_MIPS | 8 | MIPS I Architecture |
EM_S370 | 9 | IBM System/370 Processor |
EM_MIPS_RS3_LE | 10 | MIPS RS3000 Little-endian |
RESERVED | 11-14 | Зарезервировано для использования в будущем |
EM_PARISC | 15 | Hewlett-Packard PA-RISC |
RESERVED | 16 | Зарезервировано для использования в будущем |
EM_VPP500 | 17 | Fujitsu VPP500 |
EM_SPARC32PLUS | 18 | Расширенный набор инструкций SPARC |
EM_960 | 19 | Intel 80960 |
EM_PPC | 20 | PowerPC |
EM_PPC64 | 21 | 64-разрядный PowerPC |
RESERVED | 22-35 | Зарезервировано для использования в будущем |
EM_V800 | 36 | NEC V800 |
EM_FR20 | 37 | Fujitsu FR20 |
EM_RH32 | 38 | TRW RH-32 |
EM_RCE | 39 | Motorola RCE |
EM_ARM | 40 | Advanced RISC Machines ARM |
EM_ALPHA | 41 | Digital Alpha |
EM_SH | 42 | Hitachi SH |
EM_SPARCV9 | 43 | SPARC Version 9 |
EM_TRICORE | 44 | Siemens Tricore embedded processor |
EM_ARC | 45 | Argonaut RISC Core, Argonaut Technologies Inc. |
EM_H8_300 | 46 | Hitachi H8/300 |
EM_H8_300H | 47 | Hitachi H8/300H |
EM_H8S | 48 | Hitachi H8S |
EM_H8_500 | 49 | Hitachi H8/500 |
EM_IA_64 | 50 | Платформа Itanium |
EM_MIPS_X | 51 | Stanford MIPS-X |
EM_COLDFIRE | 52 | Motorola ColdFire |
EM_68HC12 | 53 | Motorola M68HC12 |
EM_MMA | 54 | Fujitsu MMA Multimedia Accelerator |
EM_PCP | 55 | Siemens PCP |
EM_NCPU | 56 | Sony nCPU embedded RISC processor |
EM_NDR1 | 57 | Denso NDR1 microprocessor |
EM_STARCORE | 58 | Motorola Star*Core processor |
EM_ME16 | 59 | Toyota ME16 processor |
EM_ST100 | 60 | STMicroelectronics ST100 processor |
EM_TINYJ | 61 | Advanced Logic Corp. TinyJ embedded processor family |
Reserved | 62-65 | Зарезервировано для использования в будущем |
EM_FX66 | 66 | Siemens FX66 microcontroller |
EM_ST9PLUS | 67 | STMicroelectronics ST9+ 8/16 bit microcontroller |
EM_ST7 | 68 | STMicroelectronics ST7 8-bit microcontroller |
EM_68HC16 | 69 | Motorola MC68HC16 Microcontroller |
EM_68HC11 | 70 | Motorola MC68HC11 Microcontroller |
EM_68HC08 | 71 | Motorola MC68HC08 Microcontroller |
EM_68HC05 | 72 | Motorola MC68HC05 Microcontroller |
EM_SVX | 73 | Silicon Graphics SVx |
EM_ST19 | 74 | STMicroelectronics ST19 8-bit microcontroller |
EM_VAX | 75 | Digital VAX |
EM_CRIS | 76 | Axis Communications 32-bit embedded processor |
EM_JAVELIN | 77 | Infineon Technologies 32-bit embedded processor |
EM_FIREPATH | 78 | Element 14 64-bit DSP Processor |
EM_ZSP | 79 | LSI Logic 16-bit DSP Processor |
EM_MMIX | 80 | Donald Knuth's educational 64-bit processor |
EM_HUANY | 81 | Машинно-независимые объектные файлы Гарвардского университета |
EM_PRISM | 82 | SiTera Prism |
Имя | Значение | Описание |
---|---|---|
EV_NONE | 0 | Неверная версия |
EV_CURRENT | 1 | Текущая версия |
Как было отмечено ранее, ELF предоставляет среду для поддержки объектных файлов для разных процессоров, кодировок данных и классов компьютеров. В целях поддержки всего семейства объектных файлов, первые байты файла указывают способ интерпретации, не зависящий от конкретного процессора и оставшегося содержимого файла.
Первые байты заголовка ELF (и объектного файла) соответствуют элементу e_ident.
e_ident[] Идентификационные индексы
Имя | Значение | Назначение |
---|---|---|
EI_MAG0 | 0 | Идентификация файла |
EI_MAG1 | 1 | Идентификация файла |
EI_MAG2 | 2 | Идентификация файла |
EI_MAG3 | 3 | Идентификация файла |
EI_CLASS | 4 | Класс файла |
EI_DATA | 5 | Кодировка данных |
EI_VERSION | 6 | Версия файла |
EI_OSABI | 7 | Идентификация операционной системы и ABI |
EI_ABIVERSION | 8 | Версия ABI |
EI_PAD | 9 | Начало дополняющих байтов |
EI_NIDENT | 16 | Размер e_ident[] |
Эти индексы указывают на байты, содержащие следующие значения.
Имя | Значение | Position |
---|---|---|
ELFMAG0 | 0x7f | e_ident[EI_MAG0] |
ELFMAG1 | 'E' | e_ident[EI_MAG1] |
ELFMAG2 | 'L' | e_ident[EI_MAG2] |
ELFMAG3 | 'F' | e_ident[EI_MAG3] |
Имя | Значение | Описание |
---|---|---|
ELFCLASSNONE | 0 | Неверный класс |
ELFCLASS32 | 1 | 32-разрядные объекты |
ELFCLASS64 | 2 | 64-разрядные объекты |
Имя | Значение | Описание |
---|---|---|
ELFDATANONE | 0 | Неверная кодировка данных |
ELFDATA2LSB | 1 | См. ниже |
ELFDATA2MSB | 2 | См. ниже |
Прочие значения зарезервированы и будут присваиваться новым кодировкам по мере их появления.
Примечание: Для удобства выполнения программы в структурах данных файла ELF применяется тот же порядок байтов, что и в работающей программе.
Кодировка данных указывает, как будут интерпретироваться основные объекты файла. Файлы класса ELFCLASS32 используют объекты, занимающие 1, 2 и 4 байта. Файлы класса ELFCLASS64 используют объекты, занимающие 1, 2, 4 и 8 байт. В соответствии с заданными кодировками, объекты будут представлены следующим образом.
Кодировка ELFDATA2LSB указывает дополнения числа 2, причем наименьший
байт находится по наименьшему адресу.
01 |
0x01
02 | 01 |
0x0102
04 | 03 | 02 | 01 |
0x01020304
08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 |
0x0102030405060708
Кодировка данных ELFDATA2LSB, байт с нулевым адресом расположен слева
Кодировка ELFDATA2MSB указывает дополнения числа 2, причем наибольший
байт находится по наименьшему адресу.
01 |
0x01
01 | 02 |
0x0102
01 | 02 | 03 | 04 |
0x01020304
01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 |
0x0102030405060708
Кодировка данных ELFDATA2MSB, байт с нулевым адресом расположен слева
Примечание: В этом разделе приведена информация, зависящая от процессора. Более подробная информация приведена в документации по ABI и процессору.