2010-04-12 55 views
4

我有一个可执行程序列表,它可能会调用某个函数。我需要找出哪些所有执行者调用该函数。我知道我可以做“字符串-a”,但还有其他更好的方法来发现。完整的代码是用C写在二进制列表中查找函数调用

回答

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为源代码生成完整的调用图(除文档外),这是另一种可能性。

+0

你从根本上无法确定每个'dlopen()'调用的参数是什么。理论上,程序可以从标准输入中读取“dlopen”的参数。 – MSalters 2010-04-13 12:45:12

+0

@ MSalters,我同意。这就是为什么我不知道通过动态加载来确定哪些可执行文件引用该函数的方法。理论上,可以确定dlopen()/ dlsym()的参数是否为编译时常量(或者可以从编译时常量推断出来),还是依赖用户输入生成。不过,我不知道这样做的好方法。在由用户输入生成的情况下,还可以理论上确定是否可以构建特定的函数名称(确认是否阻止该名称)等。 – 2010-04-13 23:46:59

0

作为Michael Aaron Safyan's answer的变体,您可以使用objdump -d来生成该文件的汇编列表。然后您可以通过grep -wn来确定装配清单中发生所需功能调用的行号。一旦你有了行号,你可以查看你的列表并确定它们被调用/使用的函数/例程,以及它们如何被使用(称为,分支,推入堆栈......)。

1

straceltrace也可能是有用的。