是否有方法在运行时确定哪些共享库已加载到当前进程的全局符号命名空间中?我主要对使用dlopen()
标志的RTLD_GLOBAL
调用加载的任何内容感兴趣。
我想这样做是为了审计目的——对于我工作的应用程序来说,重要的是尽可能使用dlopen
'sRTLD_LOCAL
加载动态加载的共享库,以免与第三方代码冲突;加载到全局符号命名空间中的任何内容都需要严格控制。
我看过dl_iterate_phdr()
API,但它似乎不包含此信息。
最佳答案
你可以试试
#define _GNU_SOURCE
#include <dlfcn.h>
typedef void *(*orig_dl)(const char *file, int mode);
void *dlopen(const char *file, int mode)
{
orig_dl o_dlopen;
o_dlopen = (orig_dl)dlsym(RTLD_NEXT, "dlopen");
return o_dlopen(file, mode);
}
使用
gcc -shared -fPIC dlo.c -o dlo.so -ldl
编译它加上
LD_PRELOAD=dlo.so
就可以了。您可以使用特定模式记录/跟踪/打印任何dlopen使用关于linux - 枚举通过dlopen(RTLD_GLOBAL)加载的共享库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46689348/