c 編譯鏈結階段的目標檔案相關

2021-10-11 14:34:54 字數 833 閱讀 3671

目標檔案是編譯器編譯了源**之後生成的檔案格式(.o)。目標檔案從結構上來說,是已經編譯好之後的可執行檔案格式,還未經過鏈結,其中可能有些位址和符號還未調整。

所以說,目標檔案和可執行檔案的內容和結構很相似,通常在linux系統下採用elf格式來儲存。此外,值得注意的是,不光可執行檔案按照可執行檔案格式儲存,動態鏈結庫(dll)和靜態鏈結庫(static linking library)都按照可執行檔案格式儲存。

目標檔案中儲存了編譯後的機器指令**、資料、符號表、除錯資訊、字串等等內容。通常情況下,目標檔案都把這些資訊按不同的屬性以「段」的方式來儲存。

不同的資料儲存在不同的段中。程式源**編譯的機器指令常常放在**段(.text)中,已初始化的全域性變數和區域性靜態變數資料存放在資料段(.data); 還有乙個唯讀資料段(.rodata)段內存放的是唯讀資料,包括const修飾的變數和字串常量。這樣保證了const修飾變數的安全性不會被修改,屬性只會被設定成唯讀。為未初始化的全域性變數和區域性靜態變數預設值為0,都存放在.bss段中。值得注意的是,.bss段知識給未初始化的全域性變數和區域性靜態變數預留孔了位置,但是.bss段並未佔據空間。

elf檔案的開頭是乙個fild header檔案頭,它描述的是檔案屬性,包括是否可執行、靜態鏈結還是動態鏈結、函式的入口位址、目標硬體、目標作業系統等資訊。

總體來說,程式源**編譯之後主要分為兩種段結構:程式指令和程式資料。其中**段屬於程式指令,資料段和.bss段屬於程式資料。

編譯鏈結中的 可重定位目標檔案

可重定位目標檔案理解 資料一 彙編器所產生的目標檔案至少包括三個區,即文字區 text 資料區 data 和bss區。文字區一般包括程式的 和常量,資料區通常存放全域性變數等內容,bss區用於存放未初始化的變數或作為公共變數儲存空間。在乙個目標檔案中,其text區從位址 開始,隨後是data區,再後...

多目標檔案的鏈結

考慮下面幾個程式段 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....

關於編譯鏈結階段指定鏈結位址的作用

首先,記住一句話 程式的鏈結位址必須等於執行位址!在學習exynos 4412的啟動過程時,發現自己對鏈結位址的作用不是很了解,於是上網查詢了資料做了基本了解,在此做個總結。上圖是exynos 4412啟動時irom bl1和bl2在iram中的分布情況。由圖中可以看出,bl2會被載入到0x020 ...