您的位置:首页 > 其它

gcc 编译过程简介

2013-09-16 10:06 239 查看
预编译 :处理所有注释 ,以空格替代

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

处理条件编译指令#if, #ifdef, #elif, #else, #endif

处理#include 展开包含文件

保留编译器需要使用的#pragma指令

预处理命令 gcc -E test1.c -o test1.i

编译 对预处理文件进行一系列的词法分析, 语法分析和语义分析

词法分析主要分析关键字,标示符,立即数等是否合法

语法分析主要分析表达式是否遵循语法规则

语义分析是在语法分析的基础上进一步分析表达式是否合法

分析结束后进行代码优化生成相应的汇编代码

编译命令 gcc -S test1.c -o test.s

汇编 汇编器将汇编代码转换为机器可以执行的代码机器码

汇编命令 gcc -C test.s -o test.o

链接器:将各个模块相互引用的部分处理好,使模块能够正确衔接

静态链接:

就是将这些文件简单的合在一起,就会导致File.out包含File1.out,File2.out,Lib.a很多的文件代码 ,如果 同时运行多个File.out ,内存空间就会被更多的File1.out,File2.out,Lib.a的拷贝占用,于是就产生了新的想法,就是对于某些特殊的库内存中能否仅维护一份拷贝呢,节省内存空间,那么就产生了动态链接。

动态链接:

就是在链接.o文件时,将需要的库中的函数告诉链接器函数是存在的,如果运行时调用那个函数就会去相应的库中动态链接,多个程序运行时,库并没有和可执行程序绑定在一起,需要库中函数时就去内存中找,内存中仅有一份库的拷贝,但是动态链接效率低下,因为.o程序调用函数时,需要内存寻址,动态链接库是否存在,如果不存在还要去寻找然后加到内存中去,这部分装载工作消耗一部分时间,在装载这段时间应用程序将被挂起,不会执行。

静态链接在编译期完成,动态链接在运行期完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: