可重定位的elf檔案(續)
2011-04-28 10:31
d.重定位表
重定位表中的每個表項都包含了
如何修改某個目標項的資訊,一般,同乙個重定位表中的表項都是描述同乙個節區中符號的修改資訊.下面是重定位表項的資料結構:
typedef
struct
elf32_rel elf32_rel
;typedef
struct
elf32_rela elf32_rela
/* the following are used with relocations */
#define elf32_r_sym(x) ((x) >> 8)
#define elf32_r_type(x) ((x) & 0xff)
其中,r_offset表示的
是從節區頭部開始到將被重定位影響的儲存單位之間的位元組偏移 即
指明了重定位操作的實施位置;
r_info也包含兩個資訊 一為重定位
型別(低8位) 即指明了重定位操作
的方法,二為被實施重定位的符號索引(高24位) 即指明了操作的實施物件.
下表是x86結構下重定位操
作的型別和說明.
x86體系結構下重定位型別
名稱數值
字段計算
說明r_386_none0(
無)(無
)r_386_32
1word32
s+ar_386_pc32
2word32
s+a-p
r_386_got32
3word32
g+a-p
此重定位型別
計算從全域性偏移表基址到符號的全域性偏移表項之間的距離
。它會通知連線編輯器構造乙個全域性偏移表。
r_386_plt32
4word32
l+a-p
此重定位型別計算符號的過程鏈結表項的地質,並通知鏈結編輯器構造乙個過程鏈結表。
r_386_copy5(
無)(無
)鏈結編輯器建立這種重定位型別的目的是支援動態鏈結。其偏移量成員引用某個可寫段中的某個位置。符號表索引規定符號應該既存在於當前目標檔案中,也存在於某個共享目標中。在執行過程中,動態鏈結器把與共享目標的符號相關的資料複製到由偏移給出的位置。
r_386_glob_dat
6word32
s此重定位型別用來把某個全域性偏移表項設定為給定符號的位址。這種特殊的重定位型別允許確定符號與全域性偏移表項之間的關係。
r_386_jmp_slot
7word32
s鏈結編輯器建立這種重定位型別主要是為了支援動態鏈結。其偏移位址成員給出過程鏈結表項的位置。動態鏈結器修改過程鏈結表項的內容,把控制傳輸給指定符號的位址。
r_386_relative
8word32
b+a鏈結編輯器建立這種重定位型別是為了支援動態鏈結。其偏移位址成員給出共享目標中的乙個位置,在該位置包含了代表相對位址的乙個數值。動態鏈結器通過把共享目標被載入到的虛位址和相對位址相加,計算對應的虛位址。這種型別的重定位項必須設定符號表索引為 0。
r_386_gotoff
9word32
s+a-got
這種重定位型別會計算符號取值與全域性偏移表位址間的差。並通知鏈結編輯器建立乙個全域性偏移表。
r_386_gotpc
10word32
got+a-p
此重定位型別與
r_386_pc32
類似,只不過它在計算時採用全域性偏移表的位址。在此重定位項中引用的符號通常是
_global_offset_table_
,這種型別也會暗示連線編輯器構造全域性偏移表。
e.其他節區
很多節區中包含了程式和控制資訊。下面的表中列舉出來的是系統使用的節區,以及它們的
型別和屬性。
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開啟終端,輸入指令 不同節的位置和大小是由節頭部表的描述的,其中目標檔案中每個節都有乙個固定大小...
04可重定位目標檔案ELF檔案解析
目錄 一 可重定位目標檔案的特點 二 可重定位目標檔案的格式 可被鏈結 合併 生成可執行檔案或共享目標檔案 靜態鏈結庫檔案由若干個可重定位目標檔案組成 包含 資料 已初始化全域性變數和區域性靜態變數.data和未初始化的全域性變數和區域性靜態變數.bss 包含重定位資訊 指出哪些符號引用處需要重定位...