linux 編譯程式的過程與c/c++程式編譯過程類似,只是使用的命令或實現的方法不一樣(環境平台不一樣),但是總體框架一樣。
一、預編譯
命令是gcc -e main.c -o main.o 假設當前要編譯的檔案是main.c;
1、將所有的#define刪除,並展開所有的巨集定義;
2、處理所有的預編譯指令,例如:#if,#elif,#else,#endif;
3、處理#include預編譯指令,將被包含的檔案插入到預編譯指令的位置;
4、新增行號資訊檔名標識,便於除錯;
5、刪除所有的注釋;
6、保留所有的#pragma編譯指令,因為在編寫程式的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
7、生成.i檔案。
包括去注釋 ,巨集替換 ,標頭檔案展開,條件編譯,經編譯後的.i檔案不包含任何巨集定義,因為所有的巨集已經被展開,並且包含的檔案已經被插入到.檔案中。
二、編譯:c語言——》彙編
命令是:gcc -s main.i -o main.s
1、掃瞄,語法分析,語義分析,源**優化,目標**生成,目標**優化;
2、生成彙編**;
3、彙總符號;
4、生成.s檔案
三、彙編:彙編——》二進位制
命令是:gcc -c main.s -o main.o
1、根據彙編指令和特定平台,把彙編指令翻譯成二進位制形式;
2、合併各個section,合併符號表;
3、生成.o檔案。
四、鏈結
1、合併各個.obj檔案的section,合併符號表,進行符號解析;
2、符號位址重定位;
3、生成可執行檔案;
五、總結:
無論是linux系統平台還是其它的系統平台,整體的編譯流程幾乎都是一樣的,整體流程如下圖(便於理解)。
linux 編譯程式的四個過程
一 預編譯 他的命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1.將所有的 define刪除,並展開所有的巨集定義 2.處理所有的預編譯指令,例如 if,elif,else,endif 3.處理 include預編譯指令,將被包含的檔案插入到預編譯指令的位置 ...
程式編譯的四個過程
hello.c 源程式 是一條高階c語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體cpu直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。而我們知道,機器語言就是處理器可...
GCC編譯程式時的四個階段說明!
在使用gcc進行程式的編譯時通常要經歷四個階段 通常指的是從源程式到可執行的二進位制 這整個過程 一些以hello.c為例來說明這四個階段。hello.c includeint main gcc的四個階段如下 1.預處理階段 2.編譯階段 3.彙編階段 4.鏈結階段 四個階段的詳細資訊如下 1.預處...