Столкнулся с интересной вещью - Взял 3 DLL скомпилировал их под x32 - везде есть таблица релоков. Те же DLL компилирую под x64 (на выходе получаю PE64 файл) и там уже релоков нет, но при этом всё работает нормально. Вот и возникает вопрос: каким образом система настраивает адреса для DLL? И каким образом тогда можно грузить вручную dll? Если для PE32 я выделял память в нужном регионе через VirtualAlloc, затем после обработки секций, если адрес не совпадал с ImageBase из PE то обрабатывал таблицу релоков. А как быть тогда в PE64? Или же там не важно куда будет загружена DLL, главное чтобы младшие 32 бита адреса совпали?
Спасибо. т.е. выходит что если файл PE64 то скорее всего релоков там не будет, а если и будут то игнорить их?
Думаю, совсем игнорировать нельзя, т.к. возможность абсолютной адресации осталась. Не знаю только, используют ее компляторы или нет.
>Не знаю только, используют ее компляторы или нет. В ряде случаев обойтись без неё просто невозможно, поэтому не могут не использовать релоки. Настраивается по аналогии с х86 достаточно просто.
наверно когда надо обратится к абсолютному адресу. а программу перенесли) ведь по умолчанию все относительно rip. перенес rip и абсолютный адрес уже другой... если конечно явно не прописать что надо компилировать в абсолютной адресации.