1. 程式人生 > >【C++】編譯、連結、執行原理+強弱符號

【C++】編譯、連結、執行原理+強弱符號

【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、符號的重定位