В этом разделе описан формат объектных файлов, называемый ELF (Формат исполняемых файлов и связывания). Существует три типа объектных файлов.
Объектные файлы создаются ассемблером или компоновщиком и являются двоичным представлением программ, предназначенных для выполнения непосредственно процессором. Этот термин не относится к программам, для выполнения которых нужны специальные интерпретаторы (например, к сценариям оболочки).
После введения в этой главе подробно рассматривается формат объектного файла и процесс создания программ. В главе 32 также рассмотрены компоненты объектного файла, необходимые для выполнения программы.
Объектные файлы применяются при компоновке (создании) и выполнении программы. Формат содержимого объектного файла может различаться в зависимости от того, для каких целей создан файл. В следующей таблице показан формат объектного файла.
Формат объектного файла
В самом начале файла расположен заголовок ELF, который описывает структуру файла. В разделах расположена информация, применяемая при связывании: инструкции, данные, таблица имен, информация о перемещении и т.п. Описание этих разделов вы найдете в этой главе ниже. В главе 32 рассмотрены сегменты и представление файла, предназначенное для выполнения.
Таблица заголовков программы указывает системе, как нужно создавать образ процесса. Файлам, используемым для создания образа процесса (выполнения программы) необходима таблица заголовков; для перемещаемых файлов такая таблица не требуется. Таблица заголовков разделов содержит информацию, описывающую разделы файла. В таблице есть запись для каждого раздела таблицы; в каждой записи хранится информация о разделе, например, имя раздела, размер и т.п. В файлах, используемых для компоновки, должна быть таблица заголовков разделов; в других файлах она не обязательна.
Примечание: На рисунке таблица заголовков программы показана сразу после заголовка ELF, а таблица заголовков разделов непосредственно перед разделами. В действительности порядок может быть другим. Более того, порядок разделов и сегментов не регламентируется. В файле зафиксирован только заголовок ELF.
Формат объектных файлов поддерживает различные процессоры с 32- или 64-разрядной архитектурой, в которых длина байта равна 8 битам. Однако этот формат может быть расширен для применения в других архитектурах. Поэтому объектные файлы содержат некоторую информацию в машинно-независимом формате, что позволяет идентифицировать и интерпретировать содержимое объектных файлов единым образом. Оставшиеся данные жестко связаны с определенным процессором, вне зависимости от того, на какой машине был создан файл.
Типы 32-разрядных данных
Имя | Размер | Выравнивание | Назначение |
---|---|---|---|
Elf32_Addr | 4 | 4 | Адрес программы без знака |
Elf32_Off | 4 | 4 | Смещение файла без знака |
Elf32_Half | 2 | 2 | Среднее целое без знака |
Elf32_Word | 4 | 4 | Целое без знака |
Elf32_Sword | 4 | 4 | Целое со знаком |
unsigned char | 1 | 1 | Короткое целое без знака |
Типы 64-разрядных данных
Имя | Размер | Выравнивание | Назначение |
---|---|---|---|
Elf64_Addr | 8 | 8 | Адрес программы без знака |
Elf64_Off | 8 | 8 | Смещение файла без знака |
Elf64_Half | 2 | 2 | Среднее целое без знака |
Elf64_Word | 4 | 4 | Целое без знака |
Elf64_Sword | 4 | 4 | Целое со знаком |
Elf64_Xword | 8 | 8 | Длинное целое без знака |
Elf64_Sxword | 8 | 8 | Длинное целое со знаком |
unsigned char | 1 | 1 | Короткое целое без знака |
Все определяемые в объектном файле структуры данных имеют размер и правила выравнивания, заданные соответствующим классом. При необходимости структуры данных явно выравниваются по 8-байтовой границе для 8-байтовых объектов, 4-байтовой границе для 4-байтовых объектов и т.п. Кроме того, данные выравниваются относительно начала файла. Например, структура, содержащая элемент Elf32_Addr, будет выровнена в файле по 4-байтовой границе.
В целях переносимости в ELF не применяются битовые поля.