程式設計師的自我修養 2 編譯和鏈結

2021-07-27 17:54:37 字數 1158 閱讀 3336

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檔案中。當我們無法判斷巨集定義是否正確或標頭檔案包含是否正確時,可以檢視預編譯後的檔案來確...

《程式設計師的自我修養》筆記 靜態鏈結

在通過編譯和彙編後,就生成了目標檔案,鏈結就是把這些目標檔案加工後合併成乙個輸出檔案的過程。鏈結過程可以分為兩步 第一步 空間與位址分配。掃瞄所有的輸入目標檔案,獲得它們每個各個段的長度 屬性和位置,並且將輸入目標檔案中的符號表中所有 的符號定義和符號引用收集起來,統一放到乙個全域性符號表。這一步中...