在 Linux 系统中,SO(Shared Object)库是进程运行的核心依赖,定位运行中进程关联的 SO 库路径,可通过以下 4 种常用方法实现,覆盖不同场景需求。
1. ldd(静态查看,适用于可执行文件 / 非运行进程)
ldd 是最基础的工具,可直接解析可执行文件的 SO 依赖,但无法直接作用于运行中进程,需先获取进程对应的可执行文件路径,再结合 ldd 分析。
- 查找进程可执行文件路径(以进程 PID=1234 为例):
ls -l /proc/1234/exe # 输出示例:lrwxrwxrwx 1 root root 0 10月 20 10:00 /proc/1234/exe -> /usr/bin/nginx - 用 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:包含动态链接器相关信息(可选)。
- 查看进程加载的所有 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 - 查看 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 库,适合结合过滤条件精准查找。
- 查看进程打开的所有 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 - 仅提取 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 的进程 | 输出信息较冗余 |
2428

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



