1. 程式人生 > >一個C原始檔到可執行檔案 [反彙編-函式棧幀 編譯 連結]

一個C原始檔到可執行檔案 [反彙編-函式棧幀 編譯 連結]

[3] Program Headers

Program Headers用來描述Segment的資訊。Segment由多個Section組成。一般是將具有共同屬性如.data和.bss匯聚為一個Segement加入到記憶體。個人理解目標檔案以Section的形式存在,可執行檔案以Segement的形式存在以方便載入到記憶體中執行。

4 小結

一個C原始檔經過編譯和連結可形成可執行檔案。編譯的過程C原始碼翻譯成機器指令或彙編程式碼。對目標檔案進行反彙編可以看到,程式中地址如函式的地址是用的相對地址。經過連結的目標檔案為程式分配了虛擬地址,程式中使用的是絕對地址(反彙編檢視)

虛擬記憶體可解決連結時為可執行檔案載入到記憶體中的地址衝突問題。如果直接使用實體地址,怎麼敢保證連結時為程式分配的地址沒有被用到。而有了MMU後,跟程式有關的地址都是虛擬地址,作業系統會根據記憶體中的頁表將程式載入到可用的記憶體中去。


《Linux C 程式設計一站式學習》P.299:程式的函式呼叫規則(1中的函式棧幀)並不是體系結構所強加的,ebp暫存器並不是必須這麼用,函式的引數和返回值也不是必須這麼傳,只是作業系統和編譯器選擇了以這樣的方式實現C程式碼中的函式呼叫,這稱為Calling Convention,Calling Convention是作業系統二進位制介面規範。