我有一个使用dlopen(带有标志RTLD_NOW | RTLD_GLOBAL)加载的共享库.如果此库正在使用主程序中的函数,则它不会卸载.所以我最终得到了这个共享库的相同代码,即使我卸载(使用dlclose),更改,编译,(重新)加载它.
我的目标实际上是在对其进行更改后重新加载相同的库,这样我就不必重新启动整个程序来测试我的代码.
我在Linux Ubuntu 10.04上使用g ++ 4.2.3.
(编辑)
解决了:
"由于RTLD_GLOBAL,"加载的库使用符号".实际上,我在链接时嵌入了另一个.a嵌入的符号,可能会被回调并阻止我的库关闭...我认为可以使用dlopen(...,RTLD_NOLOAD)验证是否已卸载lib以检出库已正确卸载.
该函数dlclose()减少动态库句柄上的引用计数。如果引用计数降至零并且没有其他加载的库使用其中的符号,则卸载动态库。
RTLD_NODELETE(on dlopen)也使得dlclose不卸载库。
由于您没有使用过RTLD_NODELETE,最有可能的是加载的库使用了由于RTLD_GLOBAL.