C 如何确定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标志来检查这一点: 不要加载库。这可用于测试库是

我有两个共享库: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()
返回
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);