2

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

ответ

2

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

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

BTW, EXEs, в отличие от DLL обычно не содержит таблицы перемещения. Это связано с тем, что они являются первым модулем для отображения в адресное пространство, поэтому они всегда могут быть загружены по их предпочтительным адресам. Иная ситуация для DLL, которая обычно содержит таблицы перемещения.

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

Edit:

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

+0

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

+0

Глобальные переменные могут храниться в разделе данных EXE. И что? Тем не менее у них есть абсолютный виртуальный адрес. Просто скомпилируйте образец программы, обращающейся к глобальной переменной, и проверьте код с помощью отладчика. Вы увидите, что компоновщик помещает туда прямой адрес – valdo

+0

Есть ли какие-то конкретные причины для этого? Я имею в виду, почему все глобальные переменные не могут быть также в Relative Offsets? Разве это не сделало бы жизнь писателей-линкеров, намного проще? – user1232138

0

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