По крайней мере, кто-то сказал что-то о переездах :). Кстати, когда происходит перемещение, эти страницы помечаются как частные / недоступные. Таким образом, перемещение очень дорого из памяти и времени (изменение кода для нового адреса).
прочитал несколько статей Мэтта Пьетрека о файлах 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
?