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.