Я прочитал несколько статей Мэтта Питрека о переносимых исполняемых файлах (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
по умолчанию?