在二进制文件列表中查找函数调用

时间:2010-04-12 06:19:07

标签: c dependencies

我有一个可执行文件列表,可以调用某个函数。我需要找出所有高管都称之为该功能。我知道我可以做“字符串-a”但是还有其他更好的方法可以找到它。完整代码用C语言编写。

3 个答案:

答案 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)

straceltrace也可能有用。

答案 2 :(得分:0)

作为Michael Aaron Safyan's answer的变体,您可以使用objdump -d生成文件的汇编列表。然后,您可以grep -wn确定程序集列表中发生所需函数调用的行号。获得行号后,您可以查看列表并确定调用/使用它们的函数/例程,以及它们的使用方式(调用,分支,推入堆栈,......)。