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 命令相关推荐

  1. linux中的ldd命令简介

    在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了. 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, ...

  2. Linux Shell脚本Ldd命令原理及使用方法

    1.首先ldd不是一个可执行程序,而只是一个shell脚本 2.ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量 如下:LD_TRACE_LOADED_OBJECTS. ...

  3. Linux命令之ldd命令

    一.命令简介   LDD用来打印或者查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题.ldd不是一个可执行程序,而只是一个shell脚本. 二.使用示例 1.查看ls命令所 ...

  4. ldd命令 ubuntu_Linux ldd 命令 command not found ldd 命令详解 ldd 命令未找到 ldd 命令安装 - CommandNotFound ⚡️ 坑否...

    显示行号 | 选择喜欢的代码风格 默认 GitHub Dune LakeSide Plateau Vibrant Blue Eighties Tranquil ldd 命令打印程序和库的共享库依赖项. ...

  5. 【Linux】一步一步学Linux——ldd命令(251)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 其它描述 06. 附录 01. 命令概述 ldd命令用于打印程序或者库文件所依赖的 ...

  6. linux ldd命令源代码,Linux中ldd命令的用法详解

    Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧. ldd命令用于判断某个可执 ...

  7. 【Linux】19.Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解

    Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解 参考链接: https://www.jianshu.com/p/a62e1d327023 LD_LIBRARY_PATH中的LD ...

  8. Linux下nm和ldd 命令

    1. Linux nm 命令 nm ['-a'|'--debug-syms'] ['-g'|'--extern-only'] ['-B'] ['-C'|'--demangle'[=style]] [' ...

  9. linux的so命令,每天一个 Linux 命令(67): ldd 命令

    原标题:每天一个 Linux 命令(67): ldd 命令 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表. 注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 ...

最新文章

  1. RocksDB 的Put操作和WriteBatch操作
  2. Eclipse_Eclipse下配置Maven
  3. DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
  4. 有机会多熟悉下开源框架
  5. [Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]
  6. python闭环最短路径_最短路径算法的实现(dijskstra):Python
  7. python并发处理list数据_3种方式实现python多线程并发处理
  8. ImportError: libgdal.so.20: cannot open shared object file: No such file or directory
  9. js 获取指定范围的随机数
  10. 转一篇:如何快速的修改参考文献
  11. MAC系统如何连接Windows共享文件?MAC系统连接Win共享文件的方法
  12. 前端自动化构建工具gulp的使用介绍
  13. 使用matplotlib绘制正弦曲线图
  14. 修改hexo的主题nexT中的Pisces主题宽度
  15. 权限控制 JSR-250注解、@Secured注解、支持表达式的注解
  16. Python程序设计(下)
  17. van-field 校验手机号码格式
  18. 阿里云物联网和移动OneNet初步使用感受
  19. Unity 打开文件夹
  20. 直播电商平台开发,video组件实现视频弹幕功能

热门文章

  1. 使用 Unity* 进行并行处理的一种方法
  2. nginx+uwsgi+django环境部署部署
  3. wordpress安装后勿忘删除install.php
  4. 在Linux平台使用Firefox 登陆EBS r12环境
  5. Google Web Brower
  6. VS2005-此计算机上已安装了试用版。必须先卸载以前安装的试用版后才能安装另一个试用版
  7. L2-033 简单计算器 (25 分)-PAT 团体程序设计天梯赛 GPLT
  8. Oracle表删除大量数据后查询变慢问题
  9. eclipse jar打包 jar line too long 异常处理方法
  10. 服务计算与服务生态系统 第一章测验题答案