ldd查看依赖关系

转载地址:https://blog.csdn.net/cha_echo/article/details/5913210

通过readelf 或者objdump可以查看某一个可执行文件所依赖的共享库,而且这些共享库都是作为SONAME记录在ELF动态节的NEEDED上。

首先,我们看一下名词soname:

在linux上共享库都是以文件的形式来存放,而每一个共享库都被赋予了一个特别的名称,linux称之为soname。它包括了共享库的名称和版本号.然而这个soname只是一个软连接,它指向的文件才是真正的库文件。例如/lib/libc.so.6就是一个soname,它指向了 libc-2.10.1.so。这个软连接是由ldconfig创建的,ldconfig默认情况下会搜索/etc/ld.so.conf,里面有存放.so.x.x库文件的目录,ldconfig会遍历这些目录然后对它下面的库建立软连接。

下面用例子来看库的依赖关系:

zecho@zecho-laptop:~$ readelf -d /bin/ls
Dynamic section at offset 0x1af04 contains 24 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [librt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libselinux.so.1]
 0x00000001 (NEEDED)                     Shared library: [libacl.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

如上所示,NEEDED里记录的是库SONAME,如果要查找实际的文件,则在/usr/lib, /lib下如存在soname的文件. 或者在LD_LIBRARY_PATH里指定查找路径; 若是在/etc/ld.so.cache里有实际库文件的信息。

当然,上面的共享库还可能依赖于其他库.比如librt.so.1

zecho@zecho-laptop:~$ readelf -d /lib/librt.so.1 
Dynamic section at offset 0x6ee8 contains 27 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [ld-linux.so.2]
 0x0000000e (SONAME)                     Library soname: [librt.so.1]
 

如果要找到/bin/ls所依赖的所有库文件,是一件很麻烦的事,所以就有了ldd命令。

zecho@zecho-laptop:~$ ldd /bin/ls
    linux-gate.so.1 =>  (0x00dce000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00b70000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00623000)
    libacl.so.1 => /lib/libacl.so.1 (0x00185000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001cd000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x008dc000)
    /lib/ld-linux.so.2 (0x001b0000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x007d6000)
    libattr.so.1 => /lib/libattr.so.1 (0x00c2d000)
 

 这里就列出所有/bin/ls所依赖的共享库。实际上,ldd只是一个shell脚本。重点是LD_TRACE_LOADED_OBJECTS,把环境变量LD_TRACE_LOADED_OBJECTS设定为1来执行程序

zecho@zecho-laptop:~$ LD_TRACE_LOADED_OBJECTS=1 /bin/ls
    linux-gate.so.1 =>  (0x00d35000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00aa9000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00c17000)
    libacl.so.1 => /lib/libacl.so.1 (0x00abe000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00e27000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00926000)
    /lib/ld-linux.so.2 (0x001f5000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00fb9000)
    libattr.so.1 => /lib/libattr.so.1 (0x00816000)
 

但是ldd命令不可随便使用,它存在着潜在的危险,可以参考此文。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值