注:部分引用自https://blog.csdn.net/ylcangel/article/details/18188921
一.相關概念:
重定位條目:當彙編器生成一個目标子產品時,它并不知道資料和代碼最終将存放在存儲器中的什麼位置。它也不知道這個子產品引用的任何外部定義的函數和全局變量。是以,無論何時彙編器遇到對最終位置未指定目标引用,它就會生成一個重定位條目,告訴連結器在将目标檔案合并可執行檔案時如何修改這個引用。代碼重定位條目放在.rel.text中。已經初始化資料的重定位條目放在.rel.data中。即重定位條目位于目标檔案中
二.相關指令:
1.readelf -r xxx.o,可以讀取目标檔案中的可重定位資訊
2.objdump -d xxx.o,可以檢視彙編代碼
三.絕對重定位:
方法:
1.從可執行檔案中擷取符号表中,變量a對應的符号的值,此值為S=0x0804a01c
2.從目标檔案中擷取A值,先從目标檔案中擷取可重定位資訊,通過readelf -r main.o
offset = 0x19,為在目标檔案中的偏移,然後根據此offset值,在彙編檔案中查找A值
檢視彙編代碼:objdump -d main.o,A=0x00000000,0x18處為指令0xa1(可根據此指令在main中修改計算後的值)
最終的值為:S+A = 0x0804a01c
3.驗證可執行檔案中的此值
根據0x18處的指令為0xa1,在main可執行檔案的彙編代碼中,驗證我們計算的值和連結産生的值是否一緻
objdum -d main |grep a1,可以看到a1後面的位址為 0x0804a01c (小端模式)
四.相對重定位
方法:
.1.從可執行檔案中擷取符号表中,函數sum對應的符号的值,此值為S=0x0804847a
2.從目标檔案中擷取A值,先從目标檔案中擷取可重定位資訊,通過readelf -r main.o,
在目标檔案中的偏移為0x25
然後根據此offset值,在彙編檔案中查找A值為0xfcffffff
3.在可執行檔案中查找P值,根據在目标檔案中0x25偏移處A值,其前一個位址0x24為指令0xE8,根據
此指令0xe8,在可執行檔案中找到P值,此處0xe8指令在位址0x804842f處,下一個位址0x8048430為P值
Result = S + A - P = 0x0804847a + 0xfcffffff - 0x8048430 = 0x46,小端位址,是以0x8048430位址處的值,存放
計算後的結果0x46