ide一般把編譯和鏈結合併到一起,稱為構建(build)。
4個步驟:
1、預處理
$ gcc -e hello.c -o hello.i
-e表示只進行預處理。
主要處理規則如下:
2、編譯
編譯過程就是把預處理完的檔案進行一系列的詞法分析,語法分析,語義分析以及優化後產生相應的彙編**檔案。
$ gcc -s hello.i -o hello.s
編譯過程:
掃瞄器(scanner)
有限狀態機(finite state machine)
記號(token)
語法分析器(grammer parser)
語法樹(syntax tree)
語義分析器(semantic analyzer)
靜態語義(static semantic):指在編譯期可以確定的語義。
動態語義(dynamic semantic):只有在執行期才能確定的語義。
原始碼優化器(source code optimizer)
中間**(intermediate code)
**生成器(code generator)
目標**優化器(target code optimizer)
經過這些掃瞄、語法分析、語義分析、源**優化、**生成、目標**優化、
3、彙編
彙編器就是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。
$ gcc -c hello.s -o hello.o
4、鏈結
鏈結的主要內容就是把各個模組之間相互引用的部分都處理好,使得各個模組之間能夠正確地銜接。
鏈結的過程主要包括:位址和空間分配(address and storage allocation)、符號決議(symbol resolution)、重定位(relocation)
程式設計師的自我修養 編譯和鏈結
hello world程式hello.c include int main 在linux下,使用gcc編譯和執行hello world程式時,只需使用最簡單的命令。gcc hello hello.c hello hello world 事實上,上述過程可以分解為4個步驟,分別是預處理 prepres...
程式設計師的自我修養(三)編譯和鏈結
編譯器 編譯器就是將高階語言翻譯成機器語言的乙個工具。build過程或使用gcc編譯時,可以分解為 預編譯 經過預編譯後的.i檔案不包含任何巨集定義,因為所有的巨集都已經被展開,並且包含的檔案也已近被插入到.i檔案中。當我們無法判斷巨集定義是否正確或標頭檔案包含是否正確時,可以檢視預編譯後的檔案來確...
《程式設計師的自我修養》筆記 靜態鏈結
在通過編譯和彙編後,就生成了目標檔案,鏈結就是把這些目標檔案加工後合併成乙個輸出檔案的過程。鏈結過程可以分為兩步 第一步 空間與位址分配。掃瞄所有的輸入目標檔案,獲得它們每個各個段的長度 屬性和位置,並且將輸入目標檔案中的符號表中所有 的符號定義和符號引用收集起來,統一放到乙個全域性符號表。這一步中...