0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Linux爱好者 来源:Linux爱好者 作者:恋猫大鲤鱼 2021-02-02 11:37 次阅读

1.命令简介

ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:

whichldd
/usr/bin/ldd

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

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

exportLD_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 即可恢复正常使用:

unsetLD_TRACE_LOADED_OBJECTS
ls
ChangelogChangelog.lndablelvtxt.txt

由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。

2.命令格式

ldd[OPTIONS]

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

3.选项说明

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

4.示例说明

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

ldd/usr/bin/ls
linux-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命令

责任编辑:xj

原文标题:每天一个 Linux 命令(103):ldd 命令

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206718
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21848
  • Shell脚本
    +关注

    关注

    0

    文章

    33

    浏览量

    7912

原文标题:每天一个 Linux 命令(103):ldd 命令

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    飞凌嵌入式ElfBoard ELF 1板卡-ubuntu创建共享文件

    ELF1、ELF1S开发板_软件教程_V1》“2.1.4.3 VMware Tools 安装”小节安装VMware Tools。1.首先在Windows下创建共享文件夹,这里我命名为ELF1-share
    发表于 04-18 11:14

    Linux系统共享文件缺失的解决策略

    如果确实已经设置过共享文件夹将输出window下共享文件夹名字
    的头像 发表于 04-15 10:25 106次阅读
    Linux系统<b class='flag-5'>共享</b><b class='flag-5'>文件</b>缺失的解决策略

    Linux配置NFS文件共享详解

    NFS是Network File System的缩写,是一种分布式文件系统协议,用于在计算机网络上共享文件。它允许客户端计算机通过网络远程访问和处理远程服务器上的
    的头像 发表于 12-27 09:53 563次阅读
    Linux配置NFS<b class='flag-5'>文件</b><b class='flag-5'>共享</b>详解

    OpenAtom OpenHarmony 三方创建发布及安全隐私检测

    进行检查分析,可以检测多种样本类型,能识别出伪装成图片或其他正常文件的木马,以及各种恶意软件包。然后利用依赖检测分析发现项目、软件依赖关系,帮助企业发现使用的开源包(开源)的
    发表于 11-13 17:27

    为全志T507-H开发板配置Samba服务,高效实现跨系统的文件共享

    间的壁垒以实现跨平台的文件共享”是一项不能被忽视的重要功能,那么该如何做到这一点呢? 我们可以使用Samba,这是一款在Linux系统上实现SMB的免费软件,可以在不同操作系统之间实现文件
    发表于 11-08 09:34

    【开源三方】Fuse.js:强大、轻巧、零依赖的模糊搜索

    模糊搜索,支持OpenAtom OpenHarmony(以下简称“OpenHarmony”)操作系统,它具备模糊搜索和排序等功能。该高性能、易于使用、高度可配置,支持多种数据类型和多语言搜索
    发表于 10-12 15:05

    如何实现NUC980-IOT开发板与虚拟机的文件共享或者传输?

    本人主机采用的是新唐提供的Ubuntu虚拟机,想实现虚拟机和NUC980-IOT开发板两者之间的文件共享或者传输,不用每次修改程序都要重新烧写一些,谢谢。
    发表于 09-01 07:53

    如何查看linux程序共享库呢?

    在linux系统中,程序通常需要依赖于外部库来正常工作。这些库可以直接编译到程序中,也可以从共享库池中加载。
    的头像 发表于 08-28 09:11 976次阅读
    如何查看linux<b class='flag-5'>程序</b><b class='flag-5'>共享</b>库呢?

    如何共享文件给虚拟机中的Linux系统

    软件开发时,很多时候会用到 Linux 虚拟机,而办公环境,又离不开 Windows ,导致有些文件需要在两个环境之间来回切换,为了方便文件传输,可以为虚拟机内的 Linux 安装 VMware tools ,但是,大的文件,还
    发表于 08-22 15:40 1705次阅读
    如何<b class='flag-5'>共享</b><b class='flag-5'>文件</b>给虚拟机中的Linux系统

    在linux共享下,调用共享库函数时,程序卡死在函数中的pid=fork()这里的原因?

    在linux共享下,调用共享库函数时,程序卡死在函数中的pid=fork()这里,来个大佬指导指导原因...
    发表于 06-20 06:55

    编译器如何处理使用预编译SMING文件编译的应用程序中未使用的

    预编译的文件,由位于顶部的应用程序使用。 编译器如何处理使用预编译SMING文件编译的应用程序
    发表于 06-12 08:54

    如何共享Heltec WIFI_Kit_8 (OLED-NodeMcu) 的I2C引脚?

    DS3231 RTC,共享相同的 SDA/SCL 引脚。 这行得通吗,还是会发生资源冲突(因为两个共享同一个 i2c 连接)?
    发表于 05-31 07:00

    请问KiCad文件如何转换为AD

    KiCad文件如何转换为AD
    发表于 05-26 07:44

    如何为网络共享访问实施SMB/CIFS (Samba)?

    : AT+CIPSMBINIT=0,\"SeagateNAS\" //关闭sharename中所有打开的文件并移除共享 AT+CIPSMBINIT=1,\"SeagateNAS
    发表于 05-19 09:19

    Linux中的静态库和共享

    库是一个二进制文件,包含的代码可被程序调用。例如标准C库、数学库、线程库等等。库有源码,可下载后编译,也可以直接安装二进制包。 库是事先编译好的,可以复用的代码,在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。Win
    的头像 发表于 05-10 09:34 613次阅读