我有一个可执行文件列表,可以调用某个函数。我需要找出所有高管都称之为该功能。我知道我可以做“字符串-a”但是还有其他更好的方法可以找到它。完整代码用C语言编写。
答案 0 :(得分:4)
您可以将nm实用程序与grep结合使用,以查找哪些可执行文件引用该符号,如下所示:
nm name_of_executable | grep symbol
因此,例如,如果我有一个可能使用“strcat”的可执行文件列表,我可以使用以下命令检查:
for file in exectuble1 executable2 ... executableN; do references_to_strcat=`nm "$file" | grep strcat -c` if [ $references_to_strcat -ne 0 ] ; then echo "$file" fi done
上面的小循环(假设BASH)将打印出引用“strcat”的所有文件的列表。请注意,这只会告诉您哪个可执行文件实际链接到符号...我无法确定哪些可执行文件可以使用动态加载引用该函数(例如dlopen / dlsym / dlcose)。
请注意,如果您拥有源代码,而不仅仅是可执行文件,则可以使用Doxygen为源代码生成完整的调用图(除文档外),这是另一种可能性。< / p>
答案 1 :(得分:1)
strace
和ltrace
也可能有用。
答案 2 :(得分:0)
作为Michael Aaron Safyan's answer的变体,您可以使用objdump -d
生成文件的汇编列表。然后,您可以grep -wn
确定程序集列表中发生所需函数调用的行号。获得行号后,您可以查看列表并确定调用/使用它们的函数/例程,以及它们的使用方式(调用,分支,推入堆栈,......)。