Операционная система UNIX - страница 50
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+ |
Информация, содержащаяся в таблице заголовков программы, указывает ядру, как создать образ процесса из сегментов. Большинство сегментов копируются (отображаются) в память и представляют собой соответствующие сегменты процесса при его выполнении, например, сегменты кода или данных.
Каждый заголовок сегмента программы описывает один сегмент и содержит следующую информацию:
□ Тип сегмента и действия операционной системы с данным сегментом
□ Расположение сегмента в файле
□ Стартовый адрес сегмента в виртуальной памяти процесса
□ Размер сегмента в файле
□ Размер сегмента в памяти
□ Флаги доступа к сегменту (запись, чтение, выполнение)
Часть сегментов имеет тип LOAD, предписывающий ядру при запуске программы на выполнение создать соответствующие этим сегментам структуры данных, называемые областями, определяющие непрерывные участки виртуальной памяти процесса и связанные с ними атрибуты. Сегмент, расположение которого в ELF-файле указано в соответствующем заголовке программы, будет отображен в созданную область, виртуальный адрес начала которой также указан в заголовке программы. К сегментам такого типа относятся, например, сегменты, содержащие инструкции программы (код) и ее данные. Если размер сегмента меньше размера области, неиспользованное пространство может быть заполнено нулями. Такой механизм, в частности используется при создании неинициализированных данных процесса (BSS). Подробнее об областях мы поговорим в главе 3.
В сегменте типа INTERP хранится программный интерпретатор. Данный тип сегмента используется для программ, которым необходимо динамическое связывание. Суть динамического связывания заключается в том, что отдельные компоненты исполняемого файла (разделяемые объектные файлы) подключаются не на этапе компиляции, а на этапе запуска программы на выполнение. Имя файла, являющегося динамическим редактором связей