一、最常用的方法:ldd 命令
ldd(List Dynamic Dependencies)是专门用于列出程序依赖的动态库的工具,用法简单、输出直观,是新手首选。
1. 基本用法
# 格式:ldd 程序的绝对路径/相对路径
ldd /bin/ls # 查看ls命令依赖的库
ldd ./myapp # 查看当前目录下myapp程序依赖的库
2. 输出解释(以ldd /bin/ls为例)
典型输出如下:
linux-vdso.so.1 (0x00007ffd797f3000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2e8a88c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2e8a4c8000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f2e8a247000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2e8a043000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2e8acb9000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2e89e23000)
- 第一列:依赖的库文件名(如
libc.so.6); - 第二列:
=>表示该库的实际找到的路径(如/lib64/libc.so.6),若显示=> ?或not found,说明库缺失; - 第三列:库在内存中的加载地址(可忽略)。
3. 注意事项
ldd存在安全风险:它会调用程序的动态链接器来获取依赖信息,不要对不可信的陌生程序使用 ldd(可能触发恶意代码);- 仅能查看动态库依赖,无法查看静态链接的库(静态库已编译进程序本身);
- 若程序本身无执行权限,
ldd可能报错,需先执行chmod +x 程序名。
二、更安全的替代方法
如果担心ldd的安全风险,可使用以下工具(仅读取程序文件信息,不执行程序):
1. readelf 命令
readelf 是读取 ELF 格式文件(Linux 程序 / 库都是 ELF 格式)信息的工具,可精准列出依赖库:
# 格式:readelf -d 程序路径 | grep NEEDED
readelf -d /bin/ls | grep NEEDED
输出示例:
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x0000000000000001 (NEEDED) Shared library: [libpcre2-8.so.0]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
该命令仅列出依赖的库名,不显示路径,需结合ldconfig -p | grep 库名查找路径:
ldconfig -p | grep libc.so.6 # 查找libc.so.6的实际路径
2. objdump 命令
objdump 是二进制文件分析工具,也可查看依赖库:
# 格式:objdump -p 程序路径 | grep NEEDED
objdump -p /bin/ls | grep NEEDED
输出示例与readelf类似,仅列出库名:
NEEDED libselinux.so.1
NEEDED libc.so.6
NEEDED libpcre2-8.so.0
NEEDED libdl.so.2
三、实操场景:排查库缺失问题
若运行程序时报error while loading shared libraries: libxxx.so.1: cannot open shared object file: No such file or directory,可按以下步骤排查:
# 1. 查看程序依赖的库,确认缺失的库名
ldd ./myapp | grep not found
# 2. 查找该库的安装路径(若已安装)
find /usr /lib /usr/local -name "libxxx.so.1" 2>/dev/null
# 3. 若找到路径,将其添加到ld.so.conf并更新缓存
sudo echo "/找到的库路径" >> /etc/ld.so.conf.d/myapp.conf
sudo ldconfig
# 4. 再次验证
ldd ./myapp # 确认no found消失
总结
- 日常查看程序依赖库优先用
ldd 程序路径,输出直观且包含库的实际路径,但避免用于不可信程序; - 安全场景下用
readelf -d 程序路径 | grep NEEDED或objdump -p 程序路径 | grep NEEDED,仅读取文件信息不执行程序; - 若
ldd显示not found,需找到库路径并添加到ld.so.conf(或临时设置LD_LIBRARY_PATH),再执行ldconfig生效。
3070

被折叠的 条评论
为什么被折叠?



