**:
之前寫的太混亂,修改了一下~
在**中像這樣呼叫其他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...