pldd 是 GNU libc 提供的用于打印运行中进程已加载共享对象(.so 文件)的工具,通过解析 /proc/<PID>/maps 实现,无需调试或挂起进程,但需相应权限。

pldd 是 GNU libc 提供的一个小工具,专门用于在进程运行时打印其已加载的共享对象(.so 文件)。它不依赖进程是否被调试、是否挂起,只要进程处于运行状态且有权限访问其内存映像,就能列出当前加载的所有动态链接库。
确认 pldd 可用且目标进程存在
大多数 Linux 发行版默认安装了 pldd(通常随 glibc-utils 或 libc-bin 包提供)。先检查命令是否存在:
→ 命令:which pldd 或 pldd --version再确认目标进程 PID 存在且你有读取其内存映像的权限(通常需同用户或 root):
→ 命令:ps -p <PID> -o pid,comm,args直接使用 pldd 打印所有 .so 库
执行以下命令即可输出该进程当前加载的全部共享库路径:
→ 命令:pldd <PID>输出示例:
/lib64/libc.so.6/usr/lib64/libpthread.so.0
/lib64/ld-linux-x86-64.so.2
/usr/lib64/libstdc++.so.6
注意:pldd 会自动解析 /proc/<PID>/maps 中的映射段,并过滤出具有可执行或可读权限的 .so 文件,跳过静态链接部分和未映射的占位符。
常见问题与注意事项
- 若提示 “Permission denied”,说明当前用户无权读取目标进程的内存映像(如 /proc/<PID>/mem),需切换为 root 或进程所属用户执行
- 对 setuid 进程或某些安全加固过的进程(如启用 YAMA ptrace_scope),pldd 可能失败,此时需临时调整内核参数或使用其他方式(如 gdb attach 后 info sharedlibrary)
- pldd 不显示库的加载地址或符号表信息,仅输出路径;如需更详细信息,可配合 readelf -d 或 ldd(仅适用于可执行文件,非运行中进程)
- 某些极简容器环境(如不含 glibc-utils 的 Alpine)可能未预装 pldd,需手动安装或改用 /proc/<PID>/maps + awk 解析
替代方案:从 /proc/<PID>/maps 手动提取 .so 路径
当 pldd 不可用时,可快速提取已映射的 .so 文件:
→ 命令:awk '$6 ~ /\.so$/ {print $6}' /proc/<PID>/maps | sort -u该方法只匹配末尾为 .so 的路径字段,不能识别无扩展名但实际是共享库的文件(如 libz.so.1),也不过滤掉重复或无效条目,精度低于 pldd。


















