如何快速掌握ldd基础用法?

ldd命令用于显示可执行文件或共享库依赖的动态链接库,直接运行ldd 文件名即可列出其所需的共享库及其路径。

想知道一个程序运行起来需要哪些“帮手”吗?在 Linux 和类 Unix 系统里,ldd(List Dynamic Dependencies)命令就是你的得力助手,它能清晰地列出一个可执行程序或共享库所依赖的所有动态链接库(.so 文件),这对于排查程序无法启动(比如报错找不到某个 .so 文件)、理解程序结构、或者部署软件到新环境时确保所有依赖都到位,都非常有用。

最基本的用法就是直接在终端输入 ldd,后面跟上你想检查的程序或库的完整路径:

ldd /path/to/your/program_or_library

举个最常见的例子:

你想看看系统自带的 ls 命令依赖哪些库:

ldd /bin/ls

执行后,你会看到类似这样的输出(具体库和路径会因系统和版本而异):

        linux-vdso.so.1 (0x00007ffd5a3f1000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9e3a6b8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9e3a4c6000)
        libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f9e3a42d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9e3a427000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9e3a70d000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9e3a405000)

解读输出结果:

  • 第一列: 依赖的共享库名称(libc.so.6)。
  • => 表示该库被解析到的实际路径。
  • 第二列: 该库在系统上被找到的完整绝对路径/lib/x86_64-linux-gnu/libc.so.6),这是最关键的信息!如果程序启动报错说找不到某个库,ldd 输出中对应的这一项通常会是 not found
  • 括号内的地址: 库被加载到内存中的地址(每次运行可能不同,一般用户无需深究)。
  • 特殊项:
    • linux-vdso.so.1: 一个虚拟库,用于加速系统调用,通常无需关心。
    • /lib64/ld-linux-x86-64.so.2: 这是动态链接器/加载器本身,负责在程序启动时加载所有依赖库,对于 64 位 x86 系统通常是这个路径,32 位系统可能是 /lib/ld-linux.so.2

ldd 的常用选项:

虽然 ldd 本身选项不多,但有几个比较实用:

  1. -v--verbose: 详细模式
    打印所有依赖信息,包括库的版本号、符号表信息等,输出非常详尽,对于深度调试很有用。

    ldd -v /bin/ls
  2. -u--unused: 显示未使用的直接依赖
    尝试列出那些被链接进来但实际上没有被程序使用的直接依赖项,注意:这个结果可能不完全准确,仅供参考。

    ldd -u /bin/ls
  3. -d--data-relocs: 执行重定位并报告丢失的函数 (仅对 ELF 格式有效)
    更严格地检查数据对象的重定位问题。

  4. -r--function-relocs: 执行重定位并报告丢失的函数和数据对象 (仅对 ELF 格式有效)
    最严格的检查模式,会尝试执行重定位操作,报告任何找不到的函数或数据对象,这对于检查库的兼容性问题(比如某个依赖库版本太旧缺少需要的函数)很有帮助。

    ldd -r /path/to/program

ldd 使用场景与技巧:

  1. 诊断“找不到库”错误:
    这是 ldd 最核心的用途,如果运行程序时出现类似 error while loading shared libraries: libxxx.so.x: cannot open shared object file: No such file or directory 的错误,立即用 ldd 检查该程序:

    ldd /path/to/failing_program

    在输出中查找标记为 not found 的库,这明确告诉你缺失了哪个库文件,接下来你需要:

    • 确认这个库是否已安装(用包管理器搜索,如 apt search libxxx / dnf search libxxx / yum search libxxx / pacman -Ss libxxx)。
    • 如果已安装,检查路径是否在动态链接器的搜索范围内(通常由 /etc/ld.so.conf/etc/ld.so.conf.d/* 定义,以及环境变量 LD_LIBRARY_PATH),库文件通常安装在 /lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib 等标准目录下。
    • 如果库已安装但不在标准路径,可以通过设置 LD_LIBRARY_PATH 临时指定(不推荐长期使用),或者将库路径添加到 /etc/ld.so.conf.d/ 下的一个 .conf 文件中,然后运行 sudo ldconfig 更新缓存。
  2. 检查程序是否链接了特定库:
    你可以结合 grep 快速检查程序是否依赖了某个特定的库:

    ldd /path/to/program | grep libssl

    如果有输出,说明依赖了 OpenSSL 库;没有输出则说明没有直接依赖。

  3. 查看库的依赖关系:
    ldd 不仅可以检查可执行文件,也可以检查共享库文件 (.so) 本身依赖哪些其他库:

    ldd /usr/lib/x86_64-linux-gnu/libssl.so.3
  4. 对比不同环境下的依赖:
    在将程序部署到新服务器前,可以在开发机上用 ldd 检查依赖,确保目标服务器上安装了所有必要的库(版本兼容性也需注意)。

重要警告与注意事项:

  1. 绝对不要对不受信任的程序使用 ldd
    这是 ldd 使用中最重要的安全准则。ldd 的工作原理是通过设置特殊的环境变量(如 LD_TRACE_LOADED_OBJECTS)来让动态链接器输出依赖信息,而不是直接运行程序。在极少数情况下,某些精心构造的恶意程序可能会利用这个机制,在 ldd 试图“模拟”加载过程时执行其代码。 永远不要对来源不明、不可信的可执行文件运行 ldd,安全的做法是只对系统自带程序、你信任的软件包安装的程序或你自己编译的程序使用 ldd

  2. ldd vs readelf -d
    另一个查看动态依赖的工具是 readelf -d /path/to/program | grep NEEDED,它直接从 ELF 文件头中读取 .dynamic 段的信息,列出直接依赖的库名(但不解析路径)。ldd 会递归地列出所有依赖(直接和间接)并解析出它们在当前系统中的完整路径,两者用途略有不同:readelf -d 更安全(因为它不涉及任何加载或执行),适合快速查看直接依赖;ldd 更全面,能显示实际加载路径,但需注意安全风险。

  3. 版本兼容性:
    ldd 显示的是库在当前系统上的路径和版本,这并不意味着程序在运行时一定能和这个版本的库完美协作(可能存在 ABI 不兼容)。ldd -r 可以帮助发现一些符号缺失的问题。

  4. 环境变量影响:
    ldd 的输出会受到环境变量(尤其是 LD_LIBRARY_PATH)的影响,同一个程序在不同 LD_LIBRARY_PATH 设置下运行 ldd,可能会找到不同路径下的库。

ldd 是一个简单而强大的命令行工具,是 Linux 用户和开发者诊断程序依赖问题、理解程序构成的必备利器,记住它的核心功能:列出可执行文件或共享库所需的动态链接库及其在系统中的实际路径,熟练掌握 ldd 的基础用法和常用选项(-v, -u, -r),能有效解决常见的“库未找到”错误,但务必牢记安全第一的原则:切勿对不可信的程序使用 ldd,对于快速查看直接依赖,安全的替代方案是 readelf -d | grep NEEDED,善用 ldd,让你的 Linux 程序运行和调试更加得心应手。


引用说明:

  • ldd 的功能描述和选项解释主要基于 GNU C 库 (glibc) 中 ldd 实现的通用行为以及 Linux 手册页 (man ldd) 的标准内容。
  • ldd 安全风险的警告广泛存在于 Linux 社区的安全建议和官方文档(如 man ldd 中通常包含相关警告提示)。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6188.html

(0)
酷番叔酷番叔
上一篇 2025年7月4日 11:23
下一篇 2025年7月4日 11:40

相关推荐

  • 旋转角度如何定义方向本质?

    旋转角度描述物体绕固定点转动的量值大小,其方向则由旋转轴(通过右手法则或正负号)确定,两者共同完整定义了空间中的旋转运动。

    2025年6月18日
    1600
  • 这些安全漏洞你忽视了吗?

    请务必加强个人防护,注意信息安全,警惕陌生链接与诈骗,遵守安全操作规程,留意环境隐患,掌握应急措施,保护自身及财产安全,遇险及时求助。

    2025年7月7日
    1000
  • 如何掌握核心快捷键必备方法?

    关闭/显示命令窗口快捷键:Ctrl + 9操作说明:在AutoCAD任意界面按下 Ctrl + 9 组合键:首次按下:隐藏命令行窗口(Command Line),再次按下:重新显示命令行窗口,适用场景:适用于AutoCAD 2006及以上所有版本(包括2025版),以及基于AutoCAD内核的国产软件(如中望C……

    6天前
    900
  • Linux无法关机?原因速查

    为什么找不到halt命令?未安装基础软件包halt命令属于sysvinit-utils或systemd-sysv软件包(不同发行版名称略有差异),现代Linux发行版(如Ubuntu 20.04+、CentOS 8+)默认使用systemctl管理电源,可能未预装传统halt命令,检查命令是否存在: which……

    4天前
    500
  • 如何用bat文件自动执行Windows任务?

    批处理命令基础原理批处理文件本质是文本指令集合,由Windows命令提示符(cmd.exe)逐行执行,优势包括:高效自动化:批量处理文件管理、系统配置等重复任务零环境依赖:Windows系统原生支持,无需安装额外软件低学习成本:使用基础DOS命令即可编写创建批处理文件的详细步骤新建文件桌面右键 → 新建 → 文……

    2025年6月18日
    1600

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信