Загрузить DLL больше, чем один раз? - PullRequest
9 голосов
/ 08 февраля 2012

Я использую функцию LoadLibrary для загрузки DLL в Windows. У меня такой вопрос: если я вызову этот метод более одного раза для одной и той же DLL, получу ли я дескрипторы для разных экземпляров DLL, или все они будут ссылаться на один и тот же экземпляр?

Кроме того, как это поведение соотносится с файлами Linux SO, оно одинаковое или совершенно другое, и какие предположения я могу сделать в этом отношении? Спасибо.

Ответы [ 3 ]

12 голосов
/ 08 февраля 2012

Документация MSDN гласит:

Система ведет подсчет ссылок для каждого загруженного процесса. модули. Вызов LoadLibrary увеличивает счетчик ссылок. призвание функция FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от счетчик ссылок).

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

3 голосов
/ 08 февраля 2012

Для общих объектов Linux, из dlopen(3) справочной страницы :

Если та же библиотека загружается снова с dlopen(), тем же файлом дескриптор возвращается . Библиотека dl поддерживает количество ссылок для дескрипторы библиотеки, поэтому динамическая библиотека не освобождается до dlclose() вызывался столько раз, сколько dlopen() удалось на этом . Процедура _init(), если имеется, вызывается только один раз . Но последующий вызов с RTLD_NOW может вызвать разрешение символа для библиотека, ранее загруженная RTLD_LAZY.

3 голосов
/ 08 февраля 2012

Если DLL уже загружена, LoadLibrary просто вернет адрес библиотеки в памяти. Однако DllMain не вызывается снова с DLL_PROCESS_ATTACH при попытке второй загрузки. Дескрипторы в смысле библиотек - это просто области памяти, поэтому значение, которое вы получаете во второй раз, должно быть таким же, как и в первом.

Что касается файлов linux SO, я не понимаю, почему они тоже будут загружаться дважды. Однако кому-то еще придется взвесить это, чтобы дать вам правильный ответ.

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