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



Структура PE модуля - часть 2


В PE файле в случае вызова функции из другого модуля инструкция CALL сгенерированная компилятором не передает управление непосредственно данной функции в DLL. Вместо этого инструкция CALL передает управление команде JMP DWORD PTR [xxxxxxxx] также находящейся в секции .text.

Команда JMP передает управление по адресу, хранящемся в двойном слове в секции .idata.  Это двойное слово содержит настоящий адрес точки входа функции ОС.

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

Все, что остается загрузчику – это поместить правильный адрес целевой функции в двойное слово в секции .idata и не нужно настраивать никаких инструкций CALL.

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

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

После загрузки, секция .idata содержит указатели функций, импортируемых exe-файлом или dll.

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

Количество элементов в массиве нигде не учитывается, но последняя структура массива имеет поля, содержащие null.




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