C語言從編譯到執行過程詳解

2022-09-29 16:00:22 字數 1806 閱讀 1363

目錄

最近在看csapp(深入理解計算機系統)然後以前也學過c語言,但是從來沒有深究寫好的c**是怎麼編譯再到執行的。

所以現在自己學習,然後記錄下來。

以最常用的hello world!程式為例 程式名: main.c

#include

int main()

hel程式設計客棧lo程式的生命週期是從乙個高階c語言程式開始的,為了能夠執行hello.c程式,每一條c語句都被其他程式轉化為一系列的低階機器語言指令。然後這些指令按照一種稱為可執行目標程式的格式打包,以二進位制磁碟檔案的形式存放起來。目標程式也稱為可執行目標檔案。

編譯乙個 c程式可以分為四階段:預處理階段--->生成彙編**階段--->彙編階段--->鏈結階段

各個階段的**可以通過gcc指令來生成

如果沒有gcc可以用下面指令安裝

sudo apt-get build-dep gcc

安裝完之後可以根據以下指令檢視是否安裝成功

gcc --version

安裝好後用下面指令生成中間檔案

gcc main.c 直接生成可執行檔案 a.out

gcc -e main.c -o hello.i 生成預處理後的**

gcc –s main.c -o hello.s 生成彙編**

gcc –c main.c -o hello.o 生成目標**

1、預處理階段

gcc -e main.c -o hello.i 生成預處理後的**

預處理器(cpp)根據以字元 # 開頭的命令,修改原始的c程式。比如mian.c中第一行的 #include 命令就告訴預處理器讀取系統標頭檔案stdio.h的內容,程式設計客棧並且把它直接插入程式文字中。同時刪除注釋行,新增行號和檔名標識。這樣就得到了另乙個c程式,通常是以 .i 作為副檔名。 所以經過預編譯的 .i 檔案是不包含巨集定義的。

處理完後我們來看看 hello.i 檔案。發現原來的7行**變成了700多行,我們的**在最後面。而前面多出來的**就是 .c 中#include展開的**。

2、編譯階段

gcc –s main.c -o hello.s     生成彙編**

編譯是將原始檔(hello.i)翻譯成彙編檔案(hello.s)的過程。中間包含詞法、語法分析等步驟,具體過程可以參考《編譯原理》。

開啟彙編**我們會發現裡面有很多以 . 開頭的行,所有這些以 . 開頭的行都是指導彙編器和鏈結器工作的偽指令。 我們通常可以忽略這些行。

去掉這些行後剩下的部分。

3、彙編階段

gcc –c main.c程式設計客棧 -o hello.o 生成目標**

彙編階段是把編譯階段生成的 .s 檔案轉成 .o 的二進位制目標**。彙編器(as)將 hello.s 翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程式的格式,並將結果儲存在目標檔案hello.o中。hello.o檔案是乙個二進位製文程式設計客棧件,它的位元組編碼是機器語言指令而不是字元。如果我們在文字編譯器中開啟 hello.o 檔案,看到的將是一堆亂碼。

你非要看就是這樣

4、鏈結階段

這個階段就是把彙編後的機器指令集變成可以直接執行的檔案,而對目標檔案進行鏈結主要是因為在目標檔案中可能用到了在其他檔案當中定義的字段(或者函式),通過鏈結來把多個不同目標檔案關聯到一起。

hello 程式呼叫了printf 函式,它是每個 c 編譯器都會提供的標準c庫中的乙個函式,printf 函式存在於乙個名為 printf.o 的單獨預編譯好了的標準檔案中,而這個檔案必須以某種方式合併到我們的 hello.o 程式中,鏈結器(ld)就負責處理這種合併,結果就得到 hello 檔案,它是乙個可執行目標檔案(簡稱:可執行檔案),可以被載入到記憶體中,有系統執行。

從編碼到執行 程式編譯過程詳解

程式從一堆字元怎麼變成乙個可執行的程式呢,在這我們使用最簡單的乙個hello word 程式來演示程式的乙個完整流程。在這過程中找到一些有用的除錯方法,幫助我們在debug時快速解決問題。程式編譯時的整體流程經過 執行環境 windows 10 cygwin gcc 版本 7.4.0 按照c語言語法...

C 編譯,執行過程 詳解。

要更深入了解c 必須要知道乙個程式從開始到結束都幹了些什麼,怎麼幹的。所以我從c 編譯到執行過程,解析下程式是怎麼跑的。首先,初略的說一下之前c 的編譯過程,c 編譯過程包括預編譯 彙編 編譯 鏈結。稱為乙個可執行檔案。windows平台下為.exe檔案 預編譯主要展開包含的標頭檔案,巨集定義等操作...

C語言編譯過程詳解

編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 i 編譯 優化程式 s asm 匯程式設計序 obj o a ko 鏈...