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

2021-09-20 13:19:41 字數 1007 閱讀 8957

編譯器

編譯器就是將高階語言翻譯成機器語言的乙個工具。

build過程或使用gcc編譯時,可以分解為:

預編譯

經過預編譯後的.i檔案不包含任何巨集定義,因為所有的巨集都已經被展開,並且包含的檔案也已近被插入到.i檔案中。

當我們無法判斷巨集定義是否正確或標頭檔案包含是否正確時,可以檢視預編譯後的檔案來確認。

gcc -e hello.c -o hello.i

或cpp hello.c > hello.i

編譯

編譯過程就是把預處理完的檔案進行一系列的詞法分析、語法分析、語義分析以及優化後產生的相應地彙編**檔案。

(這個到後面學習編譯原理的時候再看吧,之前在學校學的一點都快忘光了=.=)

gcc -s hello.i -o hello.s
彙編

彙編器是將彙編**轉變成機器可執行的指令,每乙個彙編語句幾乎都對應一條機器指令。

它根據彙編指令和機器指令的對照表,一一翻譯。

gcc -c hello.s -o hello.o

或as hello.s -o hello.o

直接從源**檔案開始,經過預編譯、編譯和彙編,直接輸出目標檔案:

gcc -c hello.c -o hllo.o
鏈結
每個模組的源**檔案經過編譯器編譯成目標檔案,目標檔案和庫一起鏈結形成最終的可執行檔案。

最常見的庫是執行時庫,它是支援程式執行的基本函式的集合。

庫其實就是一組目標檔案的包(也就是一些常用的**編譯成目標檔案後打包存放)

重定位重新計算各個目標的位址過程,每個要被修正的地方叫乙個重定位入口

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

hello world程式hello.c include int main 在linux下,使用gcc編譯和執行hello world程式時,只需使用最簡單的命令。gcc hello hello.c hello hello world 事實上,上述過程可以分解為4個步驟,分別是預處理 prepres...

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

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

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

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