[转]GCC编译过程分解

xiaoxiao2021-02-28  98

GCC编译过程分解 – 原地址

以helloworld为例分析gcc编译过程:

#include <stdio.h> int main() { printf(“Hello World\n”); return 0; }

通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,生成可执行文件a.out 实际上gcc hello.c可以分解为4个步骤,分别是预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking),如下图所示:

预编译

gcc –E hello.c –o hello.i,以下为预处理后的输出文件hello.i的内容

# 1 "hello.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "hello.c" # 1 "/usr/include/stdio.h" 1 3 4 # 28 "/usr/include/stdio.h" 3 4

/ 省略了部分内容,包括stdio.h中的一些声明及定义 /

# 2 "hello.c" 2 int main() { printf("Hello World\n"); return 0; }

预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:

将所有的#define删除,并且展开所有的宏定义;处理所有条件编译指令,如#if,#ifdef等;处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。删除所有的注释//和 /**/;添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;保留所有的#pragma编译器指令,因为编译器须要使用它们;

编译

编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。gcc –S hello.i –o hello.s,以下为编译后的输出文件hello.s的内容

.file "hello.c" .section .rodata .LC0: .string "Hello World" .text .globl main .type main, @function main: pushl
转载请注明原文地址: https://www.6miu.com/read-66865.html

最新回复(0)