将C ++代码编译成汇编然后解组

时间:2011-11-01 02:48:36

标签: c++ linux gcc disassembly intermediate-language

有谁知道如何将C ++代码转换为汇编代码然后反过来呢? 前进的方式非常简单:

g++ -S

我想分析输出并查看它是否已正确编译(仅为了好奇心,但它可以有一些应用程序)。但是,我对汇编的了解非常有限,输出很难理解(如果我使用优化(-O)或使用调试信息(-g)编译,尤其如此。)

是否有用于生成C ++代码的C ++(GCC)反汇编程序?如果没有,是否有任何中间表示,我可以编译C ++代码然后从它返回?

似乎有一些方法可以将C ++转换为C here。海湾合作委员会有什么可以做的吗?

4 个答案:

答案 0 :(得分:4)

在一些约束条件下,将汇编语言反汇编回C ++是可能的(例如,使用HexRays) - 主要是因为你得到的C ++会正确地反映基本算法,它可能看起来不会与原始源代码非常相似(尽管C ++名称修改确实有助于保持比原始许多语言更接近原始代码的东西)。

答案 1 :(得分:2)

后一个问题(“是否有任何中间表示,我可以将C ++代码编译成它然后从它返回?”)听起来像是由CLang生成的AST。

答案 2 :(得分:1)

也许您可能有兴趣了解更多关于GCC使用的内部表示,特别是GIMPLE(和Tree-s)。如果你想利用GCC围绕GIMPLE进行大量处理,你应该考虑编写GCC pluginGCC MELT extension(MELT是一种高级域特定语言,可以轻松扩展GCC)。

但是我所知道的C ++编译器的所有中端内部表示与C ++源代码相差甚远,因为C ++前端已经做了很多工作,并且没有简单的方法可以返回一些有用的C ++。

忠实而完整的decompilation实际上几乎是不可能的,因为编译器生成的汇编代码已经从原始源代码中丢失了一些知识。

答案 3 :(得分:0)

使用objdump -d反汇编编译对象。除此之外,您无法从中获取更多信息(绝对不是原始来源)。如果我是你,我会信任编译器。