Есть ли способ узнать количество ссылок на динамическую библиотеку в процессе? - PullRequest
5 голосов
/ 07 ноября 2011

Есть ли способ узнать количество ссылок на динамическую библиотеку в процессе? то есть в приложении многие модули могли загружать одну и ту же библиотеку, используя dlopen, и когда модуль выполняет dlclose, можем ли мы знать, действительно ли библиотека выгружается или ее ссылка просто уменьшается?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

со страницы руководства:

dlclose ()

Функция dlclose () уменьшает счетчик ссылок на дескрипторе динамической библиотеки. Если количество ссылок падает до нуля, и никакие другие загруженные библиотеки не используют в нем символы, динамическая библиотека выгружается.
Функция dlclose () возвращает 0 в случае успеха и ненулевое значение в случае ошибки.

Таким образом, подсчет ссылок выполняется автоматически, но тот факт, что этот вызов является последним и действительно выгружает библиотеку, не указывается. Вам нужно посчитать себя, если вам это нужно.

Или вы можете dlopen с RTLD_NOLOAD после dlclose:

Не загружайте библиотеку. Это можно использовать для проверки, является ли библиотека уже резидентной (dlopen () возвращает NULL, если это не так, или дескриптор библиотеки, если она является резидентной).

(Обратите внимание, что вам потребуется dlclose() еще раз, если вы получили ссылку. Это очень сложно, поэтому убедитесь, что все возможные манипуляции происходят в одном потоке или сериализуются.)

Вас может заинтересовать опция RTLD_NODELETE:

Не выгружать библиотеку во время dlclose (). Следовательно, статические переменные библиотеки не инициализируется повторно, если библиотека будет перезагружена с помощью dlopen () позднее. Этот флаг не указано в POSIX.1-2001.

0 голосов
/ 07 ноября 2011

Вы можете проверить, была ли библиотека удалена из адресного пространства процесса, проверив файл /proc/self/maps.

Боюсь, что это, вероятно, довольно специфично для Linux, но оно должно работать.

...