精确控制GCC的输出

时间:2011-05-13 16:07:01

标签: c++ c gcc assembly x86

出于某些原因,我希望能够微调为我的C ++程序生成的最终可执行文件 - 直到单个指令。我记得,GCC应该生成一些文本汇编程序文件作为中间输出,然后将其提供给汇编程序以生成最终的二进制目标文件。

我是否有可能提取此汇编源,以编程方式编辑它并将此修改后的版本提供给最终的汇编程序以生成我的自定义目标文件?我的目标是Windows平台。

MSVC ++是否支持类似功能?

如果你想知道为什么,部分原因是通过包含我们的自定义多态代码生成逻辑来防止逆向工程。另一个原因是,在每个分发给客户的副本中创建隐藏的标识,以阻止任何人破解我们的保护并分发他的破解版本。

3 个答案:

答案 0 :(得分:6)

查看-S标志:

g++ -S file.c -o output.s

然后在output.s上进行微调并使用以下代码编译最终的可执行文件:

g++ output.s -o application

答案 1 :(得分:2)

是。在Linux上,试试这个:

$ cat hello.cc
#include <iostream>

int main() {
  std::cout << "Hello, world\n";
}

$ g++ -S hello.cc && sed -i 's/Hello, world/Goodbye, world/' hello.s && g++ -o goodbye hello.s && ./goodbye

答案 2 :(得分:2)

是的,gcc可以在编译阶段通过gcc -S生成汇编程序中间输出。您可以使用-On的各种优化级别n=0,1,2,3生成不同的汇编程序输出。如果你这样做,你会注意到-O3特别产生的东西,在你的头脑中,直接映射到C代码,因为gcc已经最佳地实现了代码。

MSVC可以通过cl.exe /Fafilename.asm执行相同的操作。 msdn文档是here

请注意,如果您需要可比较的语法,则可能需要gcc端的gcc -masm=intel -S。另请注意,Microsoft的宏汇编程序输出和GNU AS的输出之间会有一些差异。我不熟悉MASM,但所有汇编程序之间存在细微差别(以及明显的AT&amp; T vs Intel语法)。