如何使用LLVM生成调用图?

add*_*lbx 13 static-analysis llvm call-graph

我正在研究为linux内核生成一个包含函数指针的调用图(有关更多信息,请参阅我之前的问题,Linux内核的静态调用图生成).我被告知LLVM应该适合这个目的,但我无法在llvm.org上找到相关信息

任何帮助,包括指向相关文档的指针,将不胜感激.

SK-*_*gic 14

首先,您必须将内核编译为LLVM IR(而不是本机对象文件).然后,使用llvm-ld,将所有IR对象文件组合成一个大型模块.这可能是一件非常棘手的事情,你必须大量修改makefile,但我相信它是可行的.

现在您可以进行分析了.可以使用opt带有-dot-callgraphpass 的工具生成简单的调用图.它不太可能处理函数指针,因此您可能想要修改它.

跟踪将携带函数指针的所有可能的数据流路径是一个相当大的挑战,并且通常情况下是不可能的(如果有任何指向整数强制转换的指针,如果指针存储在复杂的数据结构中,等等).对于大多数特定情况,您可以尝试实现全局抽象解释,以近似指针的所有可能数据流路径.当然,这不准确,但是你至少会得到一个保守的近似值.

  • 不推荐使用`llvm-ld`,而是使用`llvm-link`或gold plugin. (4认同)
  • 你真的不想为800万行代码生成一个点调用图.它会覆盖一个网球场,如果点可以画它,它不能.除此之外,这是对OP的另一个问题的答案的一个很好的回应: - }特别强调有趣的函数指针是什么. (2认同)