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