Я только что узнал, что ImageBase
указан в формате PE, и ОС загрузит его точно в позицию для .EXE
, затем возникает вопрос:
что, если для двух .EXE
требуется одно и то же местоположение ImageBase
?
Я только что узнал, что ImageBase
указан в формате PE, и ОС загрузит его точно в позицию для .EXE
, затем возникает вопрос:
что, если для двух .EXE
требуется одно и то же местоположение ImageBase
?
В случае двух EXE-файлов у них совершенно разные адресные пространства... Каждый исполняемый файл имеет свое собственное пространство. Это означает, что каждый раз, когда вы запускаете EXE-файл, ему назначается собственное независимое 4GB
(в 32-битных системах, хотя процесс может использовать только его часть, остальное достается ядру) стоит адресное пространство. Это виртуальное адресное пространство. Она отличается от вашей физической памяти.
Так что конфликта нет.
Технически PE может загружаться где угодно, но по умолчанию ImageBase
это 0x400000
.
Теперь предположим, что у вас есть EXE, и он загружает пару DLL (которые имеют один и тот же ImageBase)... В этом случае первая DLL загружается нормально, вторая перемещается (или «перебазируется»). Каждая DLL имеет раздел .reloc
, который содержит данные об обновлении ссылок в коде.
EXE
загружаются в 0x4000000
?
- person COMer; 18.09.2010
256MB
ОЗУ. Это возможно из-за виртуальной памяти (/Paging).
- person st0le; 18.09.2010
вы можете использовать Process Explorer, чтобы увидеть значение адресов ImageBase и Base. любого запущенного приложения (с его DLL). Основываясь на этих значениях, вы можете увидеть, произошло ли перебазирование.