如何确定文件是否已经被加载?

我有两个共享库:a.so和b.so.

a.so必须在b.so加载之前加载。 而且,a.so可能由其他模块加载,而不是由我加载。

所以,我想确定在调用dlopen("b.so", ...)之前是否已经加载了dlopen("b.so", ...)

Windows下,我可以使用GetModuleHandle("a.dll")来确定通过检查返回值。 也就是说,如果返回值不为null,则加载了a.dll; 否则它尚未加载。

Linux下有一个GetModuleHandle函数吗?

实际上你可以用dlopen来检查这个,用RTLD_NOLOAD标志:

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

在我打电话给dlopen之前,确定a.so是否已经被加载

这几乎肯定是错误的事情(即你问错误的问题)。

考虑一个多线程程序,你可以在线程1中询问上面的问题(并得到肯定的答案),就像线程2调用dlclose(a_so_handle)并卸载a.so

相反,线程1中可能会得到否定的答案,就像线程2 完成 dlopen("a.so", ...)并加载它一样。

正确的做法是做dlopen("a.so", ...); dlopen("b.so", ...); dlopen("a.so", ...); dlopen("b.so", ...);

如果a.so已经被加载,第一个dlopen将简单地增加它的引用计数。 如果尚未加载,则会是。

但是我仍然想在运行时知道如此的加载状态。

你无法可靠地知道这个状态。 你得到的答案是: a.so可能或不可能被加载。

你可以使用dl_iterate_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); 

回调需要具有dlpi_name成员的struct dl_phdr_info。 在dl_iterate_phdr(3)中有一个简单的例子。