1. 程式人生 > >程式碼的編譯連線與執行過程

程式碼的編譯連線與執行過程

 1. 編譯

一個原始檔,經過編譯系統的處理,生成目標檔案的過程叫編譯。a.cpp經過編譯後在linux下會生成a.o這個目標檔案。

目標檔案主要用來描述程式在執行過程中需要放在記憶體中的內容,這些內容包括兩大類——程式碼和資料。相應的目標檔案也分成程式碼段和資料段。

程式碼段(.text)中的內容就是原始檔中定義的一個個函式編譯後得到的目的碼,a.o的程式碼段中應當包含main函式的程式碼。

資料段分為初始化的資料段(.data)和未初始化的資料段(.bss)。其中初始化的資料段中包括了那些在定義的同時設定了初值的靜態生存期物件。其他靜態生存期物件都放在未初始化的資料段中。

2. 連線

連線期間,需要將各個編譯單元的目標檔案和執行庫當中被呼叫過的單元加以合併。執行庫實際上就是一個個目的碼檔案的集合,執行庫的各個組成部分a.o…

這樣的目的碼具有相同的結構。經過合併後,不同編譯單元的程式碼段和兩類資料段就分別合併到一起了,程式在執行時程式碼和靜態資料需要佔據的記憶體空間就全部已知了,因此所有程式碼和資料都可以被分配確定的地址了。

連線的物件出了使用者源程式生成的目標檔案外,還有系統的執行庫。例如,執行輸入輸出功能,呼叫sinfabs這類標準函式,此外,系統執行庫中還包括程式的引導程式碼。在執行main函式之前,程式需要執行一些初始化工作,在main函式返回後,需要通知作業系統程式執行完畢,這些都由執行庫中的程式碼完成。

連線後生成的可執行檔案主體,和目標檔案一樣,也是各個段的資訊,只是可執行檔案的程式碼段中所有指令的地址,都是有效地址了。

3. 執行

程式的執行以程序為單位,程式的一次動態執行過程稱為一個程序。

程式是儲存在磁碟上的,執行前,作業系統需要首先將它載入到記憶體中,併為它分配足夠大的記憶體空間來容納程式碼段和資料段,然後把檔案中存放的程式碼段和初始化的資料段的內容載入其中。