gcc 编译过程

本文详细介绍了GCC编译器的工作流程,包括预处理、编译、汇编和链接四个阶段。预处理阶段处理宏定义、条件编译指令等;编译阶段进行词法、语法分析并生成汇编代码;汇编阶段将汇编代码转换为机器指令;链接阶段解决符号依赖,生成可执行文件。
摘要由CSDN通过智能技术生成

GCC 编译分为四个过程  举例hello.c 的编译过程

#include<stdio.h>

int main()

{

 printf("Hello World\n");

 return 0;

}


(1)预处理  gcc -E hello.c -o hello.i

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

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

l  将所有的#define删除,并且展开所有的宏定义;

l  处理所有条件编译指令,如#if#ifdef等;

l  处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。

l  删除所有的注释// /**/

l  添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;

l  保留所有的#pragma编译器指令,因为编译器须要使用它们;

2.编译   gcc -S hello.i  -o hello.s

编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。

(介绍一个将可执行文件转换为汇编文件的方法  

Arm-linux-objdump –D elf_file > dis_file或者

Arm-linux-objdump –D –b binary –m arm bin_file > dis_file

)

3.汇编  gcc -c hello.s -o hello.o

汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

4.链接  gcc  hello.o -o hello

链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值