我有两个共享库: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)中有一个简单的例子。