ldd
是一个用于查看可执行文件或共享库所依赖的动态链接库(Shared Libraries)的 Linux 命令。它可以帮助开发者诊断程序运行时可能出现的库缺失或版本不兼容问题。
基本语法
ldd [选项] <可执行文件或共享库>
常用选项
选项 | 说明 |
---|---|
-v | 显示详细版本信息(冗余模式) |
-u | 打印未使用的直接依赖(需结合 -r 使用) |
-r | 显示未解析的符号(用于检查缺失的库或符号) |
-d | 执行重定位并报告缺失的库 |
--help | 显示帮助信息 |
常见用途
-
检查程序的依赖库
ldd /bin/ls
输出示例:
linux-vdso.so.1 (0x00007ffd48bee000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a3a3e0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a3a1c0000) libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f9a3a130000) ...
-
诊断库缺失问题
- 若输出中包含
not found
,则表示缺少对应的库:libxyz.so => not found
- 若输出中包含
-
检查符号冲突或版本问题
ldd -r /path/to/program
注意事项
-
安全警告
ldd
会直接运行程序的部分代码以解析依赖关系,因此不要对不可信的可执行文件使用ldd
。替代方案:objdump -p /path/to/file | grep NEEDED
或
readelf -d /path/to/file | grep NEEDED
-
动态链接 vs 静态链接
ldd
仅对动态链接的可执行文件有效。- 静态编译的程序会显示
not a dynamic executable
。
-
环境变量影响
ldd
的结果可能受LD_LIBRARY_PATH
等环境变量影响,需注意上下文。
示例场景
-
查找缺失的库
若程序运行时报错libxxx.so: cannot open shared object file
,可用ldd
确认路径是否正确。 -
验证库版本
通过ldd -v
查看库的详细版本,排查版本冲突问题。
替代工具
readelf
:更底层,适合分析 ELF 文件结构。objdump
:类似readelf
,但支持更多文件格式。strace
:跟踪程序运行时实际加载的库(动态行为)。
如果需要进一步了解某个选项或场景,可以补充提问!
实例
linux-vdso.so.1 (0x0000007f873e3000)
libboost_system.so.1.71.0 => /lib/aarch64-linux-gnu/libboost_system.so.1.71.0 (0x0000007f87384000)
libAGSDK.so.1 => ../lib/Release/libAGSDK.so.1 (0x0000007f84013000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007f83fe3000)
libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007f83dfe000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007f83d53000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007f83d2f000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f83bbc000)
libHscSDK.so.1 => ../lib/Release/libHscSDK.so.1 (0x0000007f8328e000)
libGL.so.1 => /lib/aarch64-linux-gnu/libGL.so.1 (0x0000007f83197000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007f83183000)
/lib/ld-linux-aarch64.so.1 (0x0000007f873b3000)
libDeviceDiscovery.so.1 => ../lib/Release/libDeviceDiscovery.so.1 (0x0000007f830cb000)
libGLdispatch.so.0 => /lib/aarch64-linux-gnu/libGLdispatch.so.0 (0x0000007f82f40000)
libGLX.so.0 => /lib/aarch64-linux-gnu/libGLX.so.0 (0x0000007f82efe000)
libX11.so.6 => /lib/aarch64-linux-gnu/libX11.so.6 (0x0000007f82dba000)
libxcb.so.1 => /lib/aarch64-linux-gnu/libxcb.so.1 (0x0000007f82d83000)
libXau.so.6 => /lib/aarch64-linux-gnu/libXau.so.6 (0x0000007f82d6f000)
libXdmcp.so.6 => /lib/aarch64-linux-gnu/libXdmcp.so.6 (0x0000007f82d59000)
libbsd.so.0 => /lib/aarch64-linux-gnu/libbsd.so.0 (0x0000007f82d32000)
这个 ldd
输出展示了可执行文件 http_server
运行时依赖的所有动态链接库(shared libraries)。
(1) 系统基础库
linux-vdso.so.1
Linux 内核提供的虚拟动态共享对象(用于加速系统调用)。libpthread.so.0
POSIX 线程库(多线程支持)。libstdc++.so.6
GNU C++ 标准库。libm.so.6
数学函数库(如sin()
,cos()
)。libgcc_s.so.1
GCC 运行时支持库(异常处理等)。libc.so.6
GNU C 标准库(如printf()
,malloc()
)。libdl.so.2
动态加载库(用于dlopen()
等函数)。
(2) 第三方库
libboost_system.so.1.71.0
Boost 库的系统模块(网络/错误处理等)。libGL.so.1
,libGLX.so.0
,libGLdispatch.so.0
OpenGL 图形库(可能用于图形渲染或 GPU 计算)。libX11.so.6
,libxcb.so.1
,libXau.so.6
,libXdmcp.so.6
X11 图形显示相关库(依赖 OpenGL 的 GUI 或远程显示)。libbsd.so.0
BSD 兼容性库(提供额外系统函数)。
(3) 项目自定义库
libAGSDK.so.1
项目内部的AGSDK
库(路径为../lib/Release/
)。libHscSDK.so.1
项目内部的HscSDK
库(路径同上)。libDeviceDiscovery.so.1
项目内部的设备发现库(路径同上)。