C 如何确定so文件是否已加载?
我有两个共享库:a.so和b.so a、 so必须在b.so加载之前加载。a.so可能由其他模块加载,而不是由我加载 因此,我想在调用C 如何确定so文件是否已加载?,c,linux,windows,dll,shared-libraries,C,Linux,Windows,Dll,Shared Libraries,我有两个共享库:a.so和b.so a、 so必须在b.so加载之前加载。a.so可能由其他模块加载,而不是由我加载 因此,我想在调用dlopen(“b.So,…)之前确定a.So是否已加载 在Windows下,我可以使用GetModuleHandle(“a.dll”)通过检查返回值来确定。即,如果返回值不为null,则已加载.dll;否则它还没有加载 Linux下是否有类似GetModuleHandle的函数?您可以使用RTLD\u NOLOAD标志来检查这一点: 不要加载库。这可用于测试库是
dlopen(“b.So,…)
之前确定a.So是否已加载
在Windows下,我可以使用GetModuleHandle(“a.dll”)
通过检查返回值来确定。即,如果返回值不为null,则已加载.dll;否则它还没有加载
Linux下是否有类似GetModuleHandle的函数?您可以使用RTLD\u NOLOAD
标志来检查这一点:
不要加载库。这可用于测试库是否已驻留(dlopen()
返回NULL
如果未驻留,或库的句柄(如果驻留)
在调用dlopen之前,确定是否已加载a.so
这几乎肯定是错误的做法(即,你问错了问题)
考虑一个多线程程序,您在线程1中提出上述问题(并得到肯定的答案),就像线程2调用dlclose(a_so\u句柄)
s并卸载a.so
相反,您可能会在线程1中得到否定的答案,就像线程2完成dlopen(“a.so”,…),并加载它一样
正确的做法是简单地执行dlopen(“a.so”,…);dlopen(“b.so”,…)代码>
如果a.so已加载,则第一个dlopen
将简单地增加其引用计数。如果尚未加载,则将加载
但我仍然想知道so在运行时的加载状态
你不能可靠地知道那种状态。您得到的答案是:a.so
当前可能已加载,也可能未加载。您可以使用dl\u iterate\u phdr
#define _GNU_SOURCE
#include <link.h>
int dl_iterate_phdr(
int (*callback) (struct dl_phdr_info *info,
size_t size, void *data),
void *data);
定义GNU源
#包括
int dl_迭代_phdr(
int(*回调)(结构dl_phdr_info*info,
尺寸(尺寸、空隙*数据),
作废*数据);
回调采用具有dlpi_名称成员的结构dl_phdr_info。dl\u iterate\u phdr(3)中有一个简单的例子,为什么不在加载a.so
时自己设置一个布尔变量呢?@JoachimPileborg,a.so可能由其他模块加载,而不是由我加载。那么为什么不简单地让b.so
依赖于a.so
,因此,当加载b.so
时,系统将自动加载a.so
。@JoachimPileborg,这确实是一个解决方案。但我仍然想知道so在运行时的加载状态。非常感谢,Joachim。这正是我想要的。@xmllmx虽然这正确地回答了原始问题,但问题本身表明您可能做错了什么。顺便说一句,在Windows上也是如此。
#define _GNU_SOURCE
#include <link.h>
int dl_iterate_phdr(
int (*callback) (struct dl_phdr_info *info,
size_t size, void *data),
void *data);