天天看點

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

注:部分引用自https://blog.csdn.net/ylcangel/article/details/18188921

一.相關概念:

重定位條目:當彙編器生成一個目标子產品時,它并不知道資料和代碼最終将存放在存儲器中的什麼位置。它也不知道這個子產品引用的任何外部定義的函數和全局變量。是以,無論何時彙編器遇到對最終位置未指定目标引用,它就會生成一個重定位條目,告訴連結器在将目标檔案合并可執行檔案時如何修改這個引用。代碼重定位條目放在.rel.text中。已經初始化資料的重定位條目放在.rel.data中。即重定位條目位于目标檔案中

二.相關指令:

    1.readelf -r xxx.o,可以讀取目标檔案中的可重定位資訊

    2.objdump -d xxx.o,可以檢視彙編代碼

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位
elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

三.絕對重定位:

方法:

1.從可執行檔案中擷取符号表中,變量a對應的符号的值,此值為S=0x0804a01c

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

2.從目标檔案中擷取A值,先從目标檔案中擷取可重定位資訊,通過readelf -r main.o

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

offset = 0x19,為在目标檔案中的偏移,然後根據此offset值,在彙編檔案中查找A值

檢視彙編代碼:objdump -d main.o,A=0x00000000,0x18處為指令0xa1(可根據此指令在main中修改計算後的值)

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

最終的值為:S+A = 0x0804a01c

3.驗證可執行檔案中的此值

根據0x18處的指令為0xa1,在main可執行檔案的彙編代碼中,驗證我們計算的值和連結産生的值是否一緻

objdum -d main |grep a1,可以看到a1後面的位址為 0x0804a01c  (小端模式)

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

四.相對重定位

方法:

.1.從可執行檔案中擷取符号表中,函數sum對應的符号的值,此值為S=0x0804847a

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

2.從目标檔案中擷取A值,先從目标檔案中擷取可重定位資訊,通過readelf -r main.o,

在目标檔案中的偏移為0x25

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

然後根據此offset值,在彙編檔案中查找A值為0xfcffffff

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

3.在可執行檔案中查找P值,根據在目标檔案中0x25偏移處A值,其前一個位址0x24為指令0xE8,根據

此指令0xe8,在可執行檔案中找到P值,此處0xe8指令在位址0x804842f處,下一個位址0x8048430為P值

elf可重定位記錄一.相關概念:二.相關指令:三.絕對重定位:四.相對重定位

Result = S + A - P = 0x0804847a + 0xfcffffff - 0x8048430 = 0x46,小端位址,是以0x8048430位址處的值,存放

計算後的結果0x46