C++: dlclose не выгружает общую библиотеку
у меня есть общая библиотека загружается через dlopen
(с флагами RTLD_NOW | RTLD_GLOBAL
).
Если эта библиотека использует функции из основной программы, то она не выгружается. Поэтому я получаю тот же код для этого общего lib, даже если я выгружен (используя dlclose
), изменен, скомпилирован, (re) загрузите его.
моя цель-перезагрузить ту же библиотеку после внесения в нее изменений, чтобы мне не пришлось перезапускать всю программу для проверки моего кода.
Я использую g++ 4.2.3, on Linux Ubuntu 10.04.
(редактировать)
решила:
"загруженная библиотека использует символ из-за RTLD_GLOBAL". Действительно, у меня были символы другого .встроенный при связывании, которые, вероятно, были отозваны и предотвращают закрытие моей библиотеки... Я думаю, что можно проверить, что lib выгружен с помощью dlopen(..., RTLD_NOLOAD), чтобы проверить, что библиотека выгружена правильно.
1 ответов
функции dlclose()
уменьшает количество ссылок на дескриптор динамической библиотеки. Если счетчик ссылок падает до нуля и никакие другие загруженные библиотеки не используют символы в нем, динамическая библиотека выгружается.
и RTLD_NODELETE
(после dlopen
) составляет dlclose
не выгружать библиотеки.
так как вы не использовали RTLD_NODELETE
, наиболее вероятно, что загруженная библиотека использует символ из-за RTLD_GLOBAL
.