【发布时间】:2012-02-06 05:17:39
【问题描述】:
我有一个使用 dlopen 加载的共享库(带有标志 RTLD_NOW | RTLD_GLOBAL )。
如果此库正在使用主程序中的函数,则不会卸载。所以我最终得到了这个共享库的相同代码,即使我卸载(使用dlclose)、更改、编译、(重新)加载它。
我的目标实际上是在对同一个库进行更改后重新加载它,这样我就不必重新启动整个程序来测试我的代码。
我在 Linux Ubuntu 10.04 上使用 g++ 4.2.3。
(编辑)
已解决:
“由于 RTLD_GLOBAL,加载的库使用符号”。事实上,我在链接时嵌入了另一个 .a 的符号,这些符号可能被回调并阻止我的库关闭...... 我认为可以验证使用 dlopen(...,RTLD_NOLOAD) 卸载的库是否已正确卸载。
【问题讨论】:
-
你要释放你的 dll 的句柄吗?
-
您可能需要更具体地了解您使用的平台(Linux?)和版本。这类问题可能很重要。
-
@Komyg:我正在使用 dlclose(handle),所以我假设句柄已被释放...
-
@Jonathan:我在 linux ubuntu 10.04 上使用 g++ 4.2.3
-
您可能想关注Unload dynamic library needs two dlclose calls,它是相关的,但绝对不是直接复制,因为它指的是 MacOS X。您的可执行文件是否有可能加载该库?
ldd your_executable是否列出了库?