dynamic加载时的库path?

如何从库本身获取共享库的path?

换句话说,让我们说库X使用dlopen()加载,我怎样才能访问从库本身加载所述库的path?

请注意,我不能让首先加载库的代理将此parameter passing给我。

更新:这是用静态variables的方式:

 std::string wdir; namespace { class dynamic_library_load_unload_handler { public: dynamic_library_load_unload_handler(){ Dl_info dl_info; dladdr((void *) NP_Initialize, &dl_info); std::string path(dl_info.dli_fname); wdir = path.substr( 0, path.find_last_of( '/' ) +1 ); } ~dynamic_library_load_unload_handler(){ // Code to execute when the library is unloaded } } dynamic_library_load_unload_handler_hook; } 

动态链接器实际上搜索几个地方来找到每个动态库。 这些包括(来自man ld.so):

  • 由环境变量LD_LIBRARY_PATH给出的路径
  • 烘焙到二进制文件中的路径加载DT_RUNPATH条目下的库
  • 缓存文件/etc/ld.so.cache
  • / lib和/ usr / lib

如果你想获得一个特定的共享库的路径,我会推荐dladdr函数。 从手册页:

函数dladdr()接受一个函数指针,并试图解析它所在的名字和文件。 信息存储在Dl_info结构中:

 typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info; 

如果找不到符号匹配地址,则dli_snamedli_saddr被设置为NULL

dladdr()在错误时返回0,在成功时不为零。

所以你只要给它一个函数指针,它会给你提供它的文件的名称和一堆其他信息。 所以举例来说,你可以在库中有一个构造函数调用它自己来找出库的完整路径:

 #define _GNU_SOURCE #include <dlfcn.h> #include <stdio.h> __attribute__((constructor)) void on_load(void) { Dl_info dl_info; dladdr((void *)on_load, &dl_info); fprintf(stderr, "module %s loaded\n", dl_info.dli_fname); } 

这个函数也可以在OS X上使用相同的语义。