你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux 命令: ldd 命令

[复制链接]
gaosmile 发布时间:2021-2-25 12:36
1.命令简介
ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。

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

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

相关环境变量有:

  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。

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

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

  1. -d, --data-relocs -> LD_WARN=yes
  2. -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
  3. -u, --unused -> LD_DEBUG="unused"
  4. -v, --verbose -> LD_VERBOSE=yes
复制代码
比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。

测试如下:

  1. export LD_TRACE_LOADED_OBJECTS=1
  2. ls
  3.   linux-vdso.so.1 =>  (0x00007ffd1d3cf000)
  4.   /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
  5.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)
  6.   libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)
  7.   libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)
  8.   libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
  9.   libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
  10.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
  11.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)
  12.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
  13.   /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)
  14.   libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码
撤销该环境变量,ls 即可恢复正常使用:

  1. unset LD_TRACE_LOADED_OBJECTS
  2. ls
  3. 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.命令格式

  1. ldd [OPTIONS] <FILES>
复制代码

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

3.选项说明

  1. --version:打印ldd版本号
  2. -v, --verbose:详细信息模式,打印所有相关信息
  3. -u, --unused:打印未使用的直接依赖
  4. -d, --data-relocs:执行重定位和报告任何丢失的对象
  5. -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)
  6. --help:显示帮助信息
复制代码
4.示例说明
(1)显示可执行文件依赖的动态链接库。

  1. ldd /usr/bin/ls
  2.   linux-vdso.so.1 =>  (0x00007ffd90514000)
  3.   /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
  4.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)
  5.   libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)
  6.   libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)
  7.   libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
  8.   libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)
  9.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
  10.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)
  11.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
  12.   /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
  13.   libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码


收藏 评论0 发布时间:2021-2-25 12:36

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版