[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Заголовок ELF

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

e_ident
Начальные байты помечают файл как объектный и содержат машинно-зависимые данные о способе разбора и интерпретации содержимого файла. Полное описание приведено в разделе Идентификация ELF.

e_type
Этот элемент задает тип объектного файла.

 

Имя Значение Описание
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 Определяется процессором

 
Хотя содержимое файла ядра не описано, для таких файлов зарезервирован тип ET_CORE. Значения от ET_LOOS до ET_HIOS (включительно) зарезервированы для использования операционной системой. Интерпретация значений от ET_LOPROC до ET_HIPROC (включительно) зависит от процессора. Их применение описано в документации по процессору. Другие значения зарезервированы и при необходимости присваиваются новым объектным файлам.

e_machine
Значение этого элемента определяет архитектуру, для которой предназначен конкретный файл.

 

Имя Значение Описание
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

 
Прочие значения зарезервированы и будут присваиваться новым компьютерам по мере их появления. В именах ELF для определения процессора применяются названия компьютеров. Например, показанные ниже флаги используют префикс EF_; поэтому флаг WIDGET для компьютера EM_XYZ будет называться EF_XYZ_WIDGET.

e_version
Этот элемент определяет версию объектного файла.

 

Имя Значение Описание
EV_NONE 0 Неверная версия
EV_CURRENT 1 Текущая версия

 
Значение 1 указывает на начальный формат файла; для расширений будут созданы новые номера версий, превышающие 1. Хотя в предыдущей таблице для EV_CURRENT показано значение 1, оно будет изменяться при необходимости, чтобы отражать текущий номер версии.

e_entry
В этом элементе указан виртуальный адрес, по которому будет передано управление при запуске процесса. Если в файле нет точки входа, этот элемент содержит значение 0.

e_phoff
В этом элементе указано смещение таблицы заголовков программы в файле (в байтах). Если в файле нет таблицы заголовков программы, этот элемент содержит значение 0.

e_shoff
В этом элементе указано смещение таблицы заголовков разделов в файле (в байтах). Если в файле нет таблицы заголовков разделов, этот элемент содержит значение 0.

e_flags
Этот элемент содержит зависящие от процессора флаги, связанные с файлом. Формат флагов следующий: EF_компьютер_флаг.

e_ehsize
Этот элемент указывает длину заголовка ELF в байтах.

e_phentsize
Этот элемент содержит длину одной записи в таблице заголовков программы (в байтах). Все записи имеют одинаковую длину.

e_phnum
Этот элемент содержит число записей в таблице заголовков программы. Произведение e_phentsize и e_phnum указывает размер таблицы в байтах. Если в файле нет таблицы заголовков программ то значение e_phnum равно нулю.

e_shentsize
Этот элемент указывает длину заголовка раздела в байтах. Заголовок раздела - это одна запись таблицы заголовков; все записи имеют равную длину.

e_shnum
Этот элемент содержит число записей в таблице заголовков разделов. Произведение e_shentsize и e_shnum указывает размер таблицы заголовков разделов в байтах. Если в файле нет таблицы заголовков разделов, то значение e_shnum равно нулю.

e_shstrndx
В этом элементе хранится индекс записей, связанных с именами разделов в таблице заголовков разделов. Если в файле нет таблицы имен разделов, то в этом элементе будет указано значение SHN_UNDEF. Более подробная информация приведена в разделах Разделы и Таблица строк.

Идентификация ELF

Как было отмечено ранее, 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[]

Эти индексы указывают на байты, содержащие следующие значения.

EI_MAG0 to EI_MAG3
Первые 4 байта файла содержат сигнатуру, идентифицирующую файл как объектный файл ELF.

 

Имя Значение 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]

EI_CLASS
Следующий байт, e_ident[EI_CLASS], указывает класс файла или его объем.
Имя Значение Описание
ELFCLASSNONE 0 Неверный класс
ELFCLASS32 1 32-разрядные объекты
ELFCLASS64 2 64-разрядные объекты

 
Формат файлов разработан таким образом, чтобы их можно было переносить между системами различного размера, не храня при этом файлы с большой системы на маленькой. Класс файла определяет основные типы, применяемые структурами данных объектного файла. Данные, хранящиеся в разделах объектного файла, могут соответствовать различным программным моделям. Принципы выбора конкретной модели описаны в документации по процессору.

 
Класс ELFCLASS32 поддерживает системы с 32-разрядной архитектурой. Он использует основные типы, определенные в таблице "32-разрядные типы данных".

 
Класс ELFCLASS64 поддерживает системы с 64-разрядной архитектурой. Он использует основные типы, определенные в таблице "64-разрядные типы данных".

 
При необходимости определяются другие классы, задающие основные типы и размер данных объектного файла.

EI_DATA
Байт e_ident[EI_DATA] задает кодировку структур данных в контейнере и разделах объектного файла.

 
На данный момент определены следующие кодировки:
Имя Значение Описание
ELFDATANONE 0 Неверная кодировка данных
ELFDATA2LSB 1 См. ниже
ELFDATA2MSB 2 См. ниже

Прочие значения зарезервированы и будут присваиваться новым кодировкам по мере их появления.

Примечание: Для удобства выполнения программы в структурах данных файла ELF применяется тот же порядок байтов, что и в работающей программе.

EI_VERSION
Байт e_ident[EI_VERSION] задает номер версии заголовка ELF. В данный момент это значение должно быть равно EV_CURRENT (в соответствии со значением e_version, описанным выше).

EI_OSABI
Байт e_ident[EI_OSABI] указывает операционную систему и ABI, для которой предназначен объект. В некоторых полях других структур ELF есть флаги и значения, имеющие разные значения в разных операционных системах и ABI; от данного байта зависит интерпретация таких полей. Значение этот байта должно интерпретироваться по-разному в разных системах. Таким образом, каждое значение поля e_machine определяет свой набор значений байта EI_OSABI. Значения присваиваются расширением процессора ABI каждой системы. Если расширение процессора не указывает набор значений, будет применяться значение 0 (не задано).

EI_ABIVERSION
Байт e_ident[EI_ABIVERSION] указывает версию ABI, для которой предназначен объект. Это поле применяется для определения несовместимых версий ABI. Интерпретация этого номера версии зависит от ABI, заданного в поле EI_OSABI. Если расширение процессора не указывает значение для поля EI_OSABI или если для ABI не задан номер версии на основе значения байта EI_OSABI, для байта EI_ABIVERSION должно применятся значение 0 (не указано).

EI_PAD
Это значение отмечает начало неиспользуемых дополняющих байтов в e_ident. Эти байты зарезервированы и равны нулю; программы, читающие объектные файлы, должны игнорировать их. Значение EI_PAD изменится в будущем, когда начнут использоваться байты, которые в данный момент не применяются.

Кодировка данных указывает, как будут интерпретироваться основные объекты файла. Файлы класса 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 и процессору.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]