Рис. 2.3. Исполняемые образы программ форматов COFF и ELF
Сегмент данных включает инициализированные данные, копируемые в память из соответствующих разделов исполняемого файла, и неинициализированные данные, которые заполняются нулями перед началом выполнения процесса. Неинициализированные данные часто называют сегментом BSS.
Формат ELF имеет файлы нескольких типов, которые до сих пор мы называли по-разному, например, исполняемый файл или объектный файл. Тем не менее стандарт ELF различает следующие типы:
1. Перемещаемый файл (relocatable file), хранящий инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такого связывания может быть исполняемый файл или разделяемый объектный файл.
2. Разделяемый объектный файл (shared object file) также содержит инструкции и данные, но может быть использован двумя способами. В первом случае, он может быть связан с другими перемещаемыми файлами и разделяемыми объектными файлами, в результате будет создан новый объектный файл. Во втором случае, при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о разделяемых библиотеках.
3. Исполняемый файл хранит полное описание, позволяющее системе создать образ процесса. Он содержит инструкции, данные, описание необходимых разделяемых объектных файлов, а также необходимую символьную и отладочную информацию.
На рис. 2.4 приведена структура исполняемого файла, с помощью которого операционная система может создать образ программы и запустить программу на выполнение.
Рис. 2.4. Структура исполняемого файла в формате ELF
Заголовок имеет фиксированное расположение в файле. Остальные компоненты размещаются в соответствии с информацией, хранящейся в заголовке. Таким образом заголовок содержит общее описание структуры файла, расположение отдельных компонентов и их размеры.
Поскольку заголовок ELF-файла определяет его структуру, рассмотрим его более подробно (табл. 2.4).
Таблица 2.3. Поля заголовка ELF-файла
Поле |
Описание |
е_ident[] |
Массив байт, каждый из которых определяет некоторую общую характеристику файла: формат файла (ELF), номер версии, архитектуру системы (32-разрядная или 64-разрядная) и т.д. |
e_type |
Тип файла, поскольку формат ELF поддерживает несколько типов |
e_machine |
Архитектура аппаратной платформы, для которой создан данный файл. В табл. 2.4 приведены возможные значения этого поля |
e_version |
Номер версии ELF-формата. Обычно определяется как EV_CURRENC (текущая), что означает последнюю версию |
e_entry |
Виртуальный адрес, по которому системой будет передано управление после загрузки программы (точка входа) |
e_phoff |
Расположение (смещение от начала файла) таблицы заголовков программы |
е_shoff |
Расположение таблицы заголовков секций |
е_ehsize |
Размер заголовка |
e_phentsize |
Размер каждого заголовка программы |
e_phnum |
Число заголовков программы |
e_shentsize |
Размер каждого заголовка сегмента (секции) |
е_shnum |
Число заголовков сегментов (секций) |
e_shstrndx |
Расположение сегмента, содержащего таблицу строк |
Таблица 2.4. Значения поля e_machine заголовка ELF-файла
Значение |
Аппаратная платформа |
ЕМ_М32 |
AT&T WE 32100 |
ЕМ_SPARC |
Sun SPARC |
ЕМ_386 |
Intel 80386 |
ЕМ_68K |
Motorola 68000 |
EM_88K |
Motorola 88000 |
ЕМ_486 |
Intel 80486 |
ЕМ_860 |
Intel i860 |
ЕМ_MIPS |
MIPS RS3000 Big-Endian |
EM_MIPS_RS3_LE |
MIPS RS3000 Little-Endian |
EM_RS6000 |
RS6000 |
EM_PA_RISC |
PA-RISC |
EM_nCUBE |
nCUBE |
EM_VPP500 |
Fujitsu VPP500 |
EM_SPARC32PLUS |
Sun SPARC 32+ |
Информация, содержащаяся в таблице заголовков программы, указывает ядру, как создать образ процесса из сегментов. Большинство сегментов копируются (отображаются) в память и представляют собой соответствующие сегменты процесса при его выполнении, например, сегменты кода или данных.
Читать дальше