当前位置: 首页 > news >正文

学习一个 Linux 命令: ldd 命令

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

Tough people aren't born that way, they become that way when no one's there to wipe their tears away. 

人并非生来就坚强,没人替自己擦泪,就只能变得坚强。

每日掏心话

你要知道,人生并没有那么多的公平可言。人生走过一段路,风景毕竟不相同。

责编:乐乐 | 来自:恋猫大鲤鱼

链接:blog.csdn.net/K346K346/article/details/89062163

编程技术圈(ID:study_tech)第 1160 次推文

往日回顾:基于SSM框架实现的支付宝支付功能

     

   正文   

1.命令简介

ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。

注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:

which ldd
/usr/bin/ldd

我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。

相关环境变量有:

LD_TRACE_LOADED_OBJECTS
LD_WARN
LD_BIND_NOW
LD_LIBRARY_VERSION
LD_VERBOSE
LD_DEBUG

ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。

也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。

其他的变量的设置与ldd命令选项的对应关系如下:

-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环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。

测试如下:

export LD_TRACE_LOADED_OBJECTS=1
lslinux-vdso.so.1 =>  (0x00007ffd1d3cf000)/$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)/lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)

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

unset LD_TRACE_LOADED_OBJECTS
ls
Changelog  Changelog.ln  dablelv  txt.txt

由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。

实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。

2.命令格式

ldd [OPTIONS] <FILES>

其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。

在公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。

3.选项说明

--version:打印ldd版本号
-v, --verbose:详细信息模式,打印所有相关信息
-u, --unused:打印未使用的直接依赖
-d, --data-relocs:执行重定位和报告任何丢失的对象
-r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)
--help:显示帮助信息

4.示例说明

(1)显示可执行文件依赖的动态链接库。

ldd /usr/bin/lslinux-vdso.so.1 =>  (0x00007ffd90514000)/$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)/lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

淘宝开源代码质量检测工具!

Jetbrains出品:一款号称最适合程序员的编程字体

一个月薪 12000 的北京程序员的真实生活 !

BAT等大厂Java面试经验总结

别找了,想获取 Java大厂面试题学习资料

扫下方二维码回复「手册」就好了

嘿,你在看吗

http://www.xdnf.cn/news/824329.html

相关文章:

  • JavaScript笔记(二)
  • 爬过这些网站才算会爬虫
  • 什么是HBA(Host Bus Adapter,HBA)
  • OpenJudge-1.8.01:矩阵交换行
  • c++ 构造函数详细介绍
  • 如何使用IPFS命令行/js代码上传文件
  • 深入理解同步阻塞、同步非阻塞、异步阻塞、异步非阻塞
  • Js日期函数-Date方法
  • 颜表情记录(自用
  • extjs Ext.data.Store store学习
  • 什么是802.11ac和802.11ac Wave2
  • 【模拟集成电路】鉴频鉴相器设计(Phase Frequency Detector,PFD)
  • think PHP之环境配置windows+Wamp+Composer+PHP
  • 2024年网络安全最全网工必备工具SecureCRT_crt工具(1),瞬间高大上了
  • 数据流图(DFD)
  • 数据归档与清理功能大幅升级,NineData重磅升级!
  • CSS中实现元素居中的七种方法
  • iOS 苹果授权登录(Sign in with Apple)系列之Apple Developer配置篇
  • 放弃Python拥抱Mojo?鹅厂工程师真实使用感受
  • 推荐几个好用实用的免费图标素材(好看的icon)
  • 开窗函数(分析函数)使用详解
  • 最新配置淘宝镜像的方法
  • Ubuntu安装和配置ssh教程
  • document.getElementById()方法使用
  • equalsIgnoreCase() 方法
  • 【软件开发流程】
  • OSPF协议详解
  • B/S结构和C/S结构详细介绍
  • HDU之算法初步
  • disruptor原理详解