C ++:dlclose不会卸载共享库

时间:2012-01-09 17:15:26

标签: c++ shared dlopen

我使用dlopen加载了共享库(带有标记RTLD_NOW | RTLD_GLOBAL)。 如果此库正在使用主程序中的函数,则它不会卸载。所以我最终得到了这个共享库的相同代码,即使我卸载(使用dlclose),更改,编译,(重新)加载它。

我的目标实际上是在对其进行更改后重新加载相同的库,这样我就不必重新启动整个程序来测试我的代码。

我在Linux Ubuntu 10.04上使用g ++ 4.2.3。

(编辑)

解决:

“加载的库使用符号,因为RTLD_GLOBAL”。事实上,我在链接时嵌入了另一个.a嵌入的符号,可能会被回调并阻止我的库关闭...... 我认为可以验证使用dlopen(...,RTLD_NOLOAD)卸载的lib来检查库是否已正确卸载。

1 个答案:

答案 0 :(得分:4)

函数dlclose()减少动态库句柄上的引用计数。如果引用计数降为零且没有其他已加载的库在其中使用符号,则卸载动态库。

同样,RTLD_NODELETE(在dlopen之后)使dlclose不能卸载库。

由于您尚未使用RTLD_NODELETE,因此最有可能的是,由于RTLD_GLOBAL,加载的库会使用符号。