动态链接器实际上搜索几个位置以找到每个动态库。其中包括(来自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; void *dli_fbase; const char *dli_sname; void *dli_saddr; } Dl_info;如果找不到与符号匹配的地址,则将
dli_sname和dli_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 loadedn", dl_info.dli_fname);}此功能也可以在具有相同语义的OS X上使用。



