Linux 动态库的加载顺序
发布时间:2022-10-05 11:43:12 所属栏目:Linux 来源:
导读: 之前项目中遇到一种情况:binary加载了错误的so库,导致程序运行失败。后做了一些调研,将其记录一下:
linux中查找binary依赖的动态库so,是有一定顺序的。
按照上图所示,它会首先查找rpath路
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库背后所依赖的动态库。 (编辑:开发网_新乡站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐