编译链接运行原理
- 编译链接
预编译 .i
- 删除#define文本替换
- #if #endif #elif
- 递归展开#include
- 删除注释
- 添加行号和文件标识
- #pragma
编译 .s
- 词法分析
- 语法分析 一条语句
- 语义分析 结合上下文 默认值从右向左赋值
- 代码优化
- 生成汇编指令
汇编 .o 二进制可重定位目标文件
汇编指令 mov add lea sub
.o文件格式:Linux:ELF Windows:PE
.o文件的组成格式:
.bss段不占文件上的空间,占虚拟地址空间的空间,记录到段表中(无初始值)
符号表:指令只产生一个符号就是函数名 数据一定产生符号
- 翻译指令
不能运行 没有分配空间 源文件相互独立,不能相互调用
强符号:已初始化
弱符号:未初始化
两强报错 一强一弱取强 两弱看编译器(选择内存占用量大的)
汇编:call指令:近址相对位移调用指令 近址+位移=调用函数入口地址
链接 .c
所有obj文件的global符号进行处理,local(static)的符号不作任何处理
- 合并段和符号表(弱符号(*COM*区域))
- 符号解析(符号表:外部符号(*UND*区域))
- 分配地址和空间(建立与虚拟地址空间的映射)
- 符号的重定位(代码段:虚假的地址和偏移)
运行
1.创建虚拟地址空间和物理内存的映射(内核映射结构体)
创建页目录,页表
2.加载指令和数据
3.整个程序入口地址写入下一行指令寄存器