如圖所示:
1. 預編譯(生成.i文件)*
命令:gcc -E hello.c -o hello.o
- 將所有的“#define”刪除,並且展開所有的宏定義(文本替換);
- 處理所有條件預編譯指令,如:“#if”、“ifdef”、“endif”、“else”、“elif”;
- 處理“#include”預編譯指令(展開include),將被包含的文件插入到該預編譯指令的位置<這是一個遞歸的過程,被包含的文件可能還包含其他文件> ;
- 刪除所有的註釋(“//”、“/* */”);
- 添加行號和文件名標識,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產 生錯誤或警告信息時能夠顯示行號。
- 保留所有的#pragma編譯器指令,待編譯器使用;
2. 編譯(生成.s文件)*
命令:gcc -S hello.i -o hello.s
- 把預處理完的文件進行一系列的詞法分析、語法分析、語義分析、彙總符號及優化後生成相應的彙編代碼文件
3. 彙編(生成.o文件,也叫目標文件 <obj文件>)*
命令:gcc -c hello.s -o hello.o
或者從源代碼直接輸出目標文件:gcc -c hello.c -o hello.o
- 彙編器是將彙編代碼轉變城機器可以執行的指令,每一個彙編語句幾乎都對應一條機器指令。
4. 鏈接(生成.exe文件,也叫可執行文件)*
- 合併各個段,調整段的大小以及段起始位置,合併符號表
- 符號解析(符號決議)<"l"符號不解析,只解析“g”符號>
- 給符號分配虛擬地址和空間
- 符號重定位
4G虛擬地址空間內存佈局