1、預編譯 優化
他的命令是gcc -E main.c -o main.o 假設當前要編譯的文件是main.c翻譯
1.將全部的#define刪除,並展開全部的宏定義; 調試
2.處理全部的預編譯指令,例如:#if,#elif,#else,#endif; 編譯器
3.處理#include預編譯指令,將被包含的文件插入到預編譯指令的位置; io
4.添加行號信息文件名標識,便於調試; 編譯
5.刪除全部的註釋:gcc
6.保留全部的#pragma編譯指令,由於在編寫程序的時候,咱們常常要用到#pragma指令來設定編譯器的狀態或者是語法
指示編譯器完成一些特定的動做。 二進制
生成.i文件。gc
包括去註釋 ,宏替換 ,頭文件展開,條件編譯
經編譯後的.i文件不包含任何宏定義,由於全部的宏已經被展開,而且包含的文件已經被插入到.文件中
2、編譯:C語言——》彙編
他的命令是:gcc -s main.i -o main.s
1.掃描,語法分析,語義分析,源代碼優化,目標代碼生成,目標代碼優化;
2.生成彙編代碼;
3.彙總符號;
4.生成.s文件
3、彙編:彙編——》二進制
他的命令是:gcc -c main.s -o main.o
1.根據彙編指令和特定平臺,把彙編指令翻譯成二進制形式;
2.合併各個section,合併符號表;
3.生成.o文件
4、連接
1.合併各個.obj文件的section,合併符號表,進行符號解析;
2.符號地址重定位;
3.生成可執行文件
也能夠從c源代碼開始通過預處理,編譯,彙編,連接直接輸出可執行文件
他的命令是:gcc -c main.s -o main.o