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.