從C語言到可執(zhí)行程序經(jīng)理以下處理步驟
1.預(yù)處理
在這一階段,源碼中所有的預(yù)處理語句得到處理七扰,例如
#include
語句所包含的文件內(nèi)容替換掉本身所有已定義的宏被展開 根據(jù)#ifdef
,if
等語句的條件是否成立取舍相應(yīng)的部分猎贴,預(yù)處理之后源碼中不在包含任何預(yù)處理語句。 GCC預(yù)處理階段可以生成.i文件,通過選項(xiàng)-E可以使編譯器在預(yù)處理結(jié)束時就停止編譯抢韭,例如:gcc -E -o hello.i hello.c
2.編譯
這一階段松嘶,編譯器對源碼進(jìn)行降宅,詞法分析骂远,語法分析,優(yōu)化等操作腰根,最后生成匯編代碼激才。這是整個過程中最重要的一步,因此也常把整個過程稱為編譯额嘿∪衬眨可以通過選項(xiàng)-S使GCC在進(jìn)行編譯完后停止,生成.s的匯編程序册养,例如:
gcc -S -o hello.s hello.c
3.匯編
這一階段使用匯編器對匯編代碼進(jìn)行處理钞脂,生成機(jī)器語言代碼,保存在后綴為.o的目標(biāo)文件中捕儒。當(dāng)程序由多個代碼文件構(gòu)成時,每個文件都要先完成匯編工作邓夕,生成.o目標(biāo)文件后刘莹,才能進(jìn)行下一步的鏈接工作。目標(biāo)文件已經(jīng)是最終程序的某一部分了焚刚,只是在鏈接之前還不能執(zhí)行点弯,可以通過-c選項(xiàng)生成目標(biāo)文件:
gcc -c -o hello.o hello.c
4.鏈接
經(jīng)過匯編以后的機(jī)器代碼還不能直接運(yùn)行,為了使操作系統(tǒng)能夠正確加載可執(zhí)行文件矿咕,文件中必須包含固定格式的信息頭抢肛,還必須與系統(tǒng)提供的啟動代碼鏈接起來才能正常運(yùn)行,這些工作都是由鏈接器來完成的