По крайней мере, кто-то сказал что-то о переездах :). Кстати, когда происходит перемещение, эти страницы помечаются как частные / недоступные. Таким образом, перемещение очень дорого из памяти и времени (изменение кода для нового адреса).

прочитал несколько статей Мэтта Пьетрека о файлах Portable Executable (PE), например:

Углубленный взгляд на формат исполняемых файлов Win32,Часть 1 а такжеЧасть 2Статья MSJ о линкерахСтатья MSJ о формате COFF

Кроме того, я прочитал несколько других источников на эту тему. Это либо я пропускаю некоторые части, либо вопросы там не отвечают.

Итак, вот вопросы:

Известно, что при загрузке EXE загрузчик Windows считывает список импортированных DLL-файлов из таблицы адресов Importa (IAT) и загружает их в адресное пространство процесса.

Адресное пространство процесса является виртуальным пространством. Возможно, DLL уже загружена в какое-то физическое пространство. Это происходит для DLL, какKERNEL32.dll или жеUSER32.dll, Какова связь между физическим и виртуальным адресом? Загрузчик просто распределяет страницы и копирует DLL или делает ссылки?

Если DLL не загружена, загрузчик загружает всю DLL или только необходимые функции? Например, если вы использовали функциюfoo() изbar.dllзагружает ли загрузчик весьbar.dll в адресное пространство процесса? Или это просто загрузитьfooкод в адресное пространство процесса?

Предположим, ваш EXE-файл использует функциюMessageBox() изUSER32.DLLкоторый находится в%WINDIR%\system32\user32.dll, Можете ли вы разработать индивидуальныеUSER32.DLL, поместите его в тот же каталог, что и ваш EXE-файл, и ожидайте, что ваш настроенныйMessageBox вызывается вашим приложением, а не системой по умолчаниюMessageBox?

Ответы на вопрос(2)

Ваш ответ на вопрос