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

2021-08-13 17:07:34 字數 1230 閱讀 1695

hello world程式hello.c

#include

int main()

在linux下,使用gcc編譯和執行hello world程式時,只需使用最簡單的命令。

$ gcc hello hello.c

$ ./hello

hello

world

事實上,上述過程可以分解為4個步驟,分別是預處理(prepressing)、編譯(compilation)、彙編(assembly)和鏈結(linking)。

首先,源**檔案hello.c和相關標頭檔案stdio.h等被預編譯器cpp預編譯成hello.i檔案。

$ gcc -e hello.c -o hello.i

或者$ cpp hello.c>hello.i

預編譯過程主要處理那些原始檔中以「#」開始的預編譯指令。

主要處理規則如下:

$ gcc -s hello.i -o hello.s

或者$ ccl hello.c

關於gcc命令:對於c語言來說,預編譯和編譯的程式是ccl,對於c++來說,對應程式是cclplus;所以,實際上gcc這個命令只是這些後台程式的包裝,它會根據不同的引數要求去呼叫預編譯編譯程式ccl、彙編器as、聯結器ld。

彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令,只需根據彙編指令和機器指令的對照表一一翻譯即可。

$ as hello.s -o hello.o

或者$ gcc -c hello.c -o hello.o

這裡,hello.o檔案已經是二進位制機器碼,不能使用vim開啟。但是可以使用nm命令開啟,nm命令被用於顯示二進位制目標檔案的符號表。

$ nm hello.o
為什麼彙編器不直接輸出可執行檔案而是輸出乙個目標檔案呢?鏈結過程到底包含了什麼內容?為什麼要鏈結?

——《程式設計師的自我修養》

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

ide一般把編譯和鏈結合併到一起,稱為構建 build 4個步驟 1 預處理 gcc e hello.c o hello.i e表示只進行預處理。主要處理規則如下 2 編譯 編譯過程就是把預處理完的檔案進行一系列的詞法分析,語法分析,語義分析以及優化後產生相應的彙編 檔案。gcc s hello.i...

程式設計師的自我修養(三)編譯和鏈結

編譯器 編譯器就是將高階語言翻譯成機器語言的乙個工具。build過程或使用gcc編譯時,可以分解為 預編譯 經過預編譯後的.i檔案不包含任何巨集定義,因為所有的巨集都已經被展開,並且包含的檔案也已近被插入到.i檔案中。當我們無法判斷巨集定義是否正確或標頭檔案包含是否正確時,可以檢視預編譯後的檔案來確...

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

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