编译链接运行原理

【c++】编译链接运行原理

 

  1. 编译链接

预编译 .i

  1. 删除#define文本替换
  2. #if #endif #elif
  3. 递归展开#include
  4. 删除注释
  5. 添加行号和文件标识
  6. #pragma

编译 .s

  1. 词法分析
  2. 语法分析 一条语句
  3. 语义分析 结合上下文  默认值从右向左赋值
  4. 代码优化
  5. 生成汇编指令

汇编 .o 二进制可重定位目标文件

汇编指令 mov add lea sub

.o文件格式:Linux:ELF  Windows:PE

.o文件的组成格式:

【c++】编译链接运行原理

 

.bss段不占文件上的空间,占虚拟地址空间的空间,记录到段表中(无初始值)

 

【c++】编译链接运行原理

【c++】编译链接运行原理

 

符号表:指令只产生一个符号就是函数名  数据一定产生符号

  1. 翻译指令

不能运行 没有分配空间  源文件相互独立,不能相互调用

强符号:已初始化

弱符号:未初始化

两强报错 一强一弱取强  两弱看编译器(选择内存占用量大的)

汇编:call指令:近址相对位移调用指令  近址+位移=调用函数入口地址

链接 .c

【c++】编译链接运行原理

 

所有obj文件的global符号进行处理,local(static)的符号不作任何处理

  1. 合并段和符号表(弱符号(*COM*区域))
  2. 符号解析(符号表:外部符号(*UND*区域))
  3. 分配地址和空间(建立与虚拟地址空间的映射)
  4. 符号的重定位(代码段:虚假的地址和偏移)

 

【c++】编译链接运行原理

 

【c++】编译链接运行原理

运行

1.创建虚拟地址空间和物理内存的映射(内核映射结构体)

   创建页目录,页表

2.加载指令和数据

3.整个程序入口地址写入下一行指令寄存器

相关文章: