04可重定位目標檔案ELF檔案解析

2021-10-16 08:51:27 字數 2812 閱讀 5223

目錄

一:可重定位目標檔案的特點

二:可重定位目標檔案的格式

•可被鏈結(合併)生成可執行檔案或共享目標檔案

•靜態鏈結庫檔案由若干個可重定位目標檔案組成

•包含**、資料(已初始化全域性變數和區域性靜態變數.data和未初始化的全域性變數和區域性靜態變數.bss)

•包含重定位資訊(指出哪些符號引用處需要重定位)

•擴充套件名為.o(相當於windows中的.obj檔案)

我們都知道可重定位目標檔案都是用來進行鏈結生成可執行目標檔案的,那麼下面我們來看下相應的鏈結試圖,看看可重定位目標檔案中都包含什麼資訊,下圖是乙個簡單的舉例,一起來看下吧。

通過上面的我們可以看出elf檔案主要包含了text,data,bss節,之前的文章對這些節的內容也做了簡單的介紹,具體可以翻看之前的內容。要想進行連線,除了這幾個節之前還需要其他的資訊,比如符號表,重定位資訊等等,這些後面會一一介紹。這裡我們先介紹下為什麼會有bss節。

•c語言規定:

– 未初始化的全域性變數和區域性靜態變數的預設初始值為0

• 將未初始化變數(.bss節)與已初始化變數(.data節)分開的好處

– .data節中存放具體的初始值,需要佔磁碟空間

– .bss節中無需存放初始值,只要說明.bss中的每個變數將來在執行時占用幾個位元組即可,

因此,.bss節實際上不占用磁碟空間,提高了磁碟空間利用率

• bss 中所用的乙個 (block started by symbol)最初是ua-sap匯程式設計序偽指令,用於為符號預留一塊記憶體空間

• 所有 通過專門的 未初始化的全域性變數和區域性靜態變數 「節頭表(section header table)」

都被彙總到.bss節中,來說明應該為.bss節預留多大的空間

上面講了可重定位目標檔案有text,data,bss節,除了這些內容還有其他的重要資訊,下面我們一起來**一下吧。

從上面的圖中我們可以看到可執行目標檔案包含的內容有很多,下面我們一一進行分析

1:elf頭

elf頭位於elf檔案開始,包含檔案結構說明資訊。分32位系統對應結構和64位系統對應結構(32位版本、64位版本)。包括16位元組標識資訊、檔案型別 (.o,exec, .so)、機器型別(如 ia-32)、節頭表的偏移、節頭表的表項大小以及表項個數。

我們以32為作業系統做舉例,其對應的資料結構如下所示:

#define ei_nident 16

typedef struct elf32_ehdr;

定義了elf魔數、版本、小端/大端、作業系統平台、目標檔案的型別、機器結構型別、程式執行的入口位址、程式頭表(段頭表)的起始位置和長度、節頭表的起始位置和長度等

其中魔數在檔案開頭的幾個位元組中,通常是用來確定 檔案的型別和格式的,載入或讀取檔案的時候可以用魔數來確定檔案的型別是否正確。

a.out的魔數:01h 07h

pe格式魔數:4dh 5ah

2:.text 節編譯後的**部分

3:.rodata 節

唯讀資料,如 printf 格式串、switch跳轉表等

4:.data 節

已初始化的全域性變數

5:.bss 節

未初始化全域性變數,僅是佔位符,不佔據任何實際磁碟空間。區分初始化和非初始化是為了空間效率

6:.symtab 節

存放函式和全域性變數 (符號表)資訊 ,它不包括區域性變數

7:.rel.text 節

.text節的重定位資訊,用於重新修改**段的指令中的位址資訊

8:.rel.data 節

.data節的重定位資訊,用於對被模組使用或定義的全域性變數進行重定位的資訊

9:.debug 節

除錯用符號表 (gcc -g)

10:strtab 節

包含symtab和debug節中符號及節名section header table(節頭表)每個節的節名、偏移和大小

11:section header table(節頭表)

每個節的節名、偏移和大小

上面這些就是可重定位目標檔案包含的資訊了,其中section header table(節頭表)表述就是每個節所佔據的位址空間大小了。

上圖中就是節頭表的資訊舉例,使用readelf -s test.o命令可以檢視,其中addr例表述的是每個節對映到虛擬位址的位置,因為可重定位目標檔案還沒有經過鏈結過程,所以該例都是0,經過鏈結過程之後才會將各個節對映到虛擬位址上去。

上述各個節中有4個節會被分配儲存空間,其他的節在系統真正執行的時候是不會分配儲存空間的。

.text:可執行

.data和.bss:可讀可寫

.rodata:可讀

ELF格式可重定位目標檔案

乙個典型的elf格式的可重定位目標檔案以elf頭開始,還包括 區 資料區,以下是具體形式 elf頭 text 已編譯程式的機器 rodata 唯讀資料 data 已初始化的全域性和靜態c變數 bss 未初始化的全域性和靜態c變數,初始化為0的全域性或靜態變數 symtab 符號表 rel.text ...

ELF可重定位目標檔案格式

現在我們用乙個簡單的c語言程式addvec.c做示範,如下 int addvec 0p void addvec int x,int y,int z,int z int i addvec for i 0 i開啟終端,輸入指令 不同節的位置和大小是由節頭部表的描述的,其中目標檔案中每個節都有乙個固定大小...

可重定位目標檔案

目標檔案有三種形式 1.可重定位目標檔案 2.可執行目標檔案 3.共享目標檔案 編譯器和彙編器生成可重定位目標檔案 共享目標檔案,聯結器生成可執行目標檔案。在這裡我們首先介紹可重定位目標檔案。可重定位目標檔案 包含二進位制 和資料,可以在編譯時與其他可重定位目標檔案合併起來,建立乙個可執行目標檔案。...