導航:首頁 > 源碼編譯 > gcc編譯的源碼

gcc編譯的源碼

發布時間:2025-03-21 04:15:05

1. Gcc 和 Clang

GCC 編譯器作為 linux 系統下的主要 C/C++ 編譯工具,廣泛安裝於多數 Linux 發行版中。其命令形式通常為「gcc」,並提供了豐富的選項來輔助編譯過程。其中,常用選項包括:-E 僅執行預處理,-c 編譯或匯編源文件但不執行鏈接,-S 完成編譯但不匯編,僅生成匯編代碼,-o 用於指定輸出文件名。在 Linux 系統中,未指定輸出文件名時,默認輸出名為「a.out」,源文件後綴生成為「.o」,匯編文件後綴為「.s」。GCC支持多種環境的代碼生成,如使用-m32、-m64、-m16選項生成不同位數環境的代碼,例如,-m32下int、long和指針類型均為32位,-m64下int為32位,long和指針類型為64位,-m16與-m32類似,但在匯編文件開頭添加了gcc匯編制導,用於運行16位模式的二進制文件。

編譯過程主要分為預處理、編譯、匯編和鏈接四個階段。下面以一段源碼為例,詳細分析每個階段的內容。

首先,預處理過程會展開宏定義和條件編譯,生成預處理文件。使用cpp命令執行預處理,得到的sample.i文件中,宏定義和條件編譯已根據實際情況展開,宏引用被替換為實際值。通過-D指令可以自定義宏的值,進行預處理。在Linux系統下,通過「man gcc」可查詢GCC命令的詳細用法。

接著,GCC將預處理文件編譯為匯編代碼,生成匯編文件。匯編文件包含了核心的匯編代碼,展示了編譯過程中的匯編指令和數據操作。對比32位機器和64位機器匯編代碼的差異,可以發現主要在於寄存器的位寬和指令的位寬不同。

匯編代碼中,.cfi_startproc和.cfi_endproc用於初始化和結束本地數據結構,本地標簽用於分支目的地標記。基本匯編指令如pushl、movl、subl、cmpl、je、addl、sall、ret、movl等,分別用於操作寄存器、存儲數據、進行算術運算和邏輯運算、控制流程等。了解這些基本指令的用途有助於深入理解程序的執行流程。

使用GCC的-c選項編譯源代碼為機器代碼,通過-o選項指定輸出文件名。可以使用as命令得到機器語言,通過objmp指令查看目標文件的機器碼,反匯編指令幫助理解機器碼的含義。在程序中發現符號定義沖突時,可以使用nm命令列出目標文件中的符號,快速定位問題。

最後,鏈接器(ld)將編譯生成的目標文件鏈接為可執行文件。鏈接過程中,鏈接器解析未定義的符號引用,將目標文件中的佔位符替換為實際的符號地址。如果缺少必要的CRT文件,ld會生成警告。可通過查詢/usr/lib/x86_64-linux-gnu路徑找到CRT文件。C運行時文件(CRT)包含程序入口函數_start,負責調用__libc_start_main初始化libc,並調用main函數;_init函數在main函數前運行;_fini函數在main函數後運行。鏈接時使用-lc選項鏈接C標准庫。

Clang 是一個基於LLVM的C/C++編譯器,提供C/C++/Objective C/Objective C++語言的編譯支持,旨在超越GCC。Clang預處理、生成匯編代碼、生成目標文件、得到可執行文件的過程與GCC類似,但Clang提供了更多的特性,如更快的編譯速度、更好的錯誤診斷和更先進的類型推斷能力。使用Clang替代GCC進行C程序編譯時,可以體驗到這些額外的優勢。

Clang編譯過程包含預處理、生成32位和64位機器匯編代碼、生成目標文件和得到可執行文件等步驟。使用Clang編譯後的匯編代碼、目標文件和可執行文件與GCC編譯結果一致,但Clang在性能和語言支持方面可能具有優勢。

2. GCC編譯過程詳解

在使用GCC編譯器編譯名為 hello.c 的C程序時,GCC編譯過程會經歷多個步驟,包括預處理、編譯、匯編和鏈接。下面詳細解釋GCC編譯的過程:

假設有一個名為 hello.c 的C源代碼文件。使用GCC編譯器編譯此文件通常涉及以下步驟:

預處理(Preprocessing)步驟中,GCC會掃描源代碼文件。它處理以 # 符號開頭的預處理指令,如 #include、#define 等。所有包含的頭文件,例如標准庫頭文件 stdio.h,將被插入源代碼中。宏定義也被展開。此過程生成一個中間文件,通常以 .i 或 .ii 為擴展名。

在單獨執行預處理命令時,使用cpp命令。命令為:cpp hello.c -o hello.i。這會將預處理後的代碼保存為 hello.i 文件。

編譯(Compiling)階段,GCC接受預處理後的代碼,並進行詞法分析、語法分析以及類型檢查。C源代碼被翻譯成匯編語言,生成一個匯編代碼文件,具有 .s 擴展名。

使用gcc命令單獨執行編譯步驟。命令為:gcc -S hello.i -o hello.s。這會將編譯後的匯編代碼保存為 hello.s 文件。

匯編(Assembling)階段,匯編器將匯編代碼文件轉化為機器碼指令,生成目標文件,通常具有 .o、.obj 或 .elf 擴展名。

使用as命令單獨執行匯編步驟。命令為:as hello.s -o hello.o。這將匯編代碼轉換為二進制目標文件,並保存為 hello.o。

鏈接(Linking)階段,鏈接器將目標文件與其他目標文件和庫文件鏈接在一起,創建最終的可執行文件。鏈接器解析程序中使用的函數和符號,確保它們正確連接。最終生成的可執行文件通常沒有擴展名(或在Windows上為 .exe)。

單獨執行鏈接命令時,使用gcc。命令為:gcc hello.o -o hello。這將目標文件與所需庫文件鏈接,生成可執行文件 hello。

整個編譯過程演示了如何單獨執行GCC編譯過程的各個階段,並通過使用不同命令控制每個階段的輸出。通過單獨執行這些步驟,可以更詳細地了解每個階段的處理過程和生成的文件。然而,在實際開發中,通常使用一個簡單的命令來完成整個編譯過程。命令為:gcc hello.c -o hello。這會自動執行所有步驟,生成最終可執行文件 hello。

GCC編譯器將源代碼轉換為可執行文件的過程涉及多個詳細步驟,每個步驟都有其特定的任務。這個過程確保代碼正確性並使其可執行。每個階段通過查看中間文件和目標文件深入了解編譯器處理過程,進行調試或優化。步驟自動執行,只需運行合適的編譯器命令就能完成整個過程。

3. 【圖文】鯤鵬916-ARM64架構源碼gcc編譯完整記錄


以下是關於ARM64架構源碼gcc編譯的詳細步驟記錄:




  1. 首先,確保已經准備就緒,如果cmake未安裝,需要進行安裝。檢查cmake版本以確認其是否滿足需求。




  2. 安裝必要的依賴包,如isl、gmp、mpc、mpfr等,檢查它們是否已成功安裝。




  3. 針對gcc版本過低的問題,需下載並更新到7.3版本。下載並解壓gcc7.3的安裝包。





    1. 在gcc-7.3.0目錄下,確認已下載和安裝了所有依賴包。




    2. 利用多核CPU的優勢,通過「-j32」參數加速編譯過程。原先是按照官方文檔使用make -j16,但速度緩慢,後來調整為make -j32以提升效率。




    3. 依次執行編譯目錄創建、gcc編譯、安裝以及確認「libstdc++.so」軟連接在正確的目錄(/usr/lib64)。





  4. 編譯完成後,通過查看gcc版本來確認安裝是否成功。




以上就是完整的gcc編譯安裝流程。如果您覺得這些信息對您有所幫助,歡迎分享和關注我們的更新。更多技術內容敬請期待,感謝您的支持!


閱讀全文

與gcc編譯的源碼相關的資料

熱點內容
伺服器網卡有什麼好處 瀏覽:90
javasql格式化 瀏覽:599
小愛同學機器人的命令詞 瀏覽:971
檢驗signature的php示例代碼 瀏覽:161
android內錄 瀏覽:776
騰訊雲輕量應用伺服器服務商 瀏覽:176
平板app打不開怎麼回事 瀏覽:317
九號怎麼用app控制前後移動 瀏覽:617
pdf瀏覽器預覽 瀏覽:695
六一兒童節程序員爸爸 瀏覽:166
農村電視天線加密 瀏覽:903
freepdfword 瀏覽:752
程序員怎麼做舔狗 瀏覽:584
怎麼保養汽車空調壓縮機 瀏覽:756
黑客與逆向工程師的python編程之道 瀏覽:864
企業信息化pdf 瀏覽:57
如何給男孩子解壓 瀏覽:735
伺服器雲轉發源ip 瀏覽:29
電腦伺服器地址指的什麼 瀏覽:955
蘋果怎麼下載匯成銀行app 瀏覽:899