免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4118 | 回复: 3
打印 上一主题 下一主题

ldd 显示的库依赖关系能显示出嵌套关系吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-01 19:04 |只看该作者 |倒序浏览
ldd 显示的库依赖关系能显示出层次嵌套顺序吗
用ldd查看某库文件liba.so调用的其他库,显示的多个依赖库的顺序是表示liba.so先后调用库的先后顺序吗.如果liba.so调用libb.so,libb.so调用libc.so,这时用ldd能显示这种嵌套的依赖关系吗

论坛徽章:
0
2 [报告]
发表于 2011-04-02 09:49 |只看该作者
顶一下

论坛徽章:
0
3 [报告]
发表于 2011-04-02 10:00 |只看该作者
本帖最后由 南极雨 于 2011-04-02 10:02 编辑

回复 1# fortuneteller

不能!只显示直接调用的
ldd可以显示一个可执行程序所依赖的动态库,但间接依赖库无法显示出来
[root@ root]# ldd /bin/ls
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40022000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
strace工具是一个调试工具,它可以显示出一个程序在执行过程中的所有系统调用,
[root@ root]# strace -eopen /bin/ls >/dev/null
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libtermcap.so.2", O_RDONLY) = 3
open("/lib/tls/libc.so.6", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
open("/etc/mtab", O_RDONLY) = 3
open("/proc/meminfo", O_RDONLY) = 3

strace -o out telnet 192.168.100.100
o参数的含义是将strace的输出信息生成到out文件中,这个文件名是可以随意制定的。
我们打开out文件会发现大量的系统调用信息,我们关心的主要是open这个系统调用的信息,open是用来打开文件的,不仅调用动态库要先用open打开,读取配置文件也使用open,所以用sed写一个简单的脚本就可以输出out文件中所有的open信息
sed -n -e ‘/^open/p’ out
输出信息如下:
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libutil.so.1", O_RDONLY) = 3
open("/usr/lib/libncurses.so.5", O_RDONLY) = 3
open("/lib/i686/libc.so.6", O_RDONLY) = 3
open("/etc/resolv.conf", O_RDONLY) = 3
open("/etc/nsswitch.conf", O_RDONLY) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libnss_files.so.2", O_RDONLY) = 3
open("/etc/services", O_RDONLY) = 3
open("/etc/host.conf", O_RDONLY) = 3
open("/etc/hosts", O_RDONLY) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libnss_nisplus.so.2", O_RDONLY) = 3
open("/lib/libnsl.so.1", O_RDONLY) = 3
open("/var/nis/NIS_COLD_START", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libnss_dns.so.2", O_RDONLY) = 3
open("/lib/libresolv.so.2", O_RDONLY) = 3
open("/etc/services", O_RDONLY) = 3
open("/root/.telnetrc", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/terminfo/l/linux", O_RDONLY) = 4
从输出中可以发现ldd显示不出来的几个库
/lib/libnss_dns.so.2 ,
/lib/libresolv.so.2 ,
/lib/libnsl.so.1,
/lib/libnss_nisplus.so.2,
/lib/libnss_files.so.2

strace -o aa -ff -p PID会产生aa名称开头的多个文件

grep open aa* | grep -v -e No -e null -e denied| grep WR 查看其打开调用的文件信息。

论坛徽章:
0
4 [报告]
发表于 2011-04-02 17:31 |只看该作者
如果不看系统调用 而是看某程序包内自己的库调用情况怎么看呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP