C++--问题1--编译链接原理过程
5步分别为:
1.预编译
2.编译
3.汇编
4.链接
5.运行
1.预编译
(1)#define,宏替换
删除宏定义并做文本替换
(2)#include
递归展开头文件
(3)#if #endif等
预编译指令
(4)删除注释
删除 “//”和“/* */”
(5)添加行号和文件标识
(6)保留#pragam的指令
2.编译 生成 .s文件
(1)词法分析
(2)语法分析
(3)语义分析
(4)代码优化 优缺点:提高效率 不可控
(5)生成汇编指令
3.汇编 生成.o文件( 目标文件,可重入的二进制文件)
翻译指令
项目:N多的源文件构造 前三个过程都是已编译单元整理的,分开的
目标文件,在Windows下是PE格式,在Linux下是ELF格式
ELF格式中由上到下有,File Header, .text段,.data段,.bss段
.text段:存放源代码编译后的机器指令(程序指令段)
.data段:存放已初始化的全局变量和局部静态变量(程序数据段)
.bss段:存放未初始化或者初始化为0的全局变量和局部静态变量(程序数据段)
汇编遗留的问题:
- 弱符号处理(只有C语言里有)
- 符号表:?Sun@@YAHHH@Z *UND* 外部符号
- 指令段:外部符号的地址 ,虚假地址||虚假偏移
4.链接 生成.exe文件
(1)合并段和符号表
(2)符号解析
(3)分配地址和空间
(4)符号的重定位
5.运行
(1)创建虚拟地址空间和物理内存的映射(创建内核映射结构体)
创建页目录,页表
(2)加载指令和数据
(Main)程序的入口地址写入到下一行指令寄存器