ldd命令的作用是查看程序依赖的动态链接库信息。使用nm命令也可以获取库函数的信息;nm命令可以列出一个函数库文件中的符号表,它对静态的库函数和共享的库函数都能起作用。

Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。

可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。

通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。下面通过例2来说明本方法。

方法三:在编译目标代码时指定该程序的动态库搜索路径。

在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

当链接某个程序时,在运行期您可以指定另外的搜索路径。在 gcc 中,其 语法是 -Wl,-R/path。如果程序已经被链接,那么您也可以设置环境变量 LD_LIBRARY_PATH 来改变这一行为。通常只是在应用程序需要搜索的路径 不是系统级默认路径的一部分时才需要这样做,对大部分 Linux 系统来说,这种情况很少见。 理论上,Mozilla 用户可以发布某个使用这个路径设置所编译的二进制程序,但是他们 更倾向于发布包装器(wrapper)脚本,在启动可执行程序之前正确地设置程序库路径。

设置程序库路径可以为两个应用程序需要同一程序库的不兼容版本的这种罕见情况提供一个迂回解决方案。可以使用包装器脚本使某一应用程序在使用特殊版本程序库的目录中进行搜索。这称不上是一个 完美的解决方案,但是在某些情况下,这是您能采用的最佳方法。

如果出于不得已的原因需要为很多程序添加某个路径,那么也可以修改系统的默认搜索路径。通过 /etc/ld.so.conf 控制动态链接器,该文件包含默认搜索路径的列表。 对 LD_LIBRARY_PATH 中指定的任何路径的搜索都要先于 ld.so.conf 中列出的路径,所以用户可以覆盖这些设置。

大部分用户没有理由修改系统默认程序库搜索路径;通常环境变量更适用于修改搜索路径,比如 连接某个工具包中的程序库,或者使用某个程序库的较新版本的测试程序。

ldd的作用是打印可执行档依赖的共享库文件。它是glibc的一部分,由Roland McGrath和Ulrich Drepper维护:

$ ldd --version

ldd (GNU libc) 2.9

Copyright (C) 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Written by Roland McGrath and Ulrich Drepper.

但是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为必要环境变量,其他视具体情况。

更为详细的命令选项(或者参看man、info):

$ ldd --help

Usage: ldd [OPTION]... FILE...

--help              print this help and exit

--version           print version information and exit

-d, --data-relocs       process data relocations

-r, --function-relocs   process data and function relocations

-u, --unused            print unused direct dependencies

-v, --verbose           print all information

For bug reporting instructions, please see:

.

但是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。/lib/ld-linux.so.2还有其他一些选项:

1、--verify

2、--library-path PATH

3、--inhibit-rpath LIST

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,则跳过。

还有一些额外的环境变量可以参看man ld.so。

更为详细的内容:

1、man ldd(http://www.kernel.org/doc/man-pages/online/pages/man1/ldd.1.html)

2、man ldconfig(http://www.kernel.org/doc/man-pages/online/pages/man8/ldconfig.8.html)

3、man ld.so(http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html)

可以参见的文章:

1、Linux 动态库剖析(http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/)

2、剖析共享程序库http://www.ibm.com/developerworks/cn/linux/l-shlibs.html)

3、ldd命令的原理与使用方法(http://hi.baidu.com/wstone_h/blog/item/af67700a80a01e1594ca6b29.html)

ldd命令 ubuntu_ldd命令,查看依赖的动态库信息 nm命令可以列出一个函数库文件中的符号表...相关推荐

  1. 查看Linux当前操作系统版本信息常用命令

    查看Linux当前操作系统版本信息常用命令 Linux查看当前操作系统版本信息 Linux查看版本当前操作系统内核信息 linux查看版本当前操作系统发行信息 Linux查看cpu相关信息,包括型号. ...

  2. linux依赖关系查看命令,Linux下查看依赖关系

    我们在开发Linux程序时,经常会遇到查看自己的编译结果是否正常调用外部共享库,至少在编译结果能够查看到这层依赖关系.依赖关系有两种,一种是可执行文件依赖共享库,还有一种是共享库依赖共享库,查看方法如 ...

  3. 查看计算机ip地址配置信息的命令是,查看电脑配置指令大全

    查看电脑配置指令大全 windows 查看电脑配置指令大全 问题描述:查看电脑配置信息指令. 解决方案 1.查看电脑配置命令:dxdiag 2查看系统属性命令:sysdm.cpl 3.查看系统信息命令 ...

  4. linux保存动态进程信息,Linux 命令 - top: 动态显示进程信息

    命令格式 top -hv | -abcHimMsS -d delay -n iterations -p pid [, pid ...] 命令参数 -a 根据内存的使用排序. -b 以批处理模式操作. ...

  5. 查看依赖树_如何在基于 Ubuntu 或 Debian 的 Linux 发行版中查看一个软件包的依赖...

    但如果你想在安装一个软件包之前或之后知晓这个软件包的依赖,那该怎么办呢? 来源:https://linux.cn/article-12987-1.html 作者:Abhishek Prakash 译者 ...

  6. Windwos命令工作笔记002---windows下tree命令列出文件目录打印到文件中_过滤文件不知道怎么做啊

    技术交流QQ群[JAVA,.NET,BigData,AI]:170933152 挺好用,一直想记录下来的 windows下tree命令列出文件目录树 tree [path]  /f tree D:AR ...

  7. gradle 查看依赖类库版本_使用Gradle命令查看项目中库的依赖关系

    在Terminal中,可以通过 gradle 的命令查看项目中所使用库的版本,并且可以更加直观看到库之间的依赖关系.同时它们可以帮助您跟踪并解决与库版本冲突有关的任何问题.Building Andro ...

  8. Linux 命令之 hostnamectl -- 查看/修改当前主机的信息

    文章目录 命令介绍 常用选项 命令示例 (一)查看当前主机的信息 (二)设置当前主机的名称 命令介绍 hostnamectl 可用于查询和更改系统主机名和相关设置.此工具区分三种不同的主机名: 高级& ...

  9. linux查看时钟同步命令,Linux下查看设置时间及同步时间的命令

    linux系统内有两套时钟,一是硬件时钟,即CMOS中的时间,二是系统时钟,在系统初始化完成后,使用的就是系统时钟,两套时钟之间没有任何关联.linux中与时间相关的命令有date.hwclock.n ...

最新文章

  1. LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)
  2. 任意门怎么用团发_衣柜门选用什么材料好?小编在这里告诉你
  3. Java 遍历HashTable
  4. python exchangelib 删除邮件_Python exchangelib在子文件夹中读取邮件 - python
  5. Rocketmq vs Kafka
  6. 第十一届中国开源黑客松+中国程序员节重磅来袭,这里将有你不能错过的精彩。...
  7. 拖拽上传及读取文件实现
  8. android之普通蓝牙通信
  9. 利用“Java同包同名类执行顺序”取消Java 网站应用程序Licence验证
  10. php退款申请源码,PHP实现微信申请退款功能
  11. 学习笔记|Pytorch使用教程22(hook函数与CAM可视化)
  12. Python爬虫 抓取拉勾招聘信息
  13. 全球顶级的5个数据可视化案例
  14. e4a 安卓获取ROOT权限的方法思路 转载
  15. 快慢缓急总相宜|ONES 人物
  16. 图像处理之老照片特效
  17. 小程序发送 request请求失败 提示不在合法域名列表中的解决方法
  18. Linux访问Windows7共享文件夹
  19. 买《Kotlin从小白到大牛》专题视频课程,送配套纸质图书
  20. 偏微分方程 基础知识(线性偏微分方程+常系数线性偏微分方程) | 偏微分方程(一)

热门文章

  1. 如何有效避免mysql注入_sql注入方式及如何有效避免
  2. 掌握hiberate核心就够了
  3. Office word 为插入对象Aurora Equation设置快捷键
  4. python bool类型_python打印bool类型-女性时尚流行美容健康娱乐mv-ida网
  5. java计算机毕业设计音乐资源分享网站系统源码+数据库+系统+lw文档+部署
  6. zxing android 自定义,ZXing Android Embedded 的使用以及自定义布局 · 小憩之地
  7. android 渐变歌词,带你感受人间烟火四季渐变什么歌
  8. 增长黑客电子书pdf樊灯推荐
  9. 铜须事件女主角幽月儿首度发表声明
  10. CocosCreator-安装和运行模板项目