Дело в том, что код не обращается к глобальным переменным (глобальным переменным и адресам функций) через RVA или что-либо еще. Доступ к ним осуществляется по их абсолютному адресу. И этот адрес следует изменить в случае, если исполняемый файл не был загружен по предпочтительному адресу.
Таблица перемещения состоит именно из этих мест. Это таблица всех мест, которые должны быть скорректированы по разнице фактического базового адреса и предпочтительного.
Кстати, EXE-файлы, в отличие от DLL, обычно не содержат таблицы перемещений. Это потому, что они являются первым модулем, который отображается в адресное пространство, поэтому они всегда могут быть загружены по своему предпочтительному адресу. Ситуация отличается для библиотек DLL, которые обычно содержат таблицы перемещений.
P.S. В Windows 7 EXE может содержать таблицу перемещений на случай, если они предпочитают загружаться по случайному адресу. Это функция безопасности (жалкое ИМХО)
Изменить:
Следует отметить, что адреса функций не всегда доступны по их абсолютному значению. В x86 инструкции ветвления (такие как jmp
, call
и т. Д.) Имеют «короткий» формат, который работает с относительным смещением. Такие места не должны быть упомянуты в таблице перемещения.