9

有没有办法找出进程中对动态库的引用数量?即在一个应用程序中,许多模块可能已经使用 dlopen 加载了同一个库,当一个模块执行 dlclose 时,我们能否知道该库是真的被卸载了还是它的引用只是被递减了?

4

2 回答 2

5

从手册页:

dlclose()

函数 dlclose()减少动态库句柄句柄上的引用计数。如果引用计数降至零并且没有其他加载的库在其中使用符号,则卸载动态库。
函数 dlclose() 成功时返回 0,错误时返回非零值。

所以引用计数是自动完成的,但是没有指出这个调用是最后一个调用并且确实卸载了库这一事实。如果你需要,你需要自己计算。

或者你可以dlopenRTLD_NOLOAD后面加上dlclose

不要加载库。这可用于测试库是否已驻留(如果不是,则 dlopen() 返回 NULL,或者如果库是驻留的,则返回库的句柄)。

(请注意,dlclose()如果您有引用,则需要再次执行此操作。这很有趣,因此请确保所有潜在的操作都发生在单个线程中或已序列化。)

您可能对以下RTLD_NODELETE选项感兴趣:

不要在 dlclose() 期间卸载库。因此,如果稍后使用 dlopen() 重新加载库,则不会重新初始化库的静态变量。POSIX.1-2001 中未指定此标志。

于 2011-11-07T06:58:39.013 回答
0

您可以通过检查文件来检查库是否已从进程地址空间中取消映射/proc/self/maps

恐怕这可能是特定于 linux 的,但它应该可以工作。

于 2011-11-07T13:58:46.100 回答