编译和链接
1. 翻译和运行环境
在ANSIC的任何一种实现中,存在两个不同的环境
翻译环境:源代码被转化成可执行的机器指令(二进制指令)——编译器
执行环境:实际执行代码——操作系统
2. 翻译环境
由编译和链接两大部分组成
- 编译:预处理、编译、汇编
- 多个.c文件经过编译器——.obj文件(Windows)或.o文件(Linux)
- 多个目标文件和链接库一起经过链接器生成最终的可执行文件
2.1. 预处理
源文件和头文件被处理为.i为后缀的文件
gcc -E test.c -o test.i
处理规则
- 将所有#define删除,并展开所有宏定义
- 处理所有条件编译指令
- 处理include预编译指令,将包含头文件内容插入到预编译指令的位置。
- 删除所有注释
- 添加行号和文件名标识,方便后续编译器生成调试信息
- 保留所有的#pragma的编译指令,编译器后续会使用
2.2. 编译
将预处理后生成的.o文件进行一系列的:词法分析、语法分析、语义分析及优化
gcc -S test.i -o test.s
2.2.1. 词法分析
将代码的字符分割成一系列记号 array[index]=(index+4)*(2+6)
+——加号
=——赋值
[——左方括号
2.2.2. 语法分析
对扫描产生的记号进行语法分析,从而产生语法树。语法树是以表达式为节点的树
2.2.3. 语义分析
由予以分析器来完成语义分析,即表达式的语法层面分析。编译器能做到分析是语义的静态分析。静态语义分析:声明和类型的匹配,类型的转换。这个阶段会报告错误的语法分析
2.3. 汇编
将汇编代码转换成机器可执行的指令,每一个汇编语句几乎对应一条机器指令,不做指令优化
gcc -c test.s -o test.o
2.4. 链接
将一堆文件链接在一起形成可执行程序
主要包括:地址和空间分配、符号决议、重定位等布置
解决的是一个项目中多文件、多模块之间互相调用的问题
原文地址:https://blog.csdn.net/m0_75007575/article/details/143641072
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!