有没有办法找出进程中对动态库的引用数量?即在一个应用程序中,许多模块可能已经使用 dlopen 加载了同一个库,当一个模块执行 dlclose 时,我们能否知道该库是真的被卸载了还是它的引用只是被递减了?
问问题
3370 次
2 回答
5
从手册页:
dlclose()
函数 dlclose()减少动态库句柄句柄上的引用计数。如果引用计数降至零并且没有其他加载的库在其中使用符号,则卸载动态库。
函数 dlclose() 成功时返回 0,错误时返回非零值。
所以引用计数是自动完成的,但是没有指出这个调用是最后一个调用并且确实卸载了库这一事实。如果你需要,你需要自己计算。
或者你可以dlopen
在RTLD_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 回答