關於源程式到可執行程式的過程

2021-07-10 22:21:12 字數 2077 閱讀 9691

源程式,是指未經編譯的,按照一定的程式語言規範書寫的,人類可讀的文字檔案,我們通常理解為源程式就是我們所寫好的**。

可執行程式,我們常說的.exe程式,可以執行程式,完成計算機功能。在c語言中,.c檔案就是所謂的原始檔,接下來,我們剖析一下,源程式到可執行程式的過程。在這個過程中,會發生如下的變化:

.c檔案生成.obj檔案的過程,我們稱為編譯,.obj檔案生成到.exe檔案的過程,我們稱為鏈結。

在這裡首先生成的.obj檔案就是乙個是程式編譯生成的二進位制檔案,再後來,當.exe檔案生成以後.obj檔案就會被刪除。

事實上,.c檔案生成.exe檔案的過程總共是經歷了預處理,編譯,彙編,鏈結,這四個過程。

其實預編譯就是我們所說的預處理。

在過程中,第乙個進行的是預編譯的過程。

為了接下來能夠解釋的更加清楚,我們將用linux平台下的gcc編譯器解釋。

在這裡我們先書寫乙個非常簡單的程式來介紹:

首先我們寫了這樣乙個程式

我們將這個程式寫到test.c中去,這裡我們可以直接編譯得到:

接下來,我們一步步詳細討論下其中發生的:

第一步發生的是預編譯,在這我們使用-e指令,使用這個指令會使程式只進行到預編譯指令。經過預編譯指令後的會生成乙個.i檔案,所以我們接下來就把預編譯的情況放到test.i檔案中。

在預編譯的過程中,主要處理源**中的預處理指令,引入標頭檔案,去除注釋,處理所有的條件編譯指令,巨集的替換,新增行號,保留所有的編譯器指令。

這就是預編譯後得到的結果

所以當進行預編譯以後的檔案中將不再存在巨集,所有的巨集都已經被替代。當我們我們想要判斷巨集是否正確或者標頭檔案包含是否正確的時候,我們也可以通過預編譯來檢視。

在預處理結束後,我們所要進行的就是編譯。編譯過程所進行的是對預處理後的檔案進行語法分析,詞法分析,語義分析,符號彙總,然後生成彙編**。

在這裡我們使用linux的-s命令,這可以得到彙編輸出檔案test.s

開啟以後的結果是:

從結果我們可以知道,得到的是彙編**。

這裡的彙編所說的是乙個過程,將彙編**轉成二進位制檔案,二進位制檔案就可以讓機器來讀取。每一條彙編語句都會產生一句機器語言

這裡採用的 -o指令

在這最終會生成乙個重定位目標檔案 .o檔案,這就好比windows下的.obj檔案。這裡生成的目標檔案裡面就是二進位制檔案。另外,在這需要注意的是,會形成符號表,給這些符號會分配虛擬位址。

鏈結,其實就是將二進位制檔案鏈結稱為乙個可執行的指令。

鏈結所完成的任務是合併段表,然後把符號表合併並且對符號表進行重定位。

所謂合併段表,源**編譯生成的a.out會包含很多段,資料段文字段bss段等等,這些段是合併出來的,在編譯過程中劃分出來出來的,不同的資料會對應到不同的段中,在.o檔案中其實已經發生了分段。

符號表合併和重定位說的是最後只生成了乙個符號表,這個符號表是由前面彙編形成的多個符號表進行合併。在這裡不在同乙個符號表的符號,要對他們進行重定位。

關於源程式到可執行程式的過程

源程式,是指未經編譯的,依照一定的程式語言規範書寫的,人類可讀的文字檔案,我們通常理解為源程式就是我們所寫好的 可執行程式。我們常說的.exe程式,能夠執行程式。完畢計算機功能。在c語言中,c檔案就是所謂的原始檔,接下來,我們剖析一下,源程式到可執行程式的過程。在這個過程中。會發生例如以下的變化 c...

C C 源程式到可執行程式exe的全過程

本文參考了部落格,其位址如下 原始檔生成可執行檔案的過程總共是經歷了預處理 編譯 彙編 鏈結四個過程。源程式 source code 預處理器 preprocessor 編譯器 compiler 匯程式設計序 assembler 目標程式 object code 聯結器 鏈結器,linker 可執行...

C程式到可執行程式的轉換過程

對於乙個c程式而言,要想能夠在機器上執行,它需要經歷很多步驟。首先,需要compiler將其轉換為組合語言程式,然後利用assembler再將其轉換為機器語言程式 也就是二進位製碼 然後應該是利用linker將它和必要的庫檔案鏈結在一起。最後才是用loader將連線的檔案從磁碟中讀到記憶體中,然後才...