Linux 命令(61)—— ldd 命令
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]
为可选的命令选项,<FILES>...
为必填的程序或者共享库文件列表。
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)
参考文献
[1] ldd manual
[2] Linux命令大全.ldd命令
[3] 博客园.ldd命令
Linux 命令(61)—— ldd 命令相关推荐
- linux中的ldd命令简介
在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了. 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, ...
- Linux Shell脚本Ldd命令原理及使用方法
1.首先ldd不是一个可执行程序,而只是一个shell脚本 2.ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量 如下:LD_TRACE_LOADED_OBJECTS. ...
- Linux命令之ldd命令
一.命令简介 LDD用来打印或者查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题.ldd不是一个可执行程序,而只是一个shell脚本. 二.使用示例 1.查看ls命令所 ...
- ldd命令 ubuntu_Linux ldd 命令 command not found ldd 命令详解 ldd 命令未找到 ldd 命令安装 - CommandNotFound ⚡️ 坑否...
显示行号 | 选择喜欢的代码风格 默认 GitHub Dune LakeSide Plateau Vibrant Blue Eighties Tranquil ldd 命令打印程序和库的共享库依赖项. ...
- 【Linux】一步一步学Linux——ldd命令(251)
00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 其它描述 06. 附录 01. 命令概述 ldd命令用于打印程序或者库文件所依赖的 ...
- linux ldd命令源代码,Linux中ldd命令的用法详解
Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧. ldd命令用于判断某个可执 ...
- 【Linux】19.Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解
Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解 参考链接: https://www.jianshu.com/p/a62e1d327023 LD_LIBRARY_PATH中的LD ...
- Linux下nm和ldd 命令
1. Linux nm 命令 nm ['-a'|'--debug-syms'] ['-g'|'--extern-only'] ['-B'] ['-C'|'--demangle'[=style]] [' ...
- linux的so命令,每天一个 Linux 命令(67): ldd 命令
原标题:每天一个 Linux 命令(67): ldd 命令 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表. 注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 ...
最新文章
- RocksDB 的Put操作和WriteBatch操作
- Eclipse_Eclipse下配置Maven
- DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
- 有机会多熟悉下开源框架
- [Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]
- python闭环最短路径_最短路径算法的实现(dijskstra):Python
- python并发处理list数据_3种方式实现python多线程并发处理
- ImportError: libgdal.so.20: cannot open shared object file: No such file or directory
- js 获取指定范围的随机数
- 转一篇:如何快速的修改参考文献
- MAC系统如何连接Windows共享文件?MAC系统连接Win共享文件的方法
- 前端自动化构建工具gulp的使用介绍
- 使用matplotlib绘制正弦曲线图
- 修改hexo的主题nexT中的Pisces主题宽度
- 权限控制 JSR-250注解、@Secured注解、支持表达式的注解
- Python程序设计(下)
- van-field 校验手机号码格式
- 阿里云物联网和移动OneNet初步使用感受
- Unity 打开文件夹
- 直播电商平台开发,video组件实现视频弹幕功能
热门文章
- 使用 Unity* 进行并行处理的一种方法
- nginx+uwsgi+django环境部署部署
- wordpress安装后勿忘删除install.php
- 在Linux平台使用Firefox 登陆EBS r12环境
- Google Web Brower
- VS2005-此计算机上已安装了试用版。必须先卸载以前安装的试用版后才能安装另一个试用版
- L2-033 简单计算器 (25 分)-PAT 团体程序设计天梯赛 GPLT
- Oracle表删除大量数据后查询变慢问题
- eclipse jar打包 jar line too long 异常处理方法
- 服务计算与服务生态系统 第一章测验题答案