继续上一篇《 linux下so动态库一些不为人知的秘密(中) 》介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH。
[stevenrao] $ g++ -o demo -L /tmp/ -ltmp main.cpp
[stevenrao] $ readelf -d demo
Dynamic section at offset 0xb98 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtmp.so]
....
0x000000000000000f (RPATH) Library rpath: [/tmp/]
另外还可以通过配置/etc/ld.so.conf,在其中加入一行
/tmp/
这个配置项也是只对运行期有效,并且是全局用户都生效,需要root权限修改,修改完后需要使用命令ldconfig 将 /etc/ld.so.conf 加载到ld.so.cache中,避免重启系统就可以立即生效。
除了前面介绍的那些搜索路径外,还有缺省搜索路径/usr/lib/ /lib/ 目录,可以通过-z nodefaultlib编译选项禁止搜索缺省路径。
[stevenrao] $ g++ -o demo -z nodefaultlib -L/tmp -ltmp main.cpp
[stevenrao] $ ./demo
./demo: error while loading shared libraries: libstdc++.so.6: cannot open shared object file
这么多搜索路径,他们有个先后顺序如下
1、RUMPATH 优先级最高
2、RPATH 其次
3、LD_LIBRARY_PATH
4、/etc/ld.so.cache
5、/usr/lib/ /lib/
查看一个程序搜索其各个动态库另一个简单的办法是使用 LD_DEBUG这个环境变量;
[stevenrao] $ export LD_DEBUG=libs
[stevenrao] $ ./demo
下一篇介绍动态库内符号问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2013-07-25 atoi 和itoa用法
2012-07-25 jQuery.getJSON的缓存问题的解决办法
2012-07-25 MFC Tab Control控件的详细使用