函数跳转分析
__cxa_atexit@PLT: // __cxa_atexit 00005414 add ip, pc, #0x0, #0xc ; 0x541c, CODE XREF=dword_58ac+36, _Z32jsb_init_file_operation_delegatev+116 00005418 add ip, ip, #0x1e000 0000541c ldr pc, [ip, #0xa60]!
__cxa_atexit@GOT: // __cxa_atexit
00023e7c dd 0x000242c4
反编译工具,反编译出某段代码。
ip 是 内部过程调用寄存器
pc 是程序寄存器
add 语法
ADD{S}{cond} {Rd}, Rn, Operand2 ADD{cond} {Rd}, Rn, #imm12 ; Thumb, 32-bit encoding only
add ip, pc, #0x0, #0xc //ip = pc
add ip, ip, #0x1e000 //ip = ip + 0x1e000
ldr pc, [ip, #0xa60]! // ip = ip + 0xa60; pc = *(int*)ip;
当执行到第一个add的时候, pc的值为0000541c, 因为pc始终指向当前执行指令+8。
官网原话:在执行期间,PC不包含当前执行指令的地址。当前执行指令的地址通常是ARM的PC-8或Thumb的PC-4。
#0xc 是add语法外的东西,可能反编译器显示的问题。
第一个add执行完之后 ip = 0000541c
当执行到第二个add的时候,ip = 0000541c, 执行完之后 ip = 0002341c
当执行到第3个指令ldr的时候,ip = 0002341c; 执行完之后 pc = 0x000242c4, ip=0023e7c;
此时开始执行0x000242c4位置的代码