程式鏈結與裝載

2021-06-28 06:01:19 字數 889 閱讀 5498

程式的執行需要執行環境支撐,其執行環境一般由記憶體、執行庫和系統呼叫構成。其中系統呼叫部分程度上充當的是程式與核心進行互動的中介。其中首先需明白,程式與記憶體關係。記憶體是承載程式執行的介質,也是程式進行各種運算和表達的場所。

window在預設情況下會將高位址的(2g)空間分配給核心(4g記憶體情況下),而linux預設情況下將高位址的1g空間分配給核心。使用者則只能使用剩下的2g或者3g記憶體空間。在使用者空間中,存在以下「預設」的「區域

*棧--用於維護函式呼叫的上下文,其通常在使用者空間的最高位址處分配,通常具有數兆位元組大小

*堆--堆是用來容納應用程式動態分配的記憶體區域,,當程式使用malloc或new分配記憶體時,其得到記憶體則由堆分配。堆一般位於棧的下方(低位址方向),在某些時候,堆也可能沒有固定統一的儲存區域。堆一般比棧大很多,可以有幾十到數百兆的容量。

*可執行檔案映像--儲存著可執行檔案在記憶體的映像。由裝載器在裝載時將可執行檔案的記憶體讀取或者對映到此處

*保留區--並不是乙個單一的記憶體區域,而是在記憶體中受到保護而禁止訪問的區域的總稱。比如,在大多數的作業系統中,極小的位址是不允許訪問的如null,一般的c語言無效指標賦值為0也是出於這個原因,因為在正常情況下0位址上不可能儲存有效的可訪問資料。

給出乙個linux典型的記憶體布局

圖中的「動態鏈結庫對映區」用於對映裝載的動態鏈結庫。在linux系統下,如果可執行檔案依賴其他共享庫,那麼系統就會認為它在從0x40000000開始的位址分配相應的空間,並將共享庫載入到該空間。

圖中的箭頭表明了其中大小可變區的尺寸增長方向,由圖可知,棧向低位址增長,堆向高位址增長。當堆或棧現有的大小不夠用時,會按照圖中增長方向擴大自己大小,直到預留空間被用完

靜態程式編譯鏈結與裝載

linkers and loaders 中文版 英文版 elf檔案格式 c語言編譯過程詳解,預處理,編譯,彙編,鏈結 乾貨滿滿 靜態程式編譯鏈結與裝載 一 問題的引入以及工具介紹 靜態程式編譯鏈結與裝載 二 編譯鏈結以及elf中section詳細分析 靜態程式編譯鏈結與裝載 三 segment分析以...

裝載 鏈結與庫

第五部分 windows動態鏈結 1 dll函式和變數必須在檔案顯示是匯入還是匯出,declspec dllexport 匯出,declspec dllimport 匯入.建立dll檔案的時候.c檔案生成.dll,lib,exp檔案,然後用.lib檔案和exe中的.c檔案生成的目標檔案鏈結在一起,生...

鏈結 裝載與庫

鏈結 裝載與庫 在linux下,當我們使用 gcc來編譯 helloword 程式時,只需要 gcc hello.c a.out hello world 其中實際包括4步驟 預處理 prepressinng 編譯 compliation 彙編 assembly 鏈結 linking 1.預編譯 gc...