Linux命令-ldd(查看可执行程序或共享库所依赖的动态链接库)

🧭说明

ldd 是 Linux 系统中一个非常实用的命令行工具,用于查看可执行程序或共享库所依赖的动态链接库。它可以帮助诊断程序因缺少库文件而无法运行的问题,或检查库的兼容性。

🔍 基本用法与输出解读

  • 基本命令 :在终端中,最基本的用法是直接在命令后跟上可执行文件或库文件的路径。

    bash 复制代码
    ldd /usr/bin/ls
  • 输出解读 :命令输出通常类似以下格式:

    复制代码
    linux-vdso.so.1 (0x00007ffd12345000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8a1a2b0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a1a0a0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8a1a4f0000)
    • => 左边是依赖的库名 ,右边是库在系统中的实际路径和内存地址。
    • linux-vdso.so.1 是一个由内核提供的虚拟动态共享对象,通常没有实际文件路径。
    • /lib64/ld-linux-x86-64.so.2 是动态链接器本身。
    • 如果某个库未找到,会显示 not found

⚙️ 常用选项速查

ldd 提供了一些选项来获取更详细或特定的信息,下表总结了最常用的几个:

选项 说明
-v 显示详细版本信息,包括库的版本符号。
-d 执行数据重定位并报告缺失的符号(仅对 ELF 文件有效)。
-r 执行数据和函数重定位 ,并报告缺失的对象和函数(比 -d 更严格)。
-u 显示未使用的直接依赖

例如,要检查一个程序是否有缺失的符号,可以使用:

bash 复制代码
ldd -r /path/to/your/program

🛡️ 重要注意事项与安全风险

使用 ldd 时,有两点需要特别警惕:

  1. 安全风险绝对不要对不可信的或来源未知的可执行文件使用 ldd 。因为 ldd 的工作原理是实际加载目标文件及其依赖库来获取信息,这可能会导致文件中包含的恶意代码被执行。
  2. 替代方案 :出于安全考虑,对于不可信的文件,建议使用静态分析工具来查看依赖关系,它们不会执行程序代码。
    • 使用 objdump

      bash 复制代码
      objdump -p /path/to/file | grep NEEDED
    • 使用 readelf

      bash 复制代码
      readelf -d /path/to/file | grep 'Shared library'

💡 实际应用场景

  • 诊断启动失败 :当程序因缺少库而无法启动时,使用 ldd 快速定位缺失的库。

    bash 复制代码
    ldd /my/app | grep "not found"
  • 检查库版本冲突 :在开发中,有时程序可能链接了同一个库的多个版本,可能导致异常。使用 ldd 可以查看实际加载的库路径,帮助排查问题。

  • 验证环境变量 :环境变量 LD_LIBRARY_PATH 会影响库的搜索路径。使用 ldd 可以检查在当前环境下,程序最终会加载哪些位置的库。

    bash 复制代码
    LD_LIBRARY_PATH=/custom/path ldd your_program
相关推荐
寒水馨5 分钟前
Linux下载、安装llama.cpp-b10068(附安装包llama-b10068-bin-ubuntu-vulkan-x64.tar.gz)
linux·ubuntu·llm·llama·本地部署·llama.cpp·推理引擎
玖玥拾3 小时前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
ziguo11223 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
三8444 小时前
使用Samba/NFS实现文件共享/自动挂载共享目录/autofs自动挂载服务
linux·服务器·网络
高铭杰5 小时前
万物皆可KV(2)SurrealDB 存储布局分析
linux·服务器
万事可爱^5 小时前
Claude 新发布的 Opus 5,系统提示语删了 80%,半价还能逼近 Fable 5
android·服务器·数据库·人工智能·claude
玖玥拾5 小时前
Unity 3D 笔记(十七)Unity/C# Socket 网络笔记6
服务器·网络·unity·c#
Jerry小杰5 小时前
运维神器|单端口搞定多台内网SSH!frp端口复用终极教程
运维·ssh
无小道5 小时前
深入解析操作系统文件缓冲区:页缓存、基数树与f_pos的协同设计
linux·缓存·文件缓冲区
Python私教6 小时前
Blender模型导入Godot完整教程:GLB、BLEND与继承场景怎么选
运维·godot·blender