动态库加载参考路径

发布时间 2023-05-31 16:46:11作者: woodx

在动态库链接器中,dlopen()用来打开一个动态库,并将其加载到进程的地址空间,完成初始化过程,它的C原型函数位

void * dlopen(const char * filename, int flag);

第一个参数是被加载动态库的路径,如果这个路径是绝对路径,则该函数将会尝试直接打开该动态库;如果是相对路径,那么dlopen()会尝试在以一定的顺序去查找该动态库文件:

1. 查找有环境变量 LD_LIBRARY_PATH指定的一系列目录。

 

2. 查找由/etc/ld.so.cache里面所指定的

 

3. /lib、/usr/lib 注意:这个查找顺序与旧的a.out装载器的顺序刚好相反,旧的a.out的装载器在装载共享库的时候会先查找/usr/lib,然后是/lib。

很有意思的是,如果我们将filename这个参数设置为0,那么dlopen返回的将是全局符号表的句柄,也就是说我们可以在运行时找到全局符号表里面的任何一个符号,并且可以执行它们,这有些类似高级语言反射特性。

 

补充:flag用来表示函数符号的解析方式,常量RTLD_LAZY表示使用延迟绑定,当函数第一次被用到时才进行绑定,即PLT机制;而RTLD_NOW表示当模块被加载完时即完成所有的函数绑定工资。