如何查找Linux程序特定运行时实际使用的共享库?
如何追踪程序特定运行时实际加载的共享库
当然可行!ldd只能列出程序编译链接阶段声明的所有依赖库,但实际运行时——尤其是当你用特定参数只触发了一小部分代码路径时——很多库其实根本不会被系统加载。下面给你几个实用的工具和方法,帮你精准追踪这次特定运行中实际用到的共享库:
1. 用 strace 追踪库的打开系统调用
动态链接库在加载时,系统会调用open或openat来读取对应的.so文件。我们可以用strace过滤这些系统调用,直接得到实际被加载的库:
strace -e open,openat ./your_program [你的特定参数] 2>&1 | grep -E '\.so(\.[0-9]+)*"'
- 如果你的程序会创建子进程,记得加上
-f参数,这样能追踪到子进程里加载的库 - 这个方法快且直接,输出的就是实际被打开的共享库路径
2. 用 ltrace 追踪动态链接器的加载操作
ltrace可以跟踪程序调用的库函数,包括动态链接器的dlopen(不管是程序手动调用还是系统自动加载):
ltrace -l 'libdl.so*' ./your_program [你的特定参数] 2>&1 | grep dlopen
- 要是想看到所有自动加载的库的过程,也可以直接运行
ltrace ./your_program ...,然后从输出里过滤加载相关的内容,不过指定libdl.so*会让输出更精准,减少无关信息
3. 用 gdb 调试追踪(最精准)
如果你需要最详细的加载信息,比如加载顺序、每个库加载的时机,可以用gdb设置断点来追踪:
- 启动gdb并加载你的程序:
gdb ./your_program - 在动态链接器的加载函数
_dl_open上设置断点:break _dl_open - 带着特定参数运行程序:
run [你的特定参数] - 每次触发断点时,用下面的命令查看当前已加载的所有共享库:
info sharedlibrary
- 你还可以用
commands命令设置断点触发时自动记录信息,避免手动重复输入
4. 用 perf 工具(进阶分析)
如果你的需求还结合了性能分析,perf可以追踪模块加载事件,同时记录程序的执行情况:
perf record -e module_load ./your_program [你的特定参数]
运行完成后,用perf report就能看到这次运行中加载的所有模块(包括共享库)的详细信息
内容的提问来源于stack exchange,提问作者dcon
相关产品推荐
相关产品推荐

