靜態鏈結中的目標檔案

2021-08-27 00:04:30 字數 1662 閱讀 6202

⦁    預處理

⦁    編譯

⦁    彙編

⦁    鏈結

圖: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中...