问题描述
我有一个可执行文件,我想找出在特定运行期间实际使用了哪些共享库。我知道ldd会列出该可执行文件的所有共享库依赖关系,但我想找出在特定运行*中实际使用的那些子集。这可能吗?
*我的意思是在特定运行中使用某些输入参数运行可执行文件,这只会导致一小部分代码得以运行。
解决方法
您可以使用strace
和grep来打开.so文件。
strace $MYPROG | grep -E '^open*\.so
lsof
也应该对开放库进行grep处理。
lsof -p $PID | awk '{print $9}' | 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/^\(.*\)->.*/\1/; 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