加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux 动态库的加载顺序

发布时间:2022-10-05 11:43:12 所属栏目:Linux 来源:
导读:  之前项目中遇到一种情况:binary加载了错误的so库,导致程序运行失败。后做了一些调研,将其记录一下:

  linux中查找binary依赖的动态库so,是有一定顺序的。

  按照上图所示,它会首先查找rpath路
  之前项目中遇到一种情况:binary加载了错误的so库,导致程序运行失败。后做了一些调研,将其记录一下:
 
  linux中查找binary依赖的动态库so,是有一定顺序的。
 
  按照上图所示,它会首先查找rpath路径下是否存在所需的so库,如果找到则直接返回,如果没有找到就按照LD_LIBRARY_PATH路径下接着查找,找到就直接返回。如果还是没有找到,就接着在ld.so.cache, /lib/, /usr/lib/路径下依次查找。如果都没有找到,就报错:xxx.so not found, 程序运行失败。
 
  在linux上进行编程,常常要明确不同程序/文件/动态库之间的依赖关系。此时,可以用以下工具集来明确:
 
  调试阶段,最常用的就是gdb,可以单步调试/加入断点/查看变量等等。在本地电脑运行成功linux 拖库,发布到其他电脑上运行失败,此时就有可能是目标主机上缺少程序所需的so库导致。这时,就可以用上面图片中所列出的工具进行排查错误。这里重点介绍strace, ldd,libtree,readelf,objdump这5个工具。
 
  strace 的用法:strace -fyyo test.txt -s 256 bin/xxx
 
  该工具会记录bin/xxx程序运行时的状态,将进程信息记录到test.txt文件中。
 
  ldd 的用法:ldd xxx
 
  该工具会将可执行程序xxx所依赖的so库列出来,包括so库所在路径(缺点:so库与so库之间的依赖关系不会列出来)。
 
  libtreee的用法:libtree xxx
 
  这个工具很强大,不仅可以列出来可执行程序xxx所需要的so库,同时也可以列出不同so库之间的依赖关系。以及so库的来源。

  readelf的用法:readelf -d xxx
 
  该工具也可以查看xxx所需的so库,同时查看rpath(缺点:没有列出so库所在的路径)
 
  objdump的用法: objdump -p xxx
 
  该工具与readelf功能类似, objdump与readelf这两个命令仅能静态的从程序看依赖项, 即列出xxx所直接依赖的so库,但是没有列出so库背后所依赖的动态库。
 
 
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!