Вход в таблицу ресурсов (Resource Entry Item
)
Смещение | Длина поля | Название поля | Описание поля |
---|---|---|---|
00h | DWORD | Name RVA or Res ID | Поле содержит либо идентификатор ресурса, либо указатель на его имя в таблице имен ресурсов. |
04h | DWORD | Data Entry RVA or SubDirectory RVA | Указывает либо на данные, либо на еще одну таблицу входов ресурсов. Старший бит поля, сброшенный в ноль, говорит, что поле указывает на данные. |
Каждый пункт данных (Resource Entry Item
) имеет следующий
формат:
Смещение | Длина поля | Название поля | Описание поля |
---|---|---|---|
00h | DWORD | Data RVA | Указатель на реально расположенные данные относительно Image
Base . |
04h | DWORD | Size | Размер ресурсных данных. |
08h | DWORD | CodePage | Кодовая страница. |
0Ch | DWORD | Reserved | He используется и устанавливается в ноль. |
Таблица настроек адресов
Если исполняемый файл не может быть отображен по адресу, который указал
компоновщик, то загрузчик производит настройку модуля, используя данные из
секции .reloc
. Поправки сводятся к перечню тех мест в отображенном
файле, где нужно прибавить некоторую величину.
Формирование данных базовых поправок выглядит следующим образом. Поправки упаковываются сериями смежных кусков различной длины. Каждый кусок описывает поправки для одной четырехбайтовой страницы отображения и начинается со следующей структуры:
Смещение | Длина поля | Название поля | Описание поля |
---|---|---|---|
00h | DWORD | Page RVA | Относительный адрес страницы применения. |
04h | DWORD | Block Size | Размер блока настроек (с заголовком). Эта величина используется для вычисления количества настроек. |
08h | WORD | TypeOffset Record | Массив записей настроек, их переменное количество. |
Для наложения настройки необходимо вычислить 32-битную разницу ("Дельта") между желаемой базой загрузки и действительной. Если образ программы загружен в требуемое место, то эта разница равна нулю и никакой настройки не требуется. Каждый блок настроек должен начинаться на DWORD-границе, для выравнивания блока можно пользоваться нулями. При настройке необходимую позицию в блоке вычисляют как сумму относительного адреса страницы и базового адреса загруженной программы.
Структура элемента массива настроек
15...12Type | 11...0Offset | Биты слова, Type указывает на тип настройки, a
Offset на ее смещение внутри 4-килобайтной
страницы. |
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 | ? |
Отладочная информация (.debug$S
, .debug$T
)
Здесь помещается структура отладочного каталога, создаваемого любыми компоновщиками. Другая отладочная информация зависит от транслятора. Структуру COFF-отладочной информации можно посмотреть в книге [2].
Отладочный каталог
Смещение | Длина поля | Название поля | Описание поля |
---|---|---|---|
00h | DWORD | Debug Flags | Флаги, по-видимому, не используются и устанавливаются в нулевое значение. |
04h | DWORD | Time/Date Stamp | Дата и время создания отладочной информации. |
08h | WORD | Major Version | Старший номер версии отладочной информации. |
0Ah | WORD | Minor Version | Младший номер версии отладочной информации. |
0Ch | DWORD | Debug Type | Тип информации для отладчика. Вот эти типы:0000h -
UNKNOWN/BORLAND;0001h - COFF таблица
символов;0002h - Code View таблица
символов;0003h - FPO таблица символов;0004h -
MISC;0005h - EXCEPTION;0006h -
FIXUP. |
10h | DWORD | Data Size | Размер в байтах данных для отладки без размера заголовка. |
14h | DWORD | Data RVA | Относительный адрес расположения отладочных данных в памяти. |
18h | DWORD | Data Seek | Смещение к отладочным данным в файле. |