當前位置:
首頁 > 知識 > 「C++」預編譯、編譯、彙編、鏈接

「C++」預編譯、編譯、彙編、鏈接

Windows中以2:2劃分內核、用戶空間,Linux中以1:3劃分內核、用戶空間。

「C++」預編譯、編譯、彙編、鏈接

打開今日頭條,查看更多精彩圖片

在text段中,只有普通局部變數是指令

int gdata1 = 10; //.data 已初始化且初始化不為零的數據

int gdata2 = 0; //.bss 未初始化或初始化為零的數據

int gdata3; //.bss

static int gdata4 = 20; //.data

static int gdata5 = 0; //.bss

static int gdata6; //.bss

int main()

{

int data1 = 30; //.text //只有普通局部變數是指令

int data2 = 0; //.text

int data3; //.text

static int data4 = 40; //.data

static int data5 = 0; //.bss

static int data6; //.bss

return 0;

}

預編譯:i

1.#define 宏文本替換

2.#include 遞歸展開頭文件

3.#if #endif #elif 刪除預編譯指令

4.刪除注釋

5.添加行號和文本標識

6.保留 #pragma 編譯器處理

編譯:s 【編譯階段以一個.cpp或者.c文件為單元編譯】

1.詞法分析

2.語法分析

3.語義分析

4.代碼優化 生成彙編代碼

[inter x86] //彙編代碼

int a = 10;

mov dword ptr[a],0Ah //ptr[a] 對a地址解引用後得到a的內存 //0Ah 是10

彙編:o 可重定位(重入)的二進位文件

把指令代碼翻譯成二進位

Linux中ELF文件,bss段:段以符號起始,節省空間

bss段少了一個數據,和虛擬地址空間上的段不同意義。 (bss段中少的數據,位於COM塊中)

強弱符號:強符號是已初始化的全局變數,弱符號是未初始化的全局變數【C++中無強弱符號之分】

強弱符號規則:

1.兩強:重定義錯誤 //數據段不可以出現重名

2.一強一弱:選強符號作為所有地址

3.兩弱:選位元組數大的 <編譯器處理>

在彙編完成前,不清楚是否存在強符號無法判斷時,則將變數放入COM塊中。

鏈接: 生成.exe文件 也是ELF文件,有頭和.data、.text段等

//UND 未定義區 //找不到

1.段合併:相同段合併<一個段映射一個頁面>

合併符號表:同名查找,未找到則用本身查找的弱符號,找到則刪除弱符號改用強符號

2.符號解析(處理UND):未找到對應的符號進行報錯 合併UND

3.分配地址和空間

4.符號的重定位 //test段 <虛假地址改真實,糾正虛假偏移>

鏈接代碼:[ld -e main -o run main.o sum.o]

【Linux】中關於預編譯、編譯、彙編、鏈接的代碼

1.[預編譯] gcc -E Aff.c -o main.i

[ls] Aff.c main.i

2.[編譯]gcc -S main.i -o main.s

[ls]Aff.c mian.i main.s

3.[彙編]gcc -C mian.s -o main.o

[ls]Aff.c mian.i main.s main.o a.out

4.[鏈接]/a.out //此時是.exe文件(可執行文件)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

使用KETTLE從mysql同步增量數據到oracle
C/C++ 使用 TensorFlow 預訓練好模型——間接調用 Python 實現

TAG:程序員小新人學習 |