Android的ELF檔案重定位詳解,包括64位

2021-08-26 02:17:04 字數 1578 閱讀 7639

elf檔案格式,主要基於兩種,一種是基於鏈結檢視,鏈結檢視即是基於節(section)來進行解析,一種是基於執行檢視,執行檢視即是基於段(segment)來進行解析。前一種是用於靜態分析的時候,譬如ida載入。後一種是在動態鏈結執行的時候,譬如linker載入。

所以修改節資訊實際上是不影響elf正常執行的,而且hook功能也只能在執行檢視中進行符號解析。

所以修改節資訊實際上是不影響elf正常執行的,而且hook功能也只能在執行檢視中進行符號解析。

所以修改節資訊實際上是不影響elf正常執行的,而且hook功能也只能在執行檢視中進行符號解析。

基於執行檢視通過pt_dynamic獲取重定位段,然後在重定位段中可獲得主要兩種型別的重定位表:dt_rel(a),dt_jumprel,分別對應rel.dyn和rel.plt。在這兩種表裡面,可通過elf_r_type_t獲取重定位型別,重定位型別按功能性分函式型別和變數型別,後面會詳述。那rel.dyn和rel.plt分別存放的重定位型別是有所不同,r_arm_relative、r_arm_abs32和r_arm_glob_dat存放在rel.dyn上,r_arm_jump_slot存放在rel.plt上。

常見的重定位函式型別有三種:r_arm_jump_slot,r_arm_abs32和r_arm_glob_dat。

對於64位或者其他平台的有:

#if defined(__arm__)

#define jump_slot_t r_arm_jump_slot //.rel.plt

#define glob_dat_t r_arm_glob_dat //.rel.dyn

#define abs_t r_arm_abs32 //.rel.dyn

#elif defined(__aarch64__)

#define jump_slot_t r_aarch64_jump_slot

#define glob_dat_t r_aarch64_glob_dat

#define abs_t r_aarch64_abs64

#elif defined(__i386__)

#define jump_slot_t r_386_jmp_slot

#define glob_dat_t r_386_glob_dat

#define abs_t r_386_32

#elif defined(__x86_64__)

#define jump_slot_t r_x86_64_jump_slot

#define glob_dat_t r_x86_64_glob_dat

#define abs_t r_x86_64_64

#endif

那每種對應什麼型別呢

ELF檔案 重定位表

重定位 relocation 是把符號引用與符號定義鏈結到一起的過程 比如,當程式呼叫乙個函式時,將從當前執行的指令位址處跳轉到乙個新的指令位址處去執行 然而在編寫程式的過程中,只需要指明所要呼叫的函式名 即符號引用 即可,然後,在重定位過程中,動態鏈結器會把函式名與函式實際所在的位址 即符號定義 ...

可重定位的ELF檔案 續

可重定位的elf檔案 續 2011 04 28 10 31 d.重定位表 重定位表中的每個表項都包含了 如何修改某個目標項的資訊,一般,同乙個重定位表中的表項都是描述同乙個節區中符號的修改資訊.下面是重定位表項的資料結構 typedef struct elf32 rel elf32 rel type...

ELF格式可重定位目標檔案

乙個典型的elf格式的可重定位目標檔案以elf頭開始,還包括 區 資料區,以下是具體形式 elf頭 text 已編譯程式的機器 rodata 唯讀資料 data 已初始化的全域性和靜態c變數 bss 未初始化的全域性和靜態c變數,初始化為0的全域性或靜態變數 symtab 符號表 rel.text ...