【问题标题】:Source-to-source compilation with LLVM [closed]使用 LLVM 进行源到源编译 [关闭]
【发布时间】:2023-03-24 01:14:01
【问题描述】:

我需要将 x86 汇编源代码转换为 LLVM 人类可读的 .ll 文件(又名 LLVM 汇编语言)。我怎样才能做到这一点?如果没有直接的解决方案,是否有可能在 LLVM 基础架构中以尽可能少的努力来实现?

我想,我正在寻找的解决方案应该是某种 llc 的对应物,它将 .s 文件转换回 .ll 表示形式。

【问题讨论】:

  • 这个问题已经被问及回答了。由于很多东西(例如间接分支),没有直接的解决方案。你可能会发现像 llvm-qemu 和 libcpu 这样的项目对你很有用。无论如何,这个问题是stackoverflow.com/questions/6981810/…
  • 谢谢。我已经看过你提到的那些项目。不幸的是,llvm-qemu 看起来已经死了。并且 libcpu 看起来像是在解析程序集而不是使用 LLVM 的基础架构(因此它在支持 x86 ISA 方面似乎不完整)。实际上,我认为我正在寻找的工具应该完成 LLVM 的 AsmPrinter 的工作,但反向将本机 ISA 指令转换为 LLVM 的 MachineInstr 或 LLVM-MC 的 MCInst.
  • 那么 LLVM 的子项目 llvm-mc 呢?它有 AsmParser 类,可以吃.s 文件并基于 MCInst 类生成其表示。在这种情况下,唯一未做的部分是相对于 MCLowering 类反向返回到 LLVM 的基于 MachineInstr 的表示。
  • MachineInstr != LLVM IR。 MI 仍然是机器码。考虑例如你有“jmp [eax]”指令。你会将它转换成哪个 LLVM IR 指令?
  • 例如,我会对 x86/x86_64 -> 有限制的 LLVM 转换器感兴趣,它能够反汇编有限的 x86、x86_64 指令集,但重组 hello world 和一些计算算法是合理的。

标签: assembly llvm code-translation


【解决方案1】:

仅针对那些仍在寻求有关此主题的更多信息的人,我想分享有关我在网络上找到的一个正在进行的项目 (http://dslab.epfl.ch/proj/s2e) 的信息。该项目有两个组成部分:

  1. x86-to-LLVM backend 用于将 x86 机器代码动态转换为 LLVM IR
  2. RevGen 用于 x86 二进制文件静态分析的工具,能够将内联 x86 程序集转换为 LLVM IR

这是 RevGen 原型: RevGen 将 x86 二进制文件作为输入,并分三步输出等效的 LLVM 模块。首先,RevGen 查找所有可执行代码块并将它们转换为 LLVM 翻译块。其次,当没有更多的翻译块需要覆盖时,RevGen 将它们转换为基本块,并以 LLVM 格式重建原始二进制文件的控制流图。第三,RevGen 解析外部函数调用以构建最终的 LLVM 模块。对于动态分析,最后一步将 LLVM 模块与允许执行 LLVM 模块的运行时库链接。

【讨论】:

  • 这些工具用于处理已经组装好的程序。除非你说要么可以从 x86 .ASM 生成 LLVM 位码/IR?
  • @techzilla 发现了一些从 x86 源代码开始的东西?
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多