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