【C++】编译、链接、运行原理+强弱符号
虚拟地址空间
作用:进程地址空间需要隔离,防止恶意的程序修改其他程序的内存数据,所以计算机需要虚拟地址空间
其中:
.data:已经初始化,并且初始化不为0的数据。
.bss:未初始化,或者初始化为0的数据。
例如:
#include<stdio.h>
extern int gdata;
extern int Sum(int,int);
int gdata1=10;
int gdata2=0;
int gdata3;
static int gdata4=20;
static int gdata5=0;
static int gdata6;
int main()
{
static int data1=30;
static int data2=0;
static int data3;
int data4=40;
int data5=0;
int data6=gdata;
Sum(data4,data5);
}
其中:
①.data:gdata1,gdata4,data1
②.bss:gdata2,gdata3,gdata5,gdata6,data2,data3
③指令:int data4=40; int data=0; int data6;
其中gdata3存在于*COM*这个块中。
强弱符号
①强符号:已初始化的全局变量
②弱符号:未初始化的全局变量
强弱符号规则:
①两强:重定义,编译报错
②一强一弱:选择强者
③两弱:由编译器决定(一般选取字节较大的)
编译链接原理
①预编译阶段 (生成 .i 文件)
处理以下操作:
1、#define
2、#include
3、#if #endif #elif
4、删除注释
5、添加行号
6、保留#pragma
②编译阶段(生成 .s 文件)
1、词法分析
2、语法分析
3、语义分析
4、代码优化
③汇编阶段(生成 .o 文件)
(.o文件是ELF格式的可重定位的二进制文件)
指令代码翻译成二进制
④链接阶段(生成 .exe文件)
1、合并符号表和段
2、符号解析
3、分配地址和空间
4、符号的重定位