Linux系统中查看程序依赖库的常用方法

一、最常用的方法: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消失

总结

  1. 日常查看程序依赖库优先用ldd 程序路径,输出直观且包含库的实际路径,但避免用于不可信程序;
  2. 安全场景下用readelf -d 程序路径 | grep NEEDEDobjdump -p 程序路径 | grep NEEDED,仅读取文件信息不执行程序;
  3. ldd显示not found,需找到库路径并添加到ld.so.conf(或临时设置LD_LIBRARY_PATH),再执行ldconfig生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

start_up_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值