我正在使用perl脚本为C实现调用图程序。我想知道如何使用'objdump'的输出来解决函数指针的调用图? 不同的调用图应用程序如何解析函数指针? 函数指针是在运行时解析还是可以静态完成?
修改 调用图如何解决程序静态评估中的循环?
答案 0 :(得分:2)
当call语句明确提到B时,很容易构建A-calls-B的调用图。正如你所注意到的那样,处理间接调用要困难得多。
好的静态分析工具通过使用各种各样的程序数据流(程序间和程序内[“全局”])传播指针赋值/副本/算术来形成指针变量内容的估计计划,通常是保守的(“你得到太多”)。
如果没有这样的估计,你就无法知道指针包含什么,因此根本无法做出有用的预测(好吧,你可以使用最终的保守估计它会去任何地方,但我想你已经拒绝了解)。
我们的DMS Software Reengineering Toolkit已static control/dataflow/points-to/call graph analysis已应用于大型系统(~~ 2500万行)的C代码,并生成此类调用图。这样做的机器 非常复杂,但您可以在编译器文献的高级主题中找到它。我怀疑你想在Perl中实现它。
当您拥有源代码时,这会更容易,因为您至少可靠地知道什么是代码,什么不是。您试图在目标代码上执行此操作,这意味着您甚至无法消除数据。
答案 1 :(得分:1)
使用函数指针是一种选择在运行时调用的实际函数的方法,因此通常不可能知道静态实际发生了什么。
但是,您可以查看可能调用的所有函数,并以某种方式显示这些函数。回调通常具有足够独特的签名(并非总是如此)。
如果你想做得更好,你必须分析源代码,看看哪些函数被分配给指针开始。