如何在Linux中找到执行过程中实际使用的所有共享库?

How to find all shared libraries actually used during execution in Linux?

我有一个可执行文件,我想找出在特定 运行 期间实际使用了哪些共享库。我知道 ldd 会列出该可执行文件的所有共享库依赖项,但我想找出在特定 运行* 期间实际使用的那些依赖项的子集。这可能吗?

*我对特定 运行 的意思是 运行 使用某些输入参数连接可执行文件,这只会导致一小部分代码成为 运行.

您可以使用 strace 和 grep 打开 .so 文件。

strace $MYPROG | grep -E '^open*\.so

lsof 也应该可以 grep 查找打开的库。

lsof -p $PID | awk '{print }' | grep '\.so'

这假定共享库具有 .so 扩展名

您可以为此使用 ltrace(1)

$ PROG='ls -l'
# Collect call info
$ ltrace -o calls.txt -l '*' $PROG &> /dev/null
# Analyze collected data
$ cat calls.txt | sed -ne '/->/{ s/^\(.*\)->.*//; p }' | sort -u
libacl.so.1
libcap.so.2
libc.so.6
libselinux.so.1
ls
# Compare with ldd
$ ldd /bin/ls | wc -l
10