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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bzero memset_arctan3分之1

    bzero memset_arctan3分之1bzero函数函数原型:voidbzero(void*s,intn);头文件:#include<string.h>功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。返回值:无返回值例子:将一个数组清零:charstr[10];bzero(str,sizeof(str));也可以将一个结构体清零:structnode{…

    2022年10月13日
    5
  • 人工智能学习路线

    阶段一、人工智能基础- 高等数学必知必会本阶段主要从数据分析、概率论和线性代数及矩阵和凸优化这四大块讲解基础,旨在训练大家逻辑能力,分析能力。拥有良好的数学基础,有利于大家在后续课程的学习中更好的理解机器学习和深度学习的相关算法内容。同时对于AI研究尤为重要,例如人工智能中的智能很大一部分依托“概率论”实现的。一、数据分析1)常数e2)导数3)梯度4)Taylor5)gini系数6)信息熵与…

    2022年4月9日
    1.3K
  • Java 二维数组转换成List<List<String>>[通俗易懂]

    Java 二维数组转换成List<List<String>>[通俗易懂]在拿到二维数组的数据时,需要将它转换成嵌套的list,如下工具类:importjava.util.ArrayList;importjava.util.List;/***将二维数组转换成List>形式工具**@authorqiulinhe**2017年3月1日下午3:09:52*/publicclassArrayToListTe

    2022年6月20日
    193
  • javascript高级程序设计第四版pdf百度网盘_js高级程序设计第四版 pdf下载

    javascript高级程序设计第四版pdf百度网盘_js高级程序设计第四版 pdf下载需要的请私信.涉及版权无法直接上传

    2022年8月20日
    8
  • clob类型类似MySQL_Oracle中Clob类型处理解析

    clob类型类似MySQL_Oracle中Clob类型处理解析系统环境 xp 2 0 oracle9i 表结构 由于是测试 表结构随便建了一张 XX 字段名类型 IDVARCHAR2 70 TESTCLOB 测试方式 1 直接将 CLOB 的值拼写在 SQL 语句中 代码 stringid Guid NewGuid ToString OracleComman Conn CreateComman cmd CommandText inse

    2025年7月4日
    3
  • 查看java进程命令_linux查看进程grep

    查看java进程命令_linux查看进程grep在LINUX命令平台输入1-2个字符后按Tab键会自动补全后面的部分(前提是要有这个东西,例如在装了tomcat的前提下,输入tomcat的to按tab)。Linux查看进程ps命令用于查看当前正在运行的进程grep是搜索例如:ps-ef|grepjavaLinux查看进程ps命令表示查看所有进程里CMD是java的进程信息ps-aux|grepjava

    2022年8月23日
    5

发表回复

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

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