В 32-битных Windows всех DLL
файлах и многих (но не всех) EXE
файлах есть так называемая «Базовая таблица перемещения».
Эта таблица содержит список всех абсолютные адреса, содержащиеся в файле.
В вашем примере есть абсолютный адрес (0x006C0064
), хранящийся по адресу 0x00042333
.
Таблица будет содержать запись о том, что существует абсолютный адрес, хранящийся в 0x00042333
.
Когда исполняемый файл или динамическая c библиотека загружается по другому адресу, загрузчик действительно «перезапишет» все эти адреса.
Однако, «перезапись» - довольно простая операция: нужно просто добавить фиксированное значение ко всем этим адресам.
Обратите внимание, что эта концепция полностью отличается от концепции, используемой Linux и другими ОС.