安卓SO中GOT REL PLT 作用與關係

2021-08-10 23:40:46 字數 2497 閱讀 6417

**:

之前寫的太混亂,修改了一下~

在**中像這樣呼叫其他so庫中的函式、全域性變數,

程式編譯完成後,程式並不知道這些函式和變數的記憶體位址的,

因為它們都在別的so庫,而這些so庫可能存在程序中的任何記憶體位址。

所以,程式跑起來時,才能找到它們的位址,然後訪問或執行。

(1)程式從磁碟檔案複製到程序記憶體中,叫裝載

(2)找到上面說的那些函式/變數位址,叫重定位

(3)裝載 + 重定位的整個過程,叫鏈結。

(4)負責完成這件事的,叫鏈結器。··

··通過rel表 gpt表 和plt表的配合。··

··(1)rel表的作用是:

本程式裝載進記憶體時,通過自己的rel表項告訴鏈結器,哪些地方需要重定位。

本程式裝載進記憶體時,通過自己的rel表項告訴鏈結器,哪些地方需要重定位。

本程式裝載進記憶體時,通過自己的rel表項告訴鏈結器,哪些地方需要重定位。··

(2)got表的作用是:

用來存放鏈結器找到的 函式/變數位址。

用來存放鏈結器找到的 函式/變數位址。

用來存放鏈結器找到的 函式/變數位址。··

(3)當程式執行到引用變數或呼叫函式時:

就去訪問got表項找這個位址。

就去訪問got表項找這個位址。

就去訪問got表項找這個位址。··

(4)囉嗦的解釋下:

elf中每乙個這樣不確定位址的地方,都會生成乙個rel表項。

每個rel表項,都對應乙個需要修正位址的地方。

·每個rel表項,都對應指出乙個got表項位址。

·每個got表項用來存放找到的位址。

·鏈結器將本模組裝載進入程序記憶體時,

會遍歷本模組的rel表項,得知誰需要修正,將修正的位址填入對應got項。

·做這件事的時機是,鏈結器將本模組裝載進入記憶體時,本模組init段**執行前。

(android arm elf情況下,這種叫裝載時重定位)··

(4)總結來說就是:

rel項 ---> 需要修正位址的符號 / got項 ---> 最終的位址

rel項 ---> 需要修正位址的符號 / got項 ---> 最終的位址

rel項 ---> 需要修正位址的符號 / got項 ---> 最終的位址··

ida下的rel表

ida下的got表

··(1)給模組外libc.so庫的函式clock() 、變數optopt生成了相應的rel目

·(2)沒有給模組內的myfun()生成rel項

(因為它在本模組內,不需要鏈結器和rel got那套玩意,自己就能直接確定位址,這種方式叫相對定址)

(但是也可用把這件事交給鏈結器做,也就是給它也生成相應的rel項和got項)

·(3)給myvar生成了rel項和got項

·(4)關於rel.dyn , rel.plt , r_arm_jump_slot , r_arm_glob_dat這些東西先不說,以後再解釋。··

··圖里都寫清楚了,不熟悉同學多除錯幾次觀察。這裡就補充解釋下plt部分。··

偏移fbc處的ebffff93 bl e10 clock@plt,

實際上並沒有跳轉到外部的libc.so的clock()函式,

而是跳轉到了自身的plt節中,接著看下plt出指令的內容。··

objdump和ida的反彙編結果看起來並不相同,但實際是相同的,因為ida顯示的是偽指令。

objdump是這樣反彙編的:

ida是這樣反彙編的:

plt這段指令什麼意思呢?

其實就是讀取clock()對應的got表項值,然後將值賦給pc跳轉到clock()。

bl clock() →→→ plt →→→ got →→→ libc.so clock()··

所以這裡的plt的作用是:

ARM 安卓SO檔案重定位型別總結

上一貼 安卓so中got rel plt 作用與關係 有前輩寫過類似的內容 基於android的elf plt got符號重定向過程及elf hook實現 2 重定位型別總結 3 這個有什麼卵用?1 提高看彙編的能力,擺弄明白了,一眼就能從彙編裡看出來,怎麼訪問或呼叫符號的。2 got表hook時,...

安卓中dp,dip,dpi關係

之前寫錯了,現在改一下,參考自 1.首先宣告一下,dip與dp是同乙個單位,只不過叫法不同 dp全稱 density independent pixels,dip全稱 density independent pixels。density 密度,pixel 畫素 意思即 密度無關畫素 有些人說是dev...

安卓中sharedperference的用法

引數 sharedperference 使用步驟 1.獲取到 sp this.getsharedpreferences config 0 2.獲取編輯器 editor editor sp.edit 3.editor.putstring key,value putint putdouble 4.edi...