C语言(gcc)编译过程

linux环境下演示gcc编译过程

分步编译命令
作用 指令
预处理 gcc -E hello.c -o hello.i
编译 gcc -S hello.i -o hello.s
汇编 gcc -c hello.s -o hello.o
链接 gcc hello.o -o hello_elf
选项 含义
-E(大写) 只进行预处理
-S(大写) 进行编译 (将c程序转成汇编程序)
-c 进行汇编(将汇编代码转成机器代码)
-o file 指定生成的输出文件名
文件后缀 含义
.c c语言文件
.i 预处理后的c语言文件
.s 编译后的汇编文件
.o 编译后的目标文件

源文件:
在这里插入图片描述
链接文件:
在这里插入图片描述

第一步:预处理 处理伪指令和特殊符号

gcc -E hello.c -o hello.i
C语言(gcc)编译过程_第1张图片

从执行结果可以看出预处理将源文件中头文件包含在程序中。

预处理阶段主要进行一下工作
1、宏定义指令
宏定义又称为宏替换,值用一个表达式替换另一个式子,简称为宏
2、条件指令
条件指令可以使程序员通过定义不同的宏自由控制程序代码的执行,执行那些代码跳过那些代码。预编译处理会将那些多余的代码去掉。
3、头文件指令
如#include ,是指把相应的头文件包含至程序中,包含头文件是为了包含头文件中系统定义的函数,以便程序直接调用。
4、特殊符号
预编译的时候回检查是否有特殊符号,如LINE和FILE都被当成特殊符号处理,用适当的值来代替。

源文件经过预编译处理后会变成一个没有宏定义,头文件,条件指令和特殊符号的文件,这个文件与源文件的功能一样但是内容有所改变。

第二步:编译

gcc -S hello.i -o hello.s
C语言(gcc)编译过程_第2张图片
编译:把预编译得到的文件进行语法、语义分析等,使之转化为功能等价的中间代码或者汇编代码。
优化:对代码进行优化,减小代码的时间和空间,提高执行效率。

第三步:汇编

gcc -c hello.s -o hello.o
C语言(gcc)编译过程_第3张图片
汇编步骤中会将汇编代码转换成机器代码,但是此时机器代码还不能执行,还需要通过第四步链接才能生成可执行文件。

第四步:链接

gcc hello.o -o hello_elf
C语言(gcc)编译过程_第4张图片
链接程序把彼此有关的目标文件都链接起来,即把这些文件都联系成一个统一的整体转入机器的内存中,使目标文件能够相互调用。

C语言(gcc)编译过程_第5张图片

你可能感兴趣的:(c)