自学内容网 自学内容网

编译和链接

1. 翻译和运行环境

在ANSIC的任何一种实现中,存在两个不同的环境

翻译环境:源代码被转化成可执行的机器指令(二进制指令)——编译器

执行环境:实际执行代码——操作系统

2. 翻译环境

由编译和链接两大部分组成

  1. 编译:预处理、编译、汇编
  2. 多个.c文件经过编译器——.obj文件(Windows)或.o文件(Linux)
  3. 多个目标文件和链接库一起经过链接器生成最终的可执行文件

2.1. 预处理

源文件和头文件被处理为.i为后缀的文件

gcc -E test.c -o test.i

处理规则

  1. 将所有#define删除,并展开所有宏定义
  2. 处理所有条件编译指令
  3. 处理include预编译指令,将包含头文件内容插入到预编译指令的位置。
  4. 删除所有注释
  5. 添加行号和文件名标识,方便后续编译器生成调试信息
  6. 保留所有的#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)!