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
    +关注

    关注

    88

    文章

    11807

    浏览量

    219513
  • 命令
    +关注

    关注

    5

    文章

    758

    浏览量

    23914
  • Shell脚本
    +关注

    关注

    0

    文章

    36

    浏览量

    8543

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B 应用依赖安装

    1.文件系统依赖安装1.1前言用户在进行Linux开发的过程中,经常会遇到找不到命令或者找不到依赖
    的头像 发表于 04-20 14:56 924次阅读
    瑞芯微(EASY EAI)RV1126B 应用<b class='flag-5'>依赖</b><b class='flag-5'>库</b>安装

    共享车辆追踪:为什么选LoRa?

    单车、共享电动车的普及,车辆定位技术面临新的需求挑战。传统汽车通常依赖GPS或北斗卫星导航系统进行定位,主要用于出行导航。然而,共享车辆的定位需求与之有本质区别—
    的头像 发表于 03-23 11:34 1056次阅读
    <b class='flag-5'>共享</b>车辆追踪:为什么选LoRa?

    一文详解SystemC仿真的编译

    AMD Vivado 设计套件以文件的形式提供仿真模型。仿真包含器件和 IP 的行为和时序模型。编译后的可供多个设计项目使用。用户必须在设计仿真之前通过名为 compile_s
    的头像 发表于 12-12 15:08 5024次阅读
    一文详解SystemC仿真<b class='flag-5'>库</b>的编译

    什么是KEIL的微(microlib)

    Microlib不支持生成”位置无关的代码(position-independent code)”。因此使用Microlib编写的程序不能生成可用的共享,即.lib文件
    发表于 12-10 06:27

    搭建自己的ubuntu系统之必要安装

    在进行开发之前,还需要一些其他的必要,我们使用以下命令逐一安装,安装前需保证网络可正常使用,能上外网:elf@ubuntu:~$ sudo apt-get update//更新下载源信息
    发表于 09-25 09:47

    不同场景下的文件共享方案-SMB/WebDAV/FTP/ZeroNews

    四大主流文件共享方案,为企业选型提供专业参考。 SMB 简介 SMB(Server Message Block) 是一种网络文件共享协议,主要用于
    的头像 发表于 08-28 12:04 1159次阅读
    不同场景下的<b class='flag-5'>文件</b><b class='flag-5'>共享</b>方案-SMB/WebDAV/FTP/ZeroNews

    高性能缓存设计:如何解决缓存伪共享问题

    缓存行,引发无效化风暴,使看似无关的变量操作拖慢整体效率。本文从缓存结构原理出发,通过实验代码复现伪共享问题(耗时从3709ms优化至473ms),解析其底层机制;同时深入剖析高性能缓存 Caffeine 如何通过 内存填充技术 (120字节占位变量)隔离关键字段,以及
    的头像 发表于 07-01 15:01 875次阅读
    高性能缓存设计:如何解决缓存伪<b class='flag-5'>共享</b>问题

    数据数据恢复—MongoDB数据库文件丢失的数据恢复案例

    将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然
    的头像 发表于 07-01 11:13 766次阅读
    数据<b class='flag-5'>库</b>数据恢复—MongoDB数据<b class='flag-5'>库文件</b>丢失的数据恢复案例

    迅为RK3588开发板Android13系统挂载samba共享文件夹-怎么开启Windows共享

    注:推荐新建用户以及共享目录都是用英文。 windows 系统中,文件共享需要设置指定用户与密码,通过输入用户和密码进行连接,在设置共享时系统中有 Everyone 所有人设置,允许
    的头像 发表于 06-25 10:25 623次阅读
    迅为RK3588开发板Android13系统挂载samba<b class='flag-5'>共享</b><b class='flag-5'>文件</b>夹-怎么开启Windows<b class='flag-5'>共享</b>目

    达梦数据常用管理SQL命令详解

    达梦数据常用管理SQL命令详解
    的头像 发表于 06-17 15:12 7601次阅读
    达梦数据<b class='flag-5'>库</b>常用管理SQL<b class='flag-5'>命令</b>详解

    oracle数据恢复—oracle数据误执行错误truncate命令如何恢复数据?

    oracle数据误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据备份无法
    的头像 发表于 06-05 16:01 1724次阅读
    oracle数据恢复—oracle数据<b class='flag-5'>库</b>误执行错误truncate<b class='flag-5'>命令</b>如何恢复数据?

    3D AD文件

    3D文件
    发表于 05-28 13:57 6次下载

    贡献 OpenHarmony 关键配置

    项目,然后创建一个模块,选择 static library。详细步骤可参考:开发静态共享包。 > 在项目内会生成 library 文件夹 - 对所创建的模块进行开发,需要
    发表于 05-28 13:46

    PCB标准封装文件

    PCB标准封装文件
    发表于 05-22 17:43 10次下载

    HarmonyOS优化应用包体积大小问题性能优化

    和资源,消除使用HAR静态共享包造成的多包(HAP、HSP)间代码和资源的重复拷贝,从而减小应用包大小。 使用ohpm的override机制或者开启resolve_conflict解决依赖冲突减少
    发表于 05-20 14:50