【C++】編譯、連結、執行原理+強弱符號
阿新 • • 發佈:2018-11-28
【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、符號的重定位