【问题标题】:Recompile a x86 code with LLVM to some faster one x86使用 LLVM 将 x86 代码重新编译为更快的 x86
【发布时间】:2011-01-08 22:23:52
【问题描述】:

是否可以输入 x86 32 位代码来运行 LLVM 编译器?有一个巨大的算法,我没有源代码,我想让它在相同的硬件上运行得更快。我可以通过优化将它从 x86 翻译回 x86。

这段代码运行了很长时间,所以我想对其进行静态重新编译。此外,我可以对其进行运行时配置文件并给 LLVM 提示,哪些分支更有可能。

原始代码是为 x86 + x87 编写的,不使用 SSE/MMX/SSE2。重新编译后它有机会使用 x86_64 和/或 SSE3。此外,代码将以更优化的方式重新生成到硬件解码器。

谢谢。

【问题讨论】:

  • 这不是一个答案,但我记得 Amiga 有一些程序可以“优化”为 MC68000 编译的代码,以使其在更新的处理器上运行得更快,但代价是兼容性。但我知道 x86 没有这样的尝试。
  • IMO,您可能有更好的时间使用 IDA & hex-rays 或 Ollydbg 将程序集逆向工程回更高级别的语言(C 或 C++)
  • RevGen 是这里的 x86->LLVM 翻译器之一。它还具有从 x86 到静态二进制文件的翻译器。它使用 Qemu 和修改过的 MIPS TCG,生成 IR。
  • 还有dagger.repzret.org - Dagger,can decompile 到 LLVM IR。

标签: x86 llvm recompile


【解决方案1】:

LLVM 不能开箱即用地做到这一点。您必须将 x86 二进制文件写入 LLVM 中间表示 (IR) 转换器。这将是一项非常重要的任务。如果 x86 代码足够简单,它可能会非常接近地映射到 IR,但某些 x86 指令不会直接映射,例如堆栈指针操作。

编辑: 您还可以考虑尝试类似于 QEMU 所做的方法。 QEMU 即时翻译二进制文件,当我运行 PowerPC 代码时,每个基本块在执行之前都会被翻译成 X86 代码。您可以弄清楚如何将目标文件分解为基本块并为每个块生成 LLVM IR,丢弃东西(如参数传递等)并用直接 LLVM IR 替换它。

不过,这仍然是一项艰巨的任务。从头开始重写算法可能更容易。

这个确切的过程在"Dynamically Translating x86 to LLVM using QEMU"中有描述

【讨论】:

  • 有没有项目可以做同样的事情?
  • 不太可能。机器代码中没有足够的信息可供 LLVM 的优化器使用。代码必须经过逆向工程回到高级表示,然后才能有效地矢量化并重新编译为 64 位,并且编译器并不擅长进行推理。您也许可以使用执行动态重新编译的 x86 模拟器,但它不太可能对数学进行矢量化,而且开销会抵消任何性能提升。
  • 开销:有一些代码,我想快速运行。在运行新代码之前,我可以花 1 小时运行优化器。目标 - 是从较慢的时间获得更快的代码。重新编译的过程是静态完成的,一次。
  • HP personals.ac.upc.edu/vmoya/docs/bala.pdf 有一个旧项目,它对本地机器代码进行动态重新编译以使其更快。
  • 据我所知,没有这样的项目,但曾经有一个项目使用 LLVM 为 QEMU (code.google.com/p/llvm-qemu) 进行 JIT 编译代码,这是密切相关的。跨度>
【解决方案2】:

MAO project 似乎做了你想做的一部分(x86->中间语言)。

编辑:@osgx,您需要查看 mao 网站了解项目状态和他们可以处理的程序的详细信息。 (不过,自行修改代码可能具有挑战性。)

【讨论】:

  • 嗨。 MAO的地位如何?它可以处理 x86/x86_64 的哪个部分?它可以与自我修改的代码一起使用吗(例如,UPX 打包)
【解决方案3】:

据我所知,100% 正确反汇编 x86 代码是不可能的。由于数据和代码混合在一起,并且还由于可变长度指令。正确反汇编的唯一方法是动态解释它。

【讨论】:

  • 只有自修改代码才需要解释。静态代码可以很容易地反汇编(使用任何反汇编程序)。只有在运行时有重新编译器或动态代码可以解压缩为静态代码(在我的情况下,EXE 打包就像使用 UPX 一样,并且可以解压缩)时,才有可能使用动态代码
  • @osgx:这不是真的。例如,去同步技术很容易混淆反汇编程序。
  • 嗯,从技术上讲,这是对的,但没有任何值得工程设计的事情是 100% 可能的。所以理论上,100%?永远不可能...在实践中,99.98% 非常有可能...事实上,关于您如何克服理论限制并产生有价值的输出的详细记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多