gcc
(gnu compiler collection
,gnu
編譯器套件),是由
gnu
開發的程式語言編譯器。它是以
gpl許可證所發行的自由軟體,也是
gnu計畫的關鍵部分。
gcc原本作為
gnu作業系統的官方編譯器,現已被大多數類
unix
作業系統(如
linux
、bsd
、mac os x
等)採納為標準的編譯器,
gcc同樣適用於微軟的
windows
。一、源**
二、編譯過程(1
)預處理
預處理就是將要包含
(include)
的檔案插入原檔案中、將巨集定義展開、根據條件編譯命令選擇要使用的**,最後將這些**輸出到乙個「
.i」檔案中等待進一步處理。
結果:見檔案
(2)編譯
編譯就是把
c/c++**(
比如上面的
".i"檔案)
「翻譯」成彙編**。
結果:見檔案
(3)彙編
紅色箭頭處的
relocatable
表示可重定位,也即是可以和庫等依賴檔案鏈結。
彙編就是將第二步輸出的彙編**翻譯成符合一定格式的機器**,在linux系統上一般表現位elf目標檔案(obj檔案)。
結果:見檔案
這個就是沒有連線的目標**,也是
01序列,需要使用二進位制檢視器如
hex editor neo
等檢視。(4
)鏈結
鏈結就是將彙編生成的
obj檔案、系統庫的
obj檔案、庫檔案鏈結起來,最終生成可以在特定平台執行的可執行程式。如圖中紅色箭頭所示。
結果:見檔案
總結:在編譯過程中。除非使用了"-c",「-s」,或"-e"選項(或者編譯錯誤阻止了完整的過程),否則統一完整鏈結步驟。
三、鏈結原理
gcc -c -o 0617_demo.o 0617_demo.c
不作最後一步鏈結,得到
0617_demo.o
二進位制obj
檔案gcc -v -o 0617_demo 0617_demo.o
先看一下鏈結過程是怎樣的:
是gcc
加入的系統標準啟動檔案,對於一般應用程式,這些啟動是必需的。
l-lc
:鏈結libc
庫檔案,其中
libc
庫檔案中就實現了
printf
等函式。
編譯鏈結過程
在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...
編譯和鏈結過程步驟
gcc e hello.c o hello.i 源 檔案hello.c和相關的標頭檔案 如stdio.h 被 預編譯器 cpp 預編譯成乙個.i檔案 預編譯過程,主要處理那些源 中的,以 開頭的預編譯指令 如 展開所有的巨集定義 define 處理所有的條件預編譯指令 if,ifdef,else,e...
編譯鏈結過程(一)
什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...