linux基础50——ldd

linux基础50——ldd1.概念ldd命令用于打印程序或者共享库文件所依赖的共享库列表。注意,ldd本身不是一个二进制程序,而是一个Shell脚本,使用文本编辑器vim可以查看其内容,具体目录可以使用which命令查看:[root@192pthread]#whichldd/usr/bin/ldd我们知道,Linux的动态库装载器ld-linux.so模块会先于executable模块工作,并获得控制权,ld-linux.so会通过系统环境变量的设置,选择只显示可执行模块的d

大家好,又见面了,我是你们的朋友全栈君。

1. 概念

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

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

[root@192 pthread]# 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
ls
  linux-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)显示可执行文件依赖的动态链接库。

[root@192 pthread]# ldd /usr/bin/ls
	linux-vdso.so.1 =>  (0x00007ffede1d4000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbeae8e2000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007fbeae6dd000)
	libacl.so.1 => /lib64/libacl.so.1 (0x00007fbeae4d4000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fbeae106000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbeadea4000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fbeadca0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fbeaeb09000)
	libattr.so.1 => /lib64/libattr.so.1 (0x00007fbeada9b000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbead87f000)
[root@192 pthread]#
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136466.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 局域网,广域网和因特网的区别_因特网是不是广域网

    局域网,广域网和因特网的区别_因特网是不是广域网局域网、广域网、因特网,这三个概念我们经常会听到,但是是否真的理解他们之间有什么联系和区别呢?局域网(LAN,LocalAreaNetwork),如同其名字,即范围较小的计算机网络。广域网(WAN,WideAreaNetwork),相较于局域网范围较大。因特网(Internet),由全球所有的网络所组成的集合,也就是由无数个局域网,通过WAN线路汇聚到运营商,然后运营商之间互联起来,所形成的互联网。其中局域网和广域网是两个十分相近的概念,举个例子来简单理解一下吧。如果你摆弄过路由.

    2022年10月18日
    1
  • STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)

    STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)一、SDIO简介SD卡(SecureDigitalMemoryCard)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SDI/O卡都有SDIO接口。MMC卡可以说是SD卡的前身,现阶段已经用得很少。STM32F10x系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SDI/O卡以及CE-A

    2022年10月3日
    0
  • docker(5)docker运行web应用

    docker(5)docker运行web应用前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年7月28日
    3
  • 对比自监督学习综述 – A Survey of Contrastive Self-Supervised Learning

    对比自监督学习综述 – A Survey of Contrastive Self-Supervised Learning本文介绍了最近流行的对比自监督学习。

    2022年9月14日
    0
  • linux防火墙端口开放_防火墙开启端口linux

    linux防火墙端口开放_防火墙开启端口linux在服务器上使用某些软件时需要开启相应的防火墙端口号,简单了解下Linux防火墙端口防火墙策略防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,否则则丢弃。起到一个过滤的作用,保证了主机的安全。查看firewall服务状态systemctlstatusfirewalld开启、重启、关闭、firewalld.service服务1.开启servicefirewalldstart

    2022年9月22日
    1
  • Pytest(8)parametrize参数化[通俗易懂]

    Pytest(8)parametrize参数化[通俗易懂]前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号