GCC 编译过程及每个过程做了那些事(收集)

收集自:http://blog.chinaunix.net/uid-20196318-id-28797.html
        http://blog.sina.com.cn/s/blog_4bab8e7f01011gef.html
在使用GCC编译程序时,其编译过程可以分为4个阶段:预处理(Pre-Processing) -> 编译(Compling) -> 汇编(Assembling) -> 连接(Linking) .
一、预处理:gcc -v -E filename -o filename.i
.i 文件中会显示整个预处理过程,带-v参数,可以在中断看见gcc预处理过程。

(-E输出文件,如上面.i文件中#开头的都是需要替换的)

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

include搜索文件时,会在以下几个路径搜索:
1.编译的时候指定路径
2.gcc的specs里
3.使用-I参数指定的路径
4.gcc环境变量设置(C_INCLUDE_PATH)

include "fllename.h"
   先在当前目录寻找,然后再系统目录寻找
include <fllename.h>
   只在系统目录寻找,找不到报错
应用时,用前者包含用户自定义文件,用后者包含系统文件,这样的效率是最高的。

系统目录应该是指gcc的specs里所指,形如:
/usr/include 
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
二、编译:gcc –S hello.i –o hello.s
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
三、汇编
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
     gcc –c hello.c –o hello.o
四、链接
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。

ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值