ldd查看依赖关系

来源:互联网 发布:班车路线查询软件 编辑:程序博客网 时间:2024/05/22 13:08

通过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命令不可随便使用,它存在着潜在的危险,可以参考此文。

 

原创粉丝点击