1. 程式人生 > >第八章 從源文件到可執行文件

第八章 從源文件到可執行文件

程序加載 系統 通過 就是 標準函數 sage 以及 printf 入庫

從這一章理解到的是,源代碼是用某種編程語言編寫的代碼,源文件是保存源代碼的文件,源代碼經過編譯後得到的是本地代碼(本地代碼用十六進制表示),本地代碼的內容就是數值的羅列,而編譯源代碼還需要經過詞法解析、語法解析、詞義解析、中間代碼生成、優化,最後得到目標代碼。

源文件僅經過編譯是無法得到可執行文件的,編譯後得到的是目標文件,還需要進行“鏈接”處理,這就牽扯到鏈接器,鏈接器就是把多個目標文件結合,生成1個EXE文件的處理,就是鏈接運行連接的程序。由於編寫的源代碼中,包含自己編寫的函數和內部函數,像自己編寫的函數是存儲在源文件在的,而內部函數就不在其源文件中,是存在擴展名為.lib的庫文件中,庫文件是指把多個目標文件集成保存在一個文件中的形式,鏈接器指定庫文件後,就會從中把需要的目標文件抽取出來,並同其他目標文件結合起來生成EXE文件。

其生成EXE文件需要鏈接一個目標文件的啟動,例c0w32.obj,這個目標文件中記述的是同所有程序起始位置相結合的處理內容,即程序的啟動。標準函數是不通過源代碼形式,而是通過庫文件形式和鏈接器一起提供的函數,例如本章中的sprintf()。

Windows以函數的形式為應用提供了各種功能,這樣形式的函數被稱為API,API的目標文件不是存儲在通常的庫文件中,而是存儲在名為dll文件的特殊庫文件中。例如本章的MessageBox()是存儲在import32.lib中,但實際上存儲在user32.dll文件中,import32.lib中僅存儲了兩個信息,一是MessageBox()是在user32.dll這個DLL文件中,另一個是存著DLL文件的文件夾信息。像這樣的庫文件稱為導入庫。

EXE文件是單獨存儲在硬盤中的,作為本地代碼的程序,其沒有給變量及函數指定實際的內存地址,而是分配了虛擬的內存地址,在程序運行時,虛擬的內存地址就會轉換為實際的內存地址,EXE文件會在EXE文件的開頭追加轉換內存地址所需的必要信息,這個信息成為再配置信息。

EXE文件的內容分為在配置信息、變量組、函數組,當程序加載到內存後,還會再生成兩個組,那就是堆和棧。(其一部分用於操作系統)棧是用來存儲函數內部臨時使用的變量(局部變量)以及函數調用時所用的參數的內存區域,堆是用來存儲程序運行時的任意數據及對象的內存領域。棧中對數據進行存儲和舍棄的代碼是由編譯器自動生成的,而堆則需要根據程序員編寫的程序來進行申請分配或釋放。

第八章 從源文件到可執行文件