我熟悉使用dlopen()检查共享库是否已经使用先前调用dlopen()加载到进程中,如果不存在则不会触发加载,如下所示:
void* lib = dlopen(lib_name, RTLD_NOLOAD);
if (lib != NULL) {
...
}
我最近尝试应用相同的模式来确定是否已使用LD_PRELOAD将少数共享库中的一个加载到进程空间中.但是在所有情况下,上面提到的对dlopen()的调用都返回NULL.
所以基本上,如果我使用这个命令行启动进程
LD_PRELOAD=libawesome.so ./mycoolprocess
然后在mycoolprocess.c中的代码中运行以下检查
void* has_awesome = dlopen("libawesome.so", RTLD_NOLOAD);
if (has_awesome != NULL) {
printf("libawesome is available\n");
}
无论是否使用LD_PRELOAD加载共享库,对dlopen()的调用始终返回NULL.根据Andrew Henle在下面的评论,我也尝试使用其中一个重新加载的共享对象的绝对路径调用dlopen,但是在这种情况下dlopen仍会返回NULL,尽管共享对象是预加载的.
所以我的问题是双重的:
>上述模式是否适用于使用LD_PRELOAD加载的库?
>是否有另一种方法让进程确定是否已预加载特定的共享库?