Операционные системы. Курс лекций



Компоновщики и загрузчики ОС. Форматы COFF (command object file format) и PE (portable executable). - часть 3


В свою очередь элемент таблицы поправок ссылающийся на элемент таблицы символов содержит смещение области кода, к которой необходима привязка и  тип привязки.

После таблицы символов идет таблица ASCII-Z строк, которые представляют собой длинные имена элементов таблицы символов. Если какой-то элемент таблицы символов имеет более 8 символов, то вместо самого имени в таблице символов содержится RVA на строку из таблицы ASCII-Z (zero) строк.

В простейшем случае компоновщик PE модулей выполняет простейшие функции:

- сначала он должен проанализировать таблицу символов объектных модулей, которая содержит описание секций, присутствующих в объектных модулях, привязок в этих секциях, процедур и т.д.  

- проанализировав таблицу символов компоновщик получит предварительную информацию о количестве секций PE, их расположении, последовательности и т.д.

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

Так как таблица символов описывает функции типа external в объектных модулях, то можно построить секцию импорта на основе анализа таблицы символов.

1.    Выявляются символы external и сопоставляются с именами функций dll.

2.    Запись в секцию имен внешних функций и имен dll где они находятся.

3.    Создание 2х массивов указателей на структуры Image_Import_by_name

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

После создания секций нужно произвести привязку адресов в командах секции кода, например, к данным из секции данных. Хотя могут быть и другие привязки.

Привязки выполняются в соответствии с таблицами привязок объектных модулей Image Relocation. Далее можно добавить еще одну, содержащую базовые поправки адресов PE модуля на случай его отображения не по указанному в модуле адресу.

После того, как секции созданы и произведена настройка связей можно создать заголовки Image File Header, Image Optional Header, Image Section Header, хотя некоторые поля заголовком могут заполняться в начале или во время любого этапа.

Создание секции PE из секции COFF состоит из следующих шагов:

1.    установка указателя на первую секцию первого модуля;

2.    копирование/добавление информации в создаваемую PE секцию. Если есть привязки, то происходит редактирование связей;

3.    поиск следующих секций с информацией того же типа;

4.    если такие секции есть, то установка указателя на следующую подходящую секцию текущего модуля и переход к п.2;

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




Содержание  Назад  Вперед