程序位址空間 可執行檔案 分析

2021-10-08 11:17:46 字數 1010 閱讀 2586

位址空間頂部保留給核心(作業系統常駐記憶體的部分)。位址空間的這個部分包含核心在代表程序執行指令時(比如當應用程式執行系統呼叫時)使用的**、資料和棧。

對任何乙個普通程序來講,它都會涉及到5種不同的資料段:

棧(stack):即呼叫棧,存放程式臨時建立的區域性變數;

堆(heap):存放程序執行中被動態分配的記憶體段;

靜態區:

唯讀**段:用來存放程式執行**的一塊記憶體區域,包括.text**段,.rodata唯讀常量段(read only)。

這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

elf頭描述檔案的總體格式,還包含程式的入口點,也就是當程式執行時要執行的第一條指令的位址。

唯讀**段

.init:定義了乙個小函式,叫做_init,程式的初始化**會呼叫它。

.text: 存放已編譯程式的機器**。

.rodata:常量區,存放唯讀資料,比如字串常量、printf語句中的格式串和開關語句的跳轉表。

靜態區全域性區):

.data:已初始化的全域性、靜態c變數。

.bss:未初始化以及所有被初始化為0的全域性和靜態c變數。目標檔案中這個節不佔據實際的空間,僅僅是乙個佔位符,節省了空間,執行時,在記憶體中分配這些變數,初始值為0。

【ps】區域性變數在執行時被儲存在棧中,不在可執行目標檔案中。c++中未初始化的全域性class物件會自動使用隱式構造,被置於.data段。

參考:《深入理解計算機系統》第七章、第八章

C 獲取可執行檔案位址

net core裡由於僅保留最基層的類庫,編譯後,一些附加類庫是無法附加生成的,所以一些原來的寫法不具有通用性,下面的通用性寫法,適用於.net 標準類庫與.net core類庫 可執行檔案位址 private readonly string locationpath system.io.direc...

可執行檔案及linux程序記憶體

通過編譯器編譯為可執行檔案,linux下執行檔案的格式為elf。linux下物理記憶體通過mmu管理對映到程序的虛擬記憶體中,虛擬記憶體的分布 2.data段 資料段,初始化的全域性變數和static變數。為何還產生bss段,為了可執行程式更加的小。3.bss 未初始化的全域性變數和static變數...

linux 執行可執行檔案

1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...