如何在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
我有一个可执行文件,我想找出在特定 运行 期间实际使用了哪些共享库。我知道 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