一個程序從開始運行到結束的完整過程


源程序是指未經編譯的,按照一定的程序設計語言規范書寫的,人類可讀的文本文件,源程序就是所寫好的代碼。
可執行程序,即常說的.exe程序,可以執行程序,完成計算機功能。在C語言中,.c文件就是所謂的源文件。

源程序到可執行程序的過程。在這個過程中,會發生如下的變化:

.c文件生成.obj文件的過程,稱為編譯,.obj文件生成到.exe文件的過程,稱為鏈接。
.obj文件就是一個是程序編譯生成的二進制文件,當.exe文件生成以后.obj文件就會被刪除。
事實上,.c文件生成.exe文件的過程總共是經歷了預處理,編譯,匯編,鏈接,這四個過程。

1、預處理
為了接下來能夠解釋的更加清楚,使用linux平台下的gcc編譯器解釋。
先書寫一個非常簡單的程序來介紹:

test.c
1
#include<stdio.h> 2 3 int main() 4 { 5 printf("hello"); 6 7 return 0; 8 }

直接編譯得到:

第一步發生的是預編譯,使用-E指令會使程序只進行到預編譯指令。經過預編譯指令后的會生成一個.i文件。

 

在預編譯的過程中,主要處理源代碼中的預處理指令,引入頭文件,去除注釋,處理所有的條件編譯指令,宏的替換,添加行號,保留所有的編譯器指令。

當進行預編譯以后的文件中將不再存在宏,所有的宏都已經被替代。當想要判斷宏是否正確或者頭文件包含是否正確時,也可以通過預編譯來查看。

2、編譯

在預處理結束后,進行的是編譯。編譯過程所進行的是對預處理后的文件進行語法分析,詞法分析,語義分析,符號匯總,然后生成匯編代碼。

3、匯編

匯編過程將匯編代碼轉成二進制文件,二進制文件就可以讓機器來讀取。每一條匯編語句都會產生一句機器語言。

在這里最終會生成一個重定位目標文件 .o文件,類似windows下的.obj文件。這里生成的目標文件里面就是二進制文件。另外,在這里會形成符號表,給這些符號會分配虛擬地址。

4、鏈接

由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變量或者函數調用等);在程序中可能調用了某個庫文件中的函數等等。所有這些問題,都需要經鏈接程序的處理方能得以解決。鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。

鏈接分為靜態鏈接和動態鏈接:

靜態鏈接后綴是.a,主要在編譯的時候將庫文件里面代碼搬遷到可執行的文件中;

動態鏈接:后綴是.so,主要在執行的時候需要轉換到庫文件代碼執行;

兩種鏈接的優缺點:

(1)靜態的鏈接產生的可執行的文件體積比較的大;而動態鏈接的可執行文件的體積比較小;

(2)動態的鏈接的編譯的效率比較的高;

(3)靜態鏈接的可執行的文件執行的效率高

(4)靜態鏈接的可執行的文件的“布局”比較好一點;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM