【问题标题】:C++: dlclose doesn't unload the shared libraryC++:dlclose 不卸载共享库
【发布时间】: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 是否列出了库?

标签: c++ shared dlopen


【解决方案1】:

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

另外RTLD_NODELETE(在dlopen上)使dlclose不卸载库。

由于您没有使用RTLD_NODELETE,很可能是由于RTLD_GLOBAL,加载的库使用了符号。

【讨论】:

  • “由于 RTLD_GLOBAL,加载的库使用符号”。确实,我在链接时嵌入了 .a 符号,这些符号可能被回调并阻止库关闭...我想我可以验证是否使用 dlopen(RTLD_NOLOAD) 卸载了一个库以检查库是否已正确卸载
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2012-02-06
  • 2012-10-07
相关资源
最近更新 更多