Загружена ли DLL полностью или только некоторые функции? - PullRequest
6 голосов
/ 24 февраля 2011

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

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011

DLL загружается полностью. DLL такие же, как EXE в почти во всех аспектах; единственная большая разница между ними заключается в том, что DLL не являются исполняемыми. У него нет функции main() - запуск программы .

2 голосов
/ 24 февраля 2011

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

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

0 голосов
/ 24 февраля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...