Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Формат исполняемых PE-файлов
Таблица настроек адресов (FixUp Table)


Таблица настроек адресов содержит элементы для всех фиксированных адресов в образе программы. Поле в заголовке PE файла с названием FixUp's Data Size содержит общий размер в байтах данной таблицы. Сама таблица настроет адресов разбита на блоки настроек (каждый блок представляет настройки для 4-х килобайтовой страницы).
Связанные линкером адреса не нуждаются в дополнительной настройке загрузчиком до тех пор, пока загрузчик в состоянии загрузить программу по адресу, указанному в ее заголовке. При невыполнении этого условия загрузчику прийдется корректировать адреса в программе. С учетом FLAT модели памяти и виртуализации адресного пространства для каждого процесса загрузчику никогда не прийдется изменять эти адреса, исключением могут являться библиотеки, которые многое компиляторы привязывают к одному фиксированному адресу (Borland например), либо случайные конфликты в адресах библиотек.

Блок настроек перемещений (FixUp Block)
Блок настроек имеет следующий довольно простой формат:
FixUp Block

Base Size or Type Name Of field Brief description
00h DWord Page RVA Указатель на страницу применения настроек перемещений
04h DWord Block Size Размер блока настроек (с заголовком)
08h Word TypeOffset Record Массив записей настроек, их переменное количество
Total Structure size ... таблица имеет переменный размер

Для наложения настройки необходимо вычислить Дельта-значение. 32-битное Дельта есть разница между желаемой базой загрузки и действительной. Если образ программы загружен в требуемое место, то Дельта равна нулю и никакой настройки произойти не может. Каждый блок настроек должен начинаться на DWord границе (не проверял), для выравнивания блока можно пользоваться нулями.
При настройке необходимую позицию в блоке вычисляют как сумму Page RVA и Image Base загруженной программы. TypeOffset определен следующим образом:
TypeOffset Entry
15 . . . 12 Type 11 . . . 0 Offset Биты слова, Type указывает на тип настройки, а Offset на ее смещение внутри 4-килобайтового блока применимости настроек.

Поле Type имеет следующие значения:
0h - адрес абсолютный и никаких изменений производить не требуется.
1h - добавить старшие 16 битов Дельты к 16 битовому полю находящемуся по смещению Offset. 16 битовое поле представляет старшие биты 32-битового слова.
2h - добавить младшие 16 битов Дельты по смещению Offset. 16-битовое поле представляет младшую половину 32-битового слова. Данная запись настройки присутствует только на RISC машине когда Object align не является по умолчанию 64К.
3h - прибавляет 32-битовое Дельта к 32-битовому значению.
4h - настройка требует полного 32-битового значения. Старшие 16-бит берутся по адресу Offset, а младшие в следующем элементе TypeOffset Все это объединяется в знаковую переменную, затем добавляется 32-битовое дельта и DWord 8000h. Старшие 16 бит получившегося значения сохраняются по адресу Offset в 16-битовом поле.
5h - ? что-то связанное с MIPS.


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

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz