徹底理解編譯連結的整個過程和詳細的每個過程
一、預編譯1.將所有的#define刪除,並展開所有的巨集定義; 2.處理所有的預編譯指令,例如:#if,#elif,#else,#endif; 3.處理#include預編譯指令,將被包含的檔案插入到預編譯指令的位置; 4.新增行號資訊檔名資訊,便於除錯; 5.刪除所有的註釋:// /**/; 6.保留所有的#pragma編譯指令,因為在編寫程式的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。 生成.i檔案。
包括(1)去註釋 (2)巨集替換 (3)標頭檔案展開 (4)條件編譯二、編譯:C語言——》彙編1.掃描,語法分析,語義分析,原始碼優化,目的碼生成,目的碼優化;
3.彙總符號; 4.生成.s檔案
三、彙編:彙編——》二進位制1.根據彙編指令和特定平臺,把彙編指令翻譯成二進位制形式; 2.合併各個section,合併符號表; 3.生成.o檔案
四、連結1.合併各個.obj檔案的section,合併符號表,進行符號解析; 2.符號地址重定位; 3.生成可執行檔案
在linux系統中
1.預處理
gcc -E test.c -o test.i
2.編譯
gcc -S test.i -o test.s
3.彙編
gcc -c test.s -o test.o
4.連結
gcc test.o -o mytest
總結:
C語言編譯的整個過程是非常複雜的,裡面涉及到的編譯器知識、硬體知識、工具鏈知識都是非常多的,深入瞭解整個編譯過程對我們
一般情況下,我們只需要知道分成編譯和連結兩個階段,編譯階段將源程式(*.c) 轉換成為目的碼,連結階段是把源程式轉換成的目的碼(obj檔案)與你程式裡面呼叫的庫函式對應的程式碼連線起來形成對應的可執行檔案(exe檔案)就可以了,其他的都需要在實踐中多多體會才能有更深更好的理解。