Операционная система 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-файла

ЗначениеАппаратная платформа
>ЕМ_М32AT&T WE 32100
>ЕМ_SPARCSun SPARC
>ЕМ_386Intel 80386
>ЕМ_68KMotorola 68000
>EM_88KMotorola 88000
>ЕМ_486Intel 80486
>ЕМ_860Intel i860
>ЕМ_MIPSMIPS RS3000 Big-Endian
>EM_MIPS_RS3_LEMIPS RS3000 Little-Endian
>EM_RS6000RS6000
>EM_PA_RISCPA-RISC
>EM_nCUBEnCUBE
>EM_VPP500Fujitsu VPP500
>EM_SPARC32PLUSSun SPARC 32+

Информация, содержащаяся в таблице заголовков программы, указывает ядру, как создать образ процесса из сегментов. Большинство сегментов копируются (отображаются) в память и представляют собой соответствующие сегменты процесса при его выполнении, например, сегменты кода или данных.

Каждый заголовок сегмента программы описывает один сегмент и содержит следующую информацию:

□ Тип сегмента и действия операционной системы с данным сегментом

□ Расположение сегмента в файле

□ Стартовый адрес сегмента в виртуальной памяти процесса

□ Размер сегмента в файле

□ Размер сегмента в памяти

□ Флаги доступа к сегменту (запись, чтение, выполнение)

Часть сегментов имеет тип LOAD, предписывающий ядру при запуске программы на выполнение создать соответствующие этим сегментам структуры данных, называемые областями, определяющие непрерывные участки виртуальной памяти процесса и связанные с ними атрибуты. Сегмент, расположение которого в ELF-файле указано в соответствующем заголовке программы, будет отображен в созданную область, виртуальный адрес начала которой также указан в заголовке программы. К сегментам такого типа относятся, например, сегменты, содержащие инструкции программы (код) и ее данные. Если размер сегмента меньше размера области, неиспользованное пространство может быть заполнено нулями. Такой механизм, в частности используется при создании неинициализированных данных процесса (BSS). Подробнее об областях мы поговорим в главе 3.

В сегменте типа INTERP хранится программный интерпретатор. Данный тип сегмента используется для программ, которым необходимо динамическое связывание. Суть динамического связывания заключается в том, что отдельные компоненты исполняемого файла (разделяемые объектные файлы) подключаются не на этапе компиляции, а на этапе запуска программы на выполнение. Имя файла, являющегося динамическим редактором связей