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会遍历这些目录然后对它下面的库建立软连接。
下面用例子来看库的依赖关系:
如上所示,NEEDED里记录的是库SONAME,如果要查找实际的文件,则在/usr/lib, /lib下如存在soname的文件. 或者在LD_LIBRARY_PATH里指定查找路径; 若是在/etc/ld.so.cache里有实际库文件的信息。
当然,上面的共享库还可能依赖于其他库.比如librt.so.1
如果要找到/bin/ls所依赖的所有库文件,是一件很麻烦的事,所以就有了ldd命令。
这里就列出所有/bin/ls所依赖的共享库。实际上,ldd只是一个shell脚本。重点是LD_TRACE_LOADED_OBJECTS,把环境变量LD_TRACE_LOADED_OBJECTS设定为1来执行程序
但是ldd命令不可随便使用,它存在着潜在的危险,可以参考此文。
首先,我们看一下名词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命令不可随便使用,它存在着潜在的危险,可以参考此文。
相关文章推荐
- Linux/shell命令的实际应用——ldd查看可执行程序依赖的库文件
- 最强查看依赖关系脚本
- 创建package和查看package的依赖关系
- 再谈CLR:查看程序集的依赖关系
- 如何查看.so文件的依赖关系
- 查看数据库对象间的依赖关系
- Android下怎么使用LDD查看依赖库
- eclipse查看pom.xml中jar包依赖关系
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- repoquery详解——linux查看包依赖关系的神器
- ldd命令查看动态库依赖的库
- Yocto tips (13): Yocto 查看软件包的依赖关系
- Android studio 如何查看 library 间的依赖关系
- linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:
- eclipse 配置spring IDE详解(配置好以后可以查看bean的依赖关系,很清晰。而且在xml中写bean的时候可以自动提示引用类路径等)
- SQL Server 用SSMS查看依赖关系有时候不准确,改用代码查
- ldd查看可执行程序的依赖库
- ORACLE PACKAGE中查看包的依赖关系
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- Dll依赖与被依赖关系查看工具【1】