编译与链接的简单过程小结
2013-11-13 22:57
232 查看
一些集成IDE隐藏了处理的细节,其实一个程序的编译大体上可以分为如下几个步骤:
预处理->编译->汇编->链接
预处理:产生.i文件
gcc -E hello.c -o hello.i
cpp hello.c > hello.i
1。展开所有的宏定义
2。处理所有的条件编译指令
3。处理#include指令,将文件包含进去
4。删除所有的注释
5。添加行号和文件标识
6。保留所有的#pragma编译器指令,编译器需要使用到
编译:
gcc -S hello.i -o hello.s
进行词法分析、语法分析、语义分析以及优化后生成汇编代码
可以把预处理和编译合并,使用cc1的程序完成这一步骤
/usr/lib/gcc/i486-linux-gnu/4.1/cc1 hello.c
gcc命令可以说是一大堆后台程序的包装,根据不同参数调用相应的程序
汇编:
gcc -c hello.c -o hello.o
将汇编代码转为机器可以执行的指令,直接翻译即可,可以使用汇编器as
as hello.s -o hello.o
链接:
将所有文件拼接在一起
编译的过程
1.词法分析:
将源代码输入到扫描器,运用有限状态机将字符序列分割为一系列的记号,包括关键字、标识符、字面量和特殊符号,同时生产符号表和文字表等
2.语法分析
对记号使用上下文无关文法分析进而产生语法树,语法树就是以表达式为节点的树。
3.语义分析
编译器分析的其实是静态语义,包括申明和类型的匹配、类型的转换,将语法树的每一个表达式节点全部标上了类型
4.中间语言生成
源代码优化器将语法树转为中间代码,是语法树的顺序表示,中间代码可以是三地址码。同时,中间代码将编译器分为前端和后端,前端负责生成机器无关的中间代码,后端负责将中间代码转为目标机器代码。
5.目标代码生成与优化
属于编译器的后端,包括代码生成器和目标代码优化器,代码生成器将中间代码转为目标机器代码,这一过程依赖于目标机器,目标代码优化器对代码进行优化。
静态链接:
将源代码模块分别编译之后,需要将它们组装起来,组装模块的过程就是链接。与早期程序猿手工调整地址本质上没有区别。链接过程主要包括地址和空间分配、符号决议、重定位。
预处理->编译->汇编->链接
预处理:产生.i文件
gcc -E hello.c -o hello.i
cpp hello.c > hello.i
1。展开所有的宏定义
2。处理所有的条件编译指令
3。处理#include指令,将文件包含进去
4。删除所有的注释
5。添加行号和文件标识
6。保留所有的#pragma编译器指令,编译器需要使用到
编译:
gcc -S hello.i -o hello.s
进行词法分析、语法分析、语义分析以及优化后生成汇编代码
可以把预处理和编译合并,使用cc1的程序完成这一步骤
/usr/lib/gcc/i486-linux-gnu/4.1/cc1 hello.c
gcc命令可以说是一大堆后台程序的包装,根据不同参数调用相应的程序
汇编:
gcc -c hello.c -o hello.o
将汇编代码转为机器可以执行的指令,直接翻译即可,可以使用汇编器as
as hello.s -o hello.o
链接:
将所有文件拼接在一起
编译的过程
1.词法分析:
将源代码输入到扫描器,运用有限状态机将字符序列分割为一系列的记号,包括关键字、标识符、字面量和特殊符号,同时生产符号表和文字表等
2.语法分析
对记号使用上下文无关文法分析进而产生语法树,语法树就是以表达式为节点的树。
3.语义分析
编译器分析的其实是静态语义,包括申明和类型的匹配、类型的转换,将语法树的每一个表达式节点全部标上了类型
4.中间语言生成
源代码优化器将语法树转为中间代码,是语法树的顺序表示,中间代码可以是三地址码。同时,中间代码将编译器分为前端和后端,前端负责生成机器无关的中间代码,后端负责将中间代码转为目标机器代码。
5.目标代码生成与优化
属于编译器的后端,包括代码生成器和目标代码优化器,代码生成器将中间代码转为目标机器代码,这一过程依赖于目标机器,目标代码优化器对代码进行优化。
静态链接:
将源代码模块分别编译之后,需要将它们组装起来,组装模块的过程就是链接。与早期程序猿手工调整地址本质上没有区别。链接过程主要包括地址和空间分配、符号决议、重定位。
相关文章推荐
- 编译与链接的简单过程小结
- 程序编译、链接简单过程
- 简单汇编程序编译链接执行过程
- 【Symbian基础知识整理】_Symbian的目录结构和程序编译链接的简单过程
- C++编译链接过程
- ARM Linux编译链接过程分析
- 程序的编译链接过程
- uboot的编译链接过程
- C语言——关于编译运行过程以及链接的遐想
- C++编译和链接过程的详解
- C语言的编译链接过程详解
- 项目开发小结之——编译、链接
- u-boot编译学习--uboot编译链接过程
- 【对象模型】C++模版的编译链接过程——编译器真的会检查所有tocken层面的错误么?
- GCC含义、分步骤编译以及链接过程、Makefile写法
- c&&c++编译链接过程
- C语言编译链接加载过程
- 编译链接的全过程
- 程序的编译、链接过程详解
- Linux下C/C++编译链接过程及库函数使用说明