ldd
是 Linux 系统中用于查看可执行文件或共享库的动态链接依赖的工具。它通过调用动态链接器(如 /lib/ld-linux.so
)来解析并显示目标文件运行时所需的动态库及其实际加载路径。以下是 ldd
命令的相关操作举例和总结。
文章目录
常用选项总结
选项 | 功能 | 示例命令 |
---|---|---|
无 | 显示动态库依赖及其解析路径 | ldd a.out |
-v | 显示详细版本信息 | ldd -v a.out |
-u | 显示未使用的直接依赖 | ldd -u a.out |
-d | 执行数据重定位并报告缺失符号 | ldd -d a.out |
-r | 执行数据和函数重定位并报告缺失 | ldd -r a.out |
常用操作举例
1. 基本用法:查看动态库依赖
- 命令:
ldd your_executable
- 示例输出:
linux-vdso.so.1 (0x00007ffd2b5f4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9b800000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9ba00000)
- 解释:
linux-vdso.so.1
:虚拟动态共享对象,由内核提供,不对应实际文件。libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
:依赖的动态库名称及其解析后的路径。/lib64/ld-linux-x86-64.so.2
:动态链接器本身。
- 用途:快速查看可执行文件依赖的所有动态库及其加载位置。
2. 处理未找到的动态库
- 示例输出:
libexample.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9b800000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9ba00000)
- 解释:
libexample.so => not found
表示动态库未在系统默认路径或LD_LIBRARY_PATH
中找到。
- 解决方法:
- 设置环境变量:
export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH ldd your_executable
- 检查输出是否解析成功。
- 设置环境变量:
3. 显示详细版本信息
- 命令:
ldd -v your_executable
- 示例输出:
linux-vdso.so.1 (0x00007ffd2b5f4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9b800000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9ba00000) Version information: ./your_executable: libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6: ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
- 用途:显示动态库的版本需求(如
GLIBC_2.2.5
),用于排查版本不兼容问题。
4. 仅显示未解析的依赖
- 命令:
ldd -u your_executable
- 示例输出:
Unused direct dependencies: /usr/lib/libunused.so
- 用途:列出未被实际使用的直接依赖库,帮助优化链接。
5. 检查共享库本身的依赖
- 命令:
ldd /usr/lib/libexample.so
- 示例输出:
linux-vdso.so.1 (0x00007ffd2b5f4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9b800000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9ba00000)
- 用途:分析某个动态库自身的依赖关系。
6. 调试模式:显示解析过程
-
命令:
ldd -d your_executable
-
示例输出:
linux-vdso.so.1 (0x00007ffd2b5f4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9b800000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b9ba00000)
-
用途:执行数据重定位并显示缺失的符号(如果有)。
-
更详细调试:
ldd -r your_executable
-
用途:执行数据和函数重定位,显示所有缺失符号。
使用技巧与注意事项
-
安全性问题:
- 不要对不可信的可执行文件运行
ldd
,因为它会实际调用动态链接器,可能执行恶意代码。 - 替代方法:使用
readelf -d
查看依赖,避免运行。
- 不要对不可信的可执行文件运行
-
环境变量影响:
LD_LIBRARY_PATH
会影响ldd
的解析结果。例如:LD_LIBRARY_PATH=/custom/path ldd your_executable
- 检查当前环境下的实际加载路径。
-
与
readelf
的区别:ldd
显示运行时动态链接器解析后的路径(动态信息)。readelf -d
显示文件中静态嵌入的依赖和路径(如NEEDED
和RPATH
)。
-
非 ELF 文件:
- 如果目标文件不是 ELF 格式(如脚本或非可执行文件),会输出:
not a dynamic executable
- 如果目标文件不是 ELF 格式(如脚本或非可执行文件),会输出:
-
调试动态库路径问题:
- 如果动态库未找到(
not found
),检查:LD_LIBRARY_PATH
是否包含正确路径。- 文件的
RPATH
(用readelf -d
查看)。 - 系统默认路径(如
/usr/lib
、/lib
)。
- 如果动态库未找到(