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

    文章

    11628

    浏览量

    217962
  • 命令
    +关注

    关注

    5

    文章

    746

    浏览量

    23444
  • Shell脚本
    +关注

    关注

    0

    文章

    36

    浏览量

    8451

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

    oracle数据误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据备份无法
    的头像 发表于 06-05 16:01 602次阅读
    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 9次下载

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

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

    一文掌握RK3568开发板Android13挂载Windows共享目录

    。RK3568支持SATA/PCIE/USB3.0等各类型外围接口,内置独立的NPU,可用于轻量级人工智能应用。 ▲开发板 Windows开启共享目录 windows系统中,文件共享
    发表于 04-16 13:55

    数据数据恢复——MongoDB数据库文件拷贝后服务无法启动的数据恢复

    MongoDB数据数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据。 MongoDB数据故障: 管理员在未关闭MongoDB服务的情况下拷贝数据
    的头像 发表于 04-09 11:34 652次阅读
    数据<b class='flag-5'>库</b>数据恢复——MongoDB数据<b class='flag-5'>库文件</b>拷贝后服务无法启动的数据恢复

    Linux文件管理命令详解

    cat命令描述:该命令用于连接文件打印到标准输出设备上。
    的头像 发表于 02-17 10:34 888次阅读
    Linux<b class='flag-5'>文件</b>管理<b class='flag-5'>命令</b>详解

    用于SQLite的dbExpress数据驱动程序

    驱动程序作为独立。由于数据访问层薄而简单,dbExpress 提供高性能数据连接性,并且更加易于部署。 适用于 SQLite 的 dbExpress 驱动
    的头像 发表于 02-09 09:45 763次阅读

    hyper-v共享,Hyper-V 共享:Hyper-V的资源共享设置

    的解决方案。今天就为大家介绍Hyper-V共享:Hyper-V的资源共享设置。    在Hyper-V虚拟化环境中,资源共享是实现高效管理和灵活部署的关键功能之一。Hyper-V提供了多种资源
    的头像 发表于 02-07 10:26 1832次阅读
    hyper-v<b class='flag-5'>共享</b>,Hyper-V <b class='flag-5'>共享</b>:Hyper-V的资源<b class='flag-5'>共享</b>设置

    hyper-v共享,hyper-v共享:实现主机与虚拟机之间高效文件共享的最佳实践

    在日常工作中,我们常常需要处理大量的文件和数据,这些重复性任务不仅耗时耗力,还容易因疲劳而导致错误。幸运的是,批量管理工具的出现为这一问题提供了高效的解决方案。今天就为大家介绍hyper-v共享
    的头像 发表于 01-24 14:23 2370次阅读
    hyper-v<b class='flag-5'>共享</b>,hyper-v<b class='flag-5'>共享</b>:实现主机与虚拟机之间高效<b class='flag-5'>文件</b><b class='flag-5'>共享</b>的最佳实践

    腾讯ima升级知识功能,上线小程序实现共享与便捷问答

    近日,腾讯旗下的AI智能工作台ima.copilot(简称ima)迎来了知识功能的重大升级。此次升级不仅增加了“共享知识”的新能力,还正式上线了“ima知识”小
    的头像 发表于 12-31 15:32 2613次阅读

    如何使用cmp进行数据管理的技巧

    使用 cmp 命令进行数据管理可能不是最直观的方法,因为 cmp 通常用于比较两个文件是否相同。然而,如果你的意图是使用 cmp 来检查数据库文件
    的头像 发表于 12-17 09:31 966次阅读