1

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

g++ -S

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

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

似乎有一些方法可以在这里将 C++ 转换为C。海湾合作委员会对此有任何帮助吗?

4

4 回答 4

4

将汇编语言反编译回 C++ 是可能的(例如,使用HexRays),但有一些限制——主要是虽然你得到的 C++ 将正确反映基本算法,但它可能看起来不太像原始源代码(尽管 C++ 名称修饰确实有助于保持比您通常使用许多其他语言更接近原始的东西)。

于 2011-11-01T02:55:04.033 回答
2

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

于 2011-11-01T09:08:19.977 回答
1

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

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

忠实和完全的反编译在实践中几乎是不可能的,因为编译器生成的汇编代码已经从原始源代码中丢失了一些知识。

于 2011-11-01T14:09:34.627 回答
0

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

于 2011-11-01T02:54:24.100 回答