进程虚拟地址空间 程序编译链接过程
1..程序编译、链接、运行的过程。
(1)预编译阶段****
生成*.i文件。
处理源代码文件,即以“#”开始的预编译指令。
有展开宏;去注释;添加行号;保留所有#pragma编译指令。
(2)编译阶段**
生成*.s文件
词法分析:源程序被输入到扫描器,扫描器将源代码的字符序列分割成一系列的记号(标识符、关键字、字面量(数字、字符串等))。在识别几号的同时,扫描器也完成了其他工作,比如将标识符存放到符号表。
语法分析:语法分析器产生语法树(以表达式为节点)。
语义分析:整个表达式被标识了类型
中间语言的生成:使得编译器分为前端和后端。前端负责产生机器无关中间代码,后端将中间代码转换成目标机器代码。
目标代码的生成与优化:接近机器可以执行。
(3)汇编
生成可重定位的目标文件(.obj(windows) .o(Linux))
其中有符号表段。
根据对应关系 将汇编指令=》本地操作系统机器码(汇编器执行)。
(4)链接
生成可执行文件
.exe(windows)
.elf(Linux下)
分为两步
【1】所有.o文件段进行合并,其中包含合并符号表。此时要进行【符号解析】,解析正确,给符号表符号分配【虚拟地址】。
符号解析:未定义的符号找到其定义的地方。
【2】进行【符号重地位】。
符号重地位:指定中的无效地址替换成正确的虚拟地址。
2.进程的虚拟地址空间
进程在内存上的布局 虚拟地址空间
.data 保存已经初始化的全局静态变量和局部静态变量
.rodata存放只读数据.
.bss 存放未初始化全局变量和局部静态变量
.text 存放代码段
3.IA32体系·虚拟地址的映射
* *IA32体系虚拟地址映射图解**