LIBRARY_PATH和LD_LIBRARY_PATH
Linux gcc编译链接时的动态库搜索路径
GCC编译、链接生成可执行文件时,动态库的搜索路径就包含LIBRARY_PATH,具体的搜索路径顺序如下(注意不会递归性地在其子目录下搜索):
- gcc编译、链接命令中的-L选项;
- gcc的环境变量的LIBRARY_PATH(多个路径用冒号分割);
- gcc默认动态库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib。
执行二进制文件时的动态库搜索路径
链接生成二进制可执行文件后,运行该程序加载动态库文件时就会搜索包含LD_LIBRARY_PATH路径下的动态库,具体顺序如下:
- 编译目标代码时指定的动态库搜索路径:用选项-Wl,rpath和include指定的动态库的搜索路径,
比如gcc -Wl,-rpath,include -L. -ldltest hello.c,在执行文件时会搜索路径./include
; - 环境变量LD_LIBRARY_PATH(多个路径用冒号分割);
- 在 /etc/ld.so.conf.d/ 目录下的配置文件指定的动态库绝对路径(通过ldconfig生效,一般是非root用户时使用);
- gcc默认动态库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib等。
一些相关命令
ld
ld即链接器,使用gcc将源码编译成可执行文件时的最后一个步骤。ld.so
负责so文件(即动态库文件)的管理和加载
动态链接器/动态加载器 运行的时候会根据指定的路径去加载指定的库。
而命令ld.so相应的配置文件是/etc/ld.so.conf
Linux做法是把私有路径加入/etc/ld.so.conf、运行ldconfig生成ld.so.cache、ld.so会去查找这个cacheldd
list dynamic dependencies
列出动态库的依赖关系,也就是运行时需要加载的库nm
查看目标文件或可执行文件的符号
最后更新时间:
2022-06-07 11:44:57