C++--问题1--编译链接原理过程

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的全局变量和局部静态变量(程序数据段)

汇编遗留的问题:

  1. 弱符号处理(只有C语言里有)
  2. 符号表:?Sun@@YAHHH@Z      *UND* 外部符号
  3. 指令段:外部符号的地址 ,虚假地址||虚假偏移

4.链接    生成.exe文件

(1)合并段和符号表

(2)符号解析

(3)分配地址和空间

(4)符号的重定位

5.运行

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

              创建页目录,页表

(2)加载指令和数据

           (Main)程序的入口地址写入到下一行指令寄存器

 

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108496094