生活随笔
收集整理的這篇文章主要介紹了
gcc执行过程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
執(zhí)行過(guò)程編輯
雖然我們稱GCC是C語(yǔ)言的編譯器,但使用gcc由C語(yǔ)言源代碼文件生成可執(zhí)行文件的過(guò)程不僅僅是編譯的過(guò)程,而是要經(jīng)歷四個(gè)相互關(guān)聯(lián)的步驟∶預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。
命令gcc首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過(guò)程中,對(duì)源代碼文件中的文件包含(include)、預(yù)編譯語(yǔ)句(如宏定義define等)進(jìn)行分析。接著調(diào)用cc1進(jìn)行編譯,這個(gè)階段根據(jù)輸入文件生成以.o為后綴的目標(biāo)文件。匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as進(jìn)行工作,一般來(lái)講,.S為后綴的匯編語(yǔ)言源代碼文件和匯編、.s為后綴的匯編語(yǔ)言文件經(jīng)過(guò)預(yù)編譯和匯編之后都生成以.o為后綴的目標(biāo)文件。當(dāng)所有的目標(biāo)文件都生成之后,gcc就調(diào)用ld來(lái)完成最后的關(guān)鍵性工作,這個(gè)階段就是連接。在連接階段,所有的目標(biāo)文件被安排在可執(zhí)行程序中的恰當(dāng)?shù)奈恢?#xff0c;同時(shí),該程序所調(diào)用到的庫(kù)函數(shù)也從各自所在的檔案庫(kù)中連到合適的地方。
7執(zhí)行過(guò)程示例編輯
| 1 2 3 4 5 6 7 | #include<stdio.h> int?main(void) { ????printf("hello\n"); ????return?0; } |
這個(gè)過(guò)程處理宏定義和include,并做語(yǔ)法檢查。
可以看到預(yù)編譯后,代碼從6行擴(kuò)展到了910行。
| 1 2 3 4 5 | gcc?-E?a.c?-o?a.i cat?a.c|wc?-l 5 cat?a.i|wc?-l 910 |
這個(gè)階段,生成匯編代碼。
| 1 2 3 | gcc?-S?a.i?-o?a.s cat?a.s|wc-l 59 |
這個(gè)階段,生成目標(biāo)代碼。
此過(guò)程生成ELF格式的目標(biāo)代碼。
| 1 2 3 | gcc?-c?a.s?-o?a.o file?a.o a.o:ELF64-bitLSBrelocatable,AMDx86-64,version1(SYSV),notstripped |
鏈接過(guò)程。生成可執(zhí)行代碼。鏈接分為兩種,一種是靜態(tài)鏈接,另外一種是動(dòng)態(tài)鏈接。使用靜態(tài)鏈接的好處是,依賴的動(dòng)態(tài)鏈接庫(kù)較少,對(duì)動(dòng)態(tài)鏈接庫(kù)的版本不會(huì)很敏感,具有較好的兼容性;缺點(diǎn)是生成的程序比較大。使用動(dòng)態(tài)鏈接的好處是,生成的程序比較小,占用較少的內(nèi)存。
程序運(yùn)行:
總結(jié)
以上是生活随笔為你收集整理的gcc执行过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。