「C++」預編譯、編譯、彙編、鏈接
Windows中以2:2劃分內核、用戶空間,Linux中以1:3劃分內核、用戶空間。
打開今日頭條,查看更多精彩圖片在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:程序員小新人學習 |