Linux 查看运行进程依赖 SO 库位置的方法

在 Linux 系统中,SO(Shared Object)库是进程运行的核心依赖,定位运行中进程关联的 SO 库路径,可通过以下 4 种常用方法实现,覆盖不同场景需求。

1. ldd(静态查看,适用于可执行文件 / 非运行进程)

ldd 是最基础的工具,可直接解析可执行文件的 SO 依赖,但无法直接作用于运行中进程,需先获取进程对应的可执行文件路径,再结合 ldd 分析。

  1. 查找进程可执行文件路径(以进程 PID=1234 为例):
    ls -l /proc/1234/exe
    # 输出示例:lrwxrwxrwx 1 root root 0 10月 20 10:00 /proc/1234/exe -> /usr/bin/nginx
    
  2. 用 ldd 查看该可执行文件的 SO 依赖及路径:
    ldd /usr/bin/nginx
    # 输出示例:
    #    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9e8a600000)
    #    libc.so.6 => /lib64/libc.so.6 (0x00007f9e8a230000)
    #    /lib64/ld-linux-x86-64.so.2 (0x00007f9e8a820000)
    

ldd 仅显示编译时指定的依赖,无法反映运行中动态加载的 SO(如通过dlopen加载的库)。

2. /proc 文件系统(动态查看,适用于运行中进程)

Linux 为每个运行进程在/proc/[PID]目录下提供实时状态文件,其中:

  • maps:记录进程内存映射,包含所有加载的 SO 库路径;
  • smaps:更详细的内存映射(含 SO 库的内存占用);
  • auxv:包含动态链接器相关信息(可选)。
  1. 查看进程加载的所有 SO 库路径(过滤非 SO 行):
    suod cat /proc/1234/maps | grep -E '\.so' | awk '{print $6}' | sort | uniq
    # 输出示例:
    # /lib64/libpthread.so.0
    # /lib64/libc.so.6
    # /usr/lib64/nginx/modules/ngx_http_ssl_module.so
    
  2. 查看 SO 库的详细映射信息(如内存地址、权限):
    cat /proc/1234/smaps | grep -A 10 'libc.so.6'
    

可捕获运行中动态加载的 SO 库(如dlopen加载的库),是最准确的动态查看方式。

3. pldd(简洁查看运行进程的 SO 依赖)

pldd 是专门用于列出运行进程已加载 SO 库的工具,输出简洁,无需手动过滤,需安装procps-ng包(大部分 Linux 发行版默认自带)。

# 直接指定PID查看
pldd 1234
# 输出示例:
# 1234: /usr/bin/nginx
# /lib64/libpthread.so.0
# /lib64/libc.so.6
# /usr/lib64/nginx/modules/ngx_http_ssl_module.so

# 也可指定进程名(需进程名唯一)
pldd nginx

输出格式简洁,无需手动过滤,优先推荐使用。

4. lsof(通过文件描述符查看 SO 库)

lsof(List Open Files)可列出进程打开的所有文件,包括加载的 SO 库,适合结合过滤条件精准查找。

  1. 查看进程打开的所有 SO 库:

    bash

    lsof -p 1234 | grep '\.so'
    # 输出示例:
    # nginx   1234 root  mem    REG    8,1  144920 101355 /lib64/libpthread.so.0
    # nginx   1234 root  mem    REG    8,1 2156520 101360 /lib64/libc.so.6
    
  2. 仅提取 SO 库路径:

    bash

    lsof -p 1234 | grep '\.so' | awk '{print $9}' | sort | uniq
    

若需查找系统中加载了某个特定 SO 库的所有进程:

lsof | grep '/lib64/libc.so.6' | awk '{print $2}' | sort | uniq

5. 总结:方法选型建议

场景推荐方法优点缺点
静态查看可执行文件依赖ldd简单快速无法查动态加载的 SO
动态查看运行进程所有 SO(含动态加载)/proc/[PID]/maps最全面、准确需手动过滤输出
简洁查看运行进程 SO 依赖pldd输出干净,无需过滤部分系统可能未预装
结合文件描述符分析 SO 依赖lsof可反向查找使用某 SO 的进程输出信息较冗余
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DeeplyMind

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

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

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

打赏作者

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

抵扣说明:

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

余额充值