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

来源:互联网 发布:osek网络管理 编辑:程序博客网 时间:2024/06/05 00:37
收集自: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 0