【问题标题】:Constructing a complete control flow graph for Linux kernel为Linux内核构建完整的控制流图
【发布时间】:2021-06-27 17:17:19
【问题描述】:

是否有任何工具可以为整个 Linux 内核二进制文件构建控制流图?例如,考虑为 x86 架构编译的 Linux 内核(vmlinux 文件)。是否可以同时使用静态分析和动态分析来确定所有执行路径(关于间接调用)?有没有适合这个的工具?

【问题讨论】:

  • 这可能是一个不错的博士项目(需要几年的工作)。许多路径取决于硬件响应(我们不确定可能的硬件错误,并且硬件有很多错误,所以忘记阅读标准)。动态分析:您只能到达几条可能的路径。你有 Linux 源代码,所以你可以从一些静态部分中获利。这是一个研究项目,我们不想从你那里窃取它。
  • 其实是我硕士的研究项目。

标签: linux linux-kernel call-graph control-flow-graph


【解决方案1】:

我假设您的意思是分析用于生成 Linux 二进制文件的源代码。

希望您已为大量工作做好准备。有一些原因你不能把它下架。

你需要两种工具:

  1. 构造单个 C 源文件的控制流图的机制,适用于 Linux 内核使用的真正的 C 方言。

  2. 可以构建全局调用图的东西,包括间接调用;如果你不能很好地处理间接调用,你的调用图要么连接过度(著名的“涂鸦”图),要么连接不足(大多数函数无法访问)。

对于 [1],

  • 您可以从头开始构建自己的自定义工具,毕竟,您“只需要一个解析器”。这条路简直是疯了。见http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html
  • 大多数现代 C 编译器都会在编译源文件过程中执行此操作,因此这是一个很有希望的地方。鉴于 GCC 用于编译 Linux,这是最明显的地方:https://gcc.gnu.org/ 让 GCC 以某种可用的形式为您的目的咳出控制流图可能更难;众所周知,GCC 的内部结构很难使用。 Clang可以编译C程序;我不知道它与 GCC 方言的兼容性,但我猜这很有可能。 Clang (https://clang.llvm.org/) 似乎是为了定制而构建的,因此 CFG 提取在技术上可能很简单,我敢打赌 Google 已经为内部项目做到了这一点。还有其他 C 编译器(例如 Intel 的),但如果他们不使用 Linux 上使用的 GCC 方言,你会发现自己首先必须适应它们,而不是提取你想要的东西,然后获取它们的源代码编译器以便您进行这些更改可能很困难。
  • 您可以尝试适配一些安全扫描工具,例如 Coverity 或 KlocWork。我怀疑你会在获得这样一个你可以适应的形式的工具方面取得很大的进步。
  • 您可以使用(商业)通用程序转换工具,例如我们的 DMS 软件再造工具包。 DMS 是一种可定制的编译器技术,旨在供积极进取的工程师在内部使用。 DMS可以处理很多GCC方言,已经在数千万行代码的真实嵌入式软件系统上使用。 DMS 的 GCC 前端构造控制和数据流图;见http://www.semdesigns.com/products/DMS/FlowAnalysis.html#DataFlowAnalysis。另一个(研究)程序转换工具是 RascalMPL https://www.rascal-mpl.org/ 可能有用,但我还没有听说它被应用于 GCC 方言或以这种规模运行;它可能会这样做。

对于 [2],

  • 您可以构建您的调用图构建工具自定义工具。在这种规模下进行指针敏感的流分析并不像构建流图结构那么难,但在完成它所需的大胆程度方面非常接近。 (Google 可能有这种胆量)。
  • DMS 有一个指向分析子系统,该子系统已用于 1600 万行嵌入式系统(对于客户端,为他们启用自定义代码生成任务)。它还具有使用此指向信息的调用图结构。见http://www.semdesigns.com/products/DMS/FlowAnalysis.html#CallGraphAnalysis。具体请参阅示例调用图链接,该链接显示了指向分析的结果。

获得这些片段后,您可以考虑如何处理结果。我可以告诉你,一百万线系统的流程图将覆盖一个分辨率为 1 英寸的足球场;您需要强大的计算能力来遍历/分析这样的图表。

如果您的意图是直接分析 Linux 二进制文件(当然您希望处理链接器模块),那么构建控制流图的问题几乎没有那么严重,因为您不必处理相当于编译器的大部分内容。现在您只需要担心整个英特尔指令集。但是,如果您准确地对机器指令建模,那么您的 CFG 可能是源代码的 10 倍,并且在将任何问题追溯到源头方面的帮助要小得多。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多