Загружается ли DLL полностью или только некоторые функции?

когда программа использует динамическую общую библиотеку, загружает ли она DLL полностью (так что вы можете почти стереть DLL с диска во время работы приложения) или загружает только часть DLL в соответствии с ее потребностями каждый раз во время выполнения приложения?

3 ответов


DLL загружается полностью. Dll такие же, как EXEs в почти все аспекты; единственный большой разница между ними в том, что DLL не являются исполняемыми. У него нет - запуск программы.


Я не знаю, как детали работают в Windows (в Linux я знаю ответственный код в ядре довольно хорошо), но, по крайней мере, в системах *nix удаление записи файловой системы оставляет содержимое файла нетронутым, пока на нем открыты файловые дескрипторы/дескрипторы.; только после закрытия последнего файлового дескриптора/дескриптора блоки на устройстве хранения могут быть перезаписаны. Windows сертифицирована POSIX, поэтому она следует этому поведению.

библиотеки не загружается в предварительно памяти. Они памяти. Это вызывает вид обратной памяти подкачки. Вместо замены ОЗУ на диск содержимое файла сопоставляется с адресным пространством процесса и попадает в ОЗУ через дисковый/файловый кэш. То же самое касается общих объектов в операционных системах *nix. Но есть существенные различия между системами Windows и *nix, которые имеют дело с перемещениями, экспортом символов и т. д.


он загружается полностью, как было указано. Особая часть не в том, что вы не можете run DLL, это то, что страницы памяти DLL обычно совместно используются через границы процесса.

Если процесс пытается записать на страницу, копия этой страницы берется, и копия видна только этому процессу (она называется copy-on-write).

DLL-это PE-файлы (т. е. такие же, как драйверы NT или программы Win32). Они загружаются аналогично .файл EXE в файлы, сопоставленные с памятью (MMFs или "разделы" на языке режима ядра). Это означает, что DLL-файл поддерживает MMF, представляющий загруженную DLL. Это то же самое, что и при передаче допустимого дескриптора файла (не INVALID_HANDLE_VALUE) для CreateFileMapping, и это также (часть) причина, почему вы не можете удалить DLL, пока он используется.

кроме того, есть некоторые библиотеки DLL, которые не содержат кода вообще. Такая DLL также может быть загружена в процесс, который не был сделан для того же самого процессор. Е. Г. архитектура x86 DLL ресурсов загружает нормально в приложения x64.