我知道这是一个非常基础的问题,但当我使用gcc/g++编译我的c/c++代码时,在汇编器生成机器代码之前,中间输出的类型究竟是什么?它是否类似于X86指令?
GCC的处理流程如下:
您的源代码
预处理源代码(展开宏和包含文件,去掉注释)(-E
, .ii
)
编译成汇编语言(-S
, .s
)
汇编成二进制代码(-c
, .o
)
链接到可执行文件
在每个阶段中,我列出了使该过程停止的相关编译器标志,以及相应的文件后缀。
如果使用-flto
编译,则对象文件将被装饰为GIMPLE字节码,这是一种低级中间格式,其目的是延迟实际的最终编译至链接阶段,从而允许进行链接时优化。
“编译”阶段是实际的重要部分。预处理器本质上是一个单独的、独立的工具(尽管它的行为是由C和C++标准规定的),汇编器和链接器实际上是单独的、独立的工具,基本上只是实现硬件的二进制指令格式和操作系统的可加载可执行文件格式。
必须是汇编代码。您可以在编译时使用-S
标志获取它。
没有所谓的“中间输出”。你得到的第一个输出就是机器码。(虽然你可以通过使用-E
参数仅调用预处理器来获取C/C++的中间输出。)
g++
直接生成汇编代码。 - Lol4t0-g -Wa,-ahl=main.s
。它们会导致GCC/G++发出带有交错高级源代码的汇编。 - Joseph Mansfield