繁体   English   中英

gcc / g ++输出类型

[英]gcc/g++ output type

我知道这是一个非常基本的问题,但是当我使用gcc / g ++编译我的c / c ++代码时,在汇编器发挥作用以生成机器代码之前,中间输出的确切类型是什么? 它是否像X86指令?

GCC的处理链如下:

  • 你的源代码

  • 预处理源代码(展开宏并包含,删除注释)( - -E.ii

  • 编译成程序集( -S.s

  • 汇编为二进制( -c.o

  • 链接到可执行文件

在每个阶段,我都列出了使进程停止的相关编译器标志,以及相应的文件后缀。

如果使用-flto编译,那么目标文件将使用GIMPLE字节码进行修饰,这是一种低级中间格式,其目的是将实际的最终编译延迟到链接阶段,这允许链接时间优化。

适当的“编译”阶段是实际的重型提升部分。 预处理器本质上是一个独立的独立工具(虽然它的行为是由C和C ++标准规定的),汇编器和链接器是实际上独立的独立工具,它们基本上分别只实现了硬件的二进制指令格式和操作系统的可加载可执行格式。

因此,GCC中可执行文件的编译由4部分组成:

1.)预处理(gcc -E main.c> main.i;将* .c转换为* .i)包括扩展,处理marcos。 删除评论。

2.)编译(gcc -S main.i;将* .i转换为* .s,如果成功)将C代码编译到Assembler(在目标x86架构上它是x86-assembly,在目标x86_64架构上它是x64-assembly ,在目标臂架构上,它是臂组件等。)大部分警告和错误发生在这一部分(例如,错误和警告报告)

3.)汇编(如main.s -o main.o;将* .i转换为* .o,如果成功则再次转换)程序集生成汇编程序到机器代码。 虽然程序还有相对的地址等等。

4.)链接(gcc main.o)用绝对地址替换相对地址。 删除无用的文字。 在此阶段链接错误和警告。 最后(如果成功),我们获得可执行文件。

所以,为了回答你的问题,你所说的中间输出实际上就是所谓的汇编语言 - 请参阅关于汇编语言wiki的wiki

以下是redhat杂志提供的gcc编译步骤的图形表示:

gcc编译步骤

与其他答案所暗示的相反,没有汇编步骤 - 相反,生成汇编代码会替换目标代码生成; 如果您真正想要的是二进制表示,那么将内存中表示转换为文本表示没有多大意义。

它必须是汇编代码。 您可以在命令行中使用-S标志来进行编译。

没有“中间输出”。 您获得的第一个输出是机器代码。 (尽管可以通过使用-E调用预处理器来获得C / C ++中间输出。)

GCC工具链,将程序从源代码编译为机器代码。 编译器生成汇编代码,汇编程序将汇编代码汇编到机器代码中。 是一个很好的初学者教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM