Необходимость переезда в exe - PullRequest
2 голосов
/ 14 марта 2012

Зачем нужна таблица перемещений, когда каждый элемент в exe смещен относительно основания изображения? Я имею в виду, даже если изображение смещено на положительное смещение, скажем, 0X60000, почему существует таблица перемещений, поскольку в любом случае мы будем использовать RVA, которые будут относительно новой базы ??

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

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

Таблица перемещения состоит именно из этих мест. Это таблица всех мест, которые должны быть скорректированы по разнице фактического базового адреса и предпочтительного.

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

P.S. В Windows 7 EXE может содержать таблицу перемещений на случай, если они предпочитают загружаться по случайному адресу. Это функция безопасности (жалкое ИМХО)

Изменить:

Следует отметить, что адреса функций не всегда доступны по их абсолютному значению. В x86 инструкции ветвления (такие как jmp, call и т. Д.) Имеют «короткий» формат, который работает с относительным смещением. Такие места не должны быть упомянуты в таблице перемещения.

0 голосов
/ 15 марта 2012

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

...