⦁ 預處理
⦁ 編譯
⦁ 彙編
⦁ 鏈結
圖:gcc編譯過程
鏈結包括動態鏈結和靜態鏈結,靜態鏈結過程中有位址和空間分配(address and storage allocation)、符號決議(symbol resolution)和重定位(relocation)等。靜態鏈結過程如圖:
編譯器編譯源**之後生成的檔案稱為目標檔案。
平台目標檔案格式
目標檔案字尾名
windows
pe-coff
.obj
linux
elf.o
目標檔案中有指令、資料,還有鏈結時需要的一些資訊,如符號表,除錯資訊,字串表等。將這些資訊按不同的屬性,以「段」的形式儲存。
elf header
.text
.data
.bss
other sections
section header table
string tables
symbol tables
圖:elf結構
⦁ elf檔案頭:描述檔案的基本屬性,如elf檔案版本、目標機器型號、程式入口位址等。
⦁ 段表:描述包含的所有段的資訊,包括段名、段的長度、在檔案中的偏移、讀寫許可權等。
⦁ 輔助結構:字串表、符號表等。
除了.text .data .bss外,其他常用的段名如下表:
圖:程式與目標檔案
檢視上述檔案的目標檔案,可以看到包含的段如下:
⦁ **段
⦁ 資料段
⦁ bss段 :未初始化的全域性變數和區域性靜態變數。
⦁ rodata唯讀資料段:唯讀資料,如字串常量,全域性const變數。
⦁ comment注釋資訊段:編譯器版本資訊
⦁ 堆疊提示段
contents:該段在檔案中存在。
vlm和lma:虛擬記憶體位址、裝載記憶體位址。
file off : 在檔案中的偏移。
圖:目標檔案結構圖
⦁ 程式載入後,資料和指令分別對映到兩個虛擬區域,資料區可讀寫,指令區只能讀,許可權不同。
⦁ cpu快取一般都設計成資料快取和指令快取,分開有利於提高程式區域性性,提公升cpu快取命中率。
⦁ 執行多個程式副本時,程式指令都一樣,每個程序儲存自己的資料區域。
多目標檔案的鏈結
考慮下面幾個程式段 stack.c char stack 512 int top 1 void push char c char pop void int is empty void main.c include int a,b 1 int main void 編譯時可以一步編譯 gcc main....
編譯鏈結中的 可重定位目標檔案
可重定位目標檔案理解 資料一 彙編器所產生的目標檔案至少包括三個區,即文字區 text 資料區 data 和bss區。文字區一般包括程式的 和常量,資料區通常存放全域性變數等內容,bss區用於存放未初始化的變數或作為公共變數儲存空間。在乙個目標檔案中,其text區從位址 開始,隨後是data區,再後...
Linux鏈結 目標檔案格式
將各種 段和資料段收集組合成為乙個單一檔案的過程。鏈結器的出現使得構建大型軟體系統成為可能,因為它使得各個模組可以單獨完成編譯。當需要改進模組時,單獨的修改相應的模組並編譯,通過鏈結器重新鏈結生成新版本的軟體系統。sum.cpp中定義乙個函式int sum int a,int b main.cpp中...