您的位置:首页 > 运维架构 > Shell

ldd查看依赖关系

2010-09-29 00:50 381 查看
通过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命令不可随便使用,它存在着潜在的危险,可以参考此文

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  library linux shell 脚本 path c
相关文章推荐