2012-02-08 4 views
6

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

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

+0

Вы хотите, чтобы отдельный экземпляр вашей DLL (и его глобального состояния)? –

+0

@DavidHeffernan Возможно, но только если это можно сделать и в Linux. Я больше пытаюсь прибить, как обычно работают вещи. Если то, что вы описали, возможно, мне было бы интересно узнать, как это сделать. –

+1

Он работает одинаково в операционных системах. Существует грязный трюк, чтобы получить отдельные экземпляры DLL. Каждый раз, когда вам нужен новый экземпляр, скопируйте файл во временное место и укажите ему уникальное имя. Таким образом вы вынуждаете систему загружать новый модуль. Я иногда использовал этот метод для работы с библиотеками, которые не являются потокобезопасными из-за плохого дизайна и использования глобального состояния. –

ответ

11

В документации говорится MSDN:

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

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

3

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

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

2

Для Linux совместно используемые объекты, из dlopen(3) manpage:

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

+0

это для каждого процесса или для всех процессов? – g19fanatic

+0

@ g19fanatic - для того же процесса. – cha0site

Смежные вопросы