gcc -e hello.c -o hello.i
源**檔案hello.c和相關的標頭檔案(如stdio.h),被【預編譯器(cpp)】預編譯成乙個.i檔案;
預編譯過程,主要處理那些源**中的,以#開頭的預編譯指令;
如 :展開所有的巨集定義(#define),
處理所有的條件預編譯指令(#if,#ifdef,#else,#endif等),
將被包含的檔案插入到預編譯指令所在位置(#include),
去除所有的注釋行(//,/* */),
新增行號和檔名標識,
保留所有的編譯器指令(#program),
經過預編譯後的.i檔案,不包含任何巨集定義。
gcc -s hello.i -o hello.s
對預編譯後的檔案,進行一系列的詞法分析,語法分析,語義分析和優化,產生相應的彙編**檔案;
as hello.s -o hello.o 或 gcc -c hello.s -o hello.o
彙編過程,將彙編**轉換為機器可以執行的指令,每一條彙編指令幾乎都會對應一條機器指令;
鏈結過程,處理各個模組之間的相互引用,使各個模組之間能夠正確銜接起來;
包括:位址和控制項分配,符號決議和重定位等;
鏈結過程,本質上是就是乙個模組拼裝過程;
編譯鏈結過程
在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...
GCC編譯和鏈結過程
gcc gnu compiler collection gnu 編譯器套件 是由 gnu 開發的程式語言編譯器。它是以 gpl許可證所發行的自由軟體,也是 gnu計畫的關鍵部分。gcc原本作為 gnu作業系統的官方編譯器,現已被大多數類 unix 作業系統 如 linux bsd mac os x ...
編譯鏈結過程(一)
什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...