我正在研究为 linux 内核生成一个包含函数指针的调用图(有关更多信息,请参阅我之前的问题Static call graph generation for the Linux kernel)。我被告知 LLVM 应该适合这个目的,但是我无法在 llvm.org 上找到相关信息
任何帮助,包括指向相关文档的指针,将不胜感激。
我正在研究为 linux 内核生成一个包含函数指针的调用图(有关更多信息,请参阅我之前的问题Static call graph generation for the Linux kernel)。我被告知 LLVM 应该适合这个目的,但是我无法在 llvm.org 上找到相关信息
任何帮助,包括指向相关文档的指针,将不胜感激。
首先,您必须将内核编译为 LLVM IR(而不是本机目标文件)。然后,使用llvm-ld
将所有 IR 对象文件组合成一个大模块。这可能是一件非常棘手的事情,您必须大量修改makefile,但我相信这是可行的。
现在您可以进行分析了。可以使用带有pass的opt
工具生成一个简单的调用图。-dot-callgraph
它不太可能处理函数指针,因此您可能需要修改它。
跟踪所有可能携带函数指针的数据流路径是一个相当大的挑战,而且在一般情况下这是不可能的(如果有任何指向整数转换的指针,如果指针存储在复杂的数据结构中,等等)。对于大多数特定情况,您可以尝试实现全局抽象解释来近似指针的所有可能数据流路径。当然,这不会是准确的,但是您至少会得到一个保守的近似值。