Linux命令 ldd

Linux命令 ldd转载:Linux中的ldd命令和pvs命令ldd命令用于判断某个可执行的binary档案含有什么动态函式库。参数说明:–version  打印ldd的版本号-v–verbose  打印所有信息,例如包括符号的版本信息-d–data-relocs  执行符号重部署,并报告缺少的目标对象(只对ELF格式适用)-r–function-relocs  对目标对象和函数执行重

大家好,又见面了,我是你们的朋友全栈君。

转载: Linux中的ldd命令

ldd命令用于判断某个可执行的 binary 档案含有什么动态函式库。
参数说明:
–version  打印ldd的版本号
-v –verbose  打印所有信息,例如包括符号的版本信息
-d –data-relocs  执行符号重部署,并报告缺少的目标对象(只对ELF格式适用)
-r –function-relocs  对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用)
–help 用法信息
如果命令行中给定的库名字包含’/’,这个程序的libc5版本将使用它作为库名字;否则它将在标准位置搜索库。运行一个当前目录下的共享库,加前缀”./”。
错误:
ldd不能工作在a.out格式的共享库上。
ldd不能工作在一些非常老的a.out程序上,这些程序在支持ldd的编译器发行前已经创建。如果你在这种类型的程序上使用ldd,程序将尝试argc = 0的运行方式,其结果不可预知。

例如:
ldd /bin/bash

但是ldd本身不是一个程序,而仅是一个shell脚本:

$ which ldd
/usr/bin/ldd
$ file /usr/bin/ldd 
/usr/bin/ldd: Bourne-Again shell script text executable

ldd命令其实是依靠设置一些环境变量而实现的(也就是说ldd的作用只是设置一些环境变量的值)
如:LD_TRACE_LOADED_OBJECTS
只要设置其值非空即可。

$ export LD_TRACE_LOADED_OBJECTS=1
$ ls /usr
linux-gate.so.1 =>  (0xb7fac000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7f93000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb7f79000)
libacl.so.1 => /lib/libacl.so.1 (0xb7f70000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e0d000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7df4000)
/lib/ld-linux.so.2 (0xb7fad000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7df0000)
libattr.so.1 => /lib/libattr.so.1 (0xb7dea000)

撤销该环境变量,ls即又可以恢复正常使用:

$ unset LD_TRACE_LOADED_OBJECTS
$ ls  /usr/
bin  games  include  lib  lib32  lib64  local  sbin  share  src  X11R6

更多的环境变量:

1、LD_TRACE_LOADED_OBJECTS
2、LD_WARN
3、LD_BIND_NOW
4、LD_LIBRARY_VERSION
5、LD_VERBOSE
6、LD_DEBUG

ldd默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1
其他的变量(和值)分别对应一些选项:

-d, –data-relocs -> LD_WARN=yes
-r, –function-relocs ->LD_WARN和LD_BIND_NOW=yes
-u, –unused -> LD_DEBUG=”unused”
-v, –verbose -> LD_VERBOSE=yes
LD_TRACE_LOADED_OBJECTS为必要环境变量,其他视具体情况。

ldd命令的本质是执行了:/lib/ld-linux.so.*
我们可以从以上的内容中(ls /usr中)发现:/lib/ld-linux.so.2 (0xb7fad000)。

$ ls -l /lib/ld-linux.so.* 
lrwxrwxrwx 1 root root 9 2009-09-05 22:54 /lib/ld-linux.so.2 -> ld-2.9.so

刚编译后的文件可能是:/lib/ld.so。如果是libc5则是/lib/ld-linux.so.1, 而glibc2应该是/lib/ld-linux.so.2。

$ /lib/ld-linux.so.2  --list /bin/ls
linux-gate.so.1 =>  (0xb8050000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb8037000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb801d000)
libacl.so.1 => /lib/libacl.so.1 (0xb8014000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eb1000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e98000)
/lib/ld-linux.so.2 (0xb8051000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e94000)
libattr.so.1 => /lib/libattr.so.1 (0xb7e8e000)

我们可以看到以上等同于ldd ls。

ldd可以获得的共享库文件,其实是通过读取ldconfig命令组建起来的文件(/etc/ld.so.cache)。
默认的共享库文件搜索/lib优先于/usr/lib,而且也只有这个2个目录。如果想要加入其他路径,则需要通过ldconfig命令配置相关文件。
一般ld-linux.so会按照以下顺序搜索共享库:
1、DT_RPATH或DT_RUNPATH段
2、环境变量LD_LIBRARY_PATH
3、/etc/ld.so.cache文件中的路径,但如果可执行程序在连接时候添加了-z nodeflib选项,则跳过。
4、默认路径/lib和/usr/lib,但如果添加了-z nodeflib,则跳过。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133628.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux通配符的用法_通配符怎么使用

    linux通配符的用法_通配符怎么使用Linux通配符(转)[@more@]通配符1、基本的通配符有哪些?·“?”可替代单个字符。·“*”可替代任意字符。·方括号“[charset]”可替代charset集中的任何单个字符。对最后一条做些解释。[cChH]通配符便可替代c或h字符的大小写形式。通配符集还能描述介于字符对之间的所有字符。如“[a-z]”就可以代替任意小写字母,而[a-zA-Z]则可替代任意字母。注意可替代的字符包括字符包…

    2026年1月25日
    3
  • JVM参数解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC「建议收藏」

    -verbose:gc-XX:+printGC可以打印GC的简要信息[GC4790K->374K(15872K),0.0001606secs][GC4790K->374K(15872K),0.0001474secs][GC4790K->374K(15872K),0.0001563secs][GC4790K->374K(15872K),0.0…

    2022年4月16日
    58
  • modelsim10.0d破解问题「建议收藏」

    modelsim10.0d破解问题「建议收藏」前不久老师给我们布置一个题目,网络导纳测量,需要进行相位测量,需要用FPGA实现测频测相,于是开始上马ALTERA的FPGA学习,当然涉及到了quartus和modelsim的安装问题,我之前用的是quartus版本是II版本是11.1sp2,但是安装modelsim10.0c的时候老是出现路径不符合的提示,我在网上搜了很多帖子,别个都说是因为电脑的用户名或组织名是中文,导致无法破解,但是我查了我…

    2022年5月23日
    47
  • Struts2用AbstractInterceptor取代了AroundInterceptor

    Struts2用AbstractInterceptor取代了AroundInterceptorStruts2中绝大多数预建interceptor都从AbstractInterceptor扩展而来,AbstractInterceptor不在支持before、after两个抽象方法,取而代之的是intercept方法被抽象出来,交由子类去实现。其实大多数interceptor只会去实现before、after中的一个,这样就必须还要在ww中为另一个提供空方法,再由于线程安全问题WW…

    2022年5月14日
    37
  • opencv之Canny()函数

    opencv之Canny()函数概述Canny()函数可以使用canny算法对输入图像进行边缘检测。API说明C++API:voidcv::Canny(InputArrayimage,(输入图像:8-bit)OutputArrayedges,(输出边缘图像:单通道,8-bit,size与输入图像一致)double…

    2022年5月7日
    50
  • soap和wsdl区别说明

    soap和wsdl区别说明WebService实现业务诉求:WebService是真正“办事”的那个,提供一种办事接口的统称。WSDL提供“能办的事的文档说明”:对要提供的服务的一种描述格式。我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型。SOAP提供“请求”的规范:向服务接口传递请求的格式,包括方法和参数等。你想让人家办事,总得告诉人家你想干什么吧,SOAP就是定义这个“请求”的格式的,按…

    2022年7月24日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号