我想了解如何在ARM汇编语言中实现IOS Objective-C消息调用。查看IDA反汇编输出,我可以看到在调用__obj_msgsend之前将类和选择器引用推入寄存器。这很有道理,但奇怪的是这些值有一个奇怪的偏移。ARM汇编(IOS)中的目标C选择器的偏移量
selector ref = (selRef_arrayWithObject_ - 0x29B0)
class ref = (classRef_NSArray - 0x29BC)
在类REF的0x29BC值似乎是指向具有一定逻辑给它的__obj_msgsend之后的指令,但0x29B0选择裁判指向随机MOVT指令。更糟糕的是,这个偏移对于每个选择器调用来说似乎都不同。
有没有人知道这些偏移量来自哪里?他们为什么不只是参考指令地址+ 8?
__text:00002998 E8 1F 01 E3 MOV R1, #(selRef_arrayWithObject_ - 0x29B0) ; selRef_arrayWithObject_
__text:0000299C 05 20 A0 E1 MOV R2, R5
__text:000029A0 00 10 40 E3 MOVT R1, #0
__text:000029A4 01 50 A0 E3 MOV R5, #1
__text:000029A8 01 10 9F E7 LDR R1, [PC,R1] ; selRef_arrayWithObject_ ; "arrayWithObject:"
__text:000029AC 74 00 02 E3 MOV R0, #(classRef_NSArray - 0x29BC) ; classRef_NSArray
__text:000029B0 00 00 40 E3 MOVT R0, #0
__text:000029B4 00 00 9F E7 LDR R0, [PC,R0] ; _OBJC_CLASS_$_NSArray
__text:000029B8 8C 05 00 EB BL _objc_msgSend
更新:这里是另一种情况:
__text:00002744 50 12 02 E3 MOV R1, #(selRef_view - 0x2758) ; selRef_view
__text:00002748 00 10 40 E3 MOVT R1, #0
__text:0000274C 00 50 A0 E1 MOV R5, R0
__text:00002750 01 10 9F E7 LDR R1, [PC,R1] ; selRef_view ; "view"
__objc_selrefs:000049A8 1A 39 00 00 selRef_view DCD sel_view ; DATA XREF: __text:000025F8o
感谢伊戈尔的解释,我明白了其中0x2758是从哪里来的,但数学已经不在这里工作了: selRef_view - 0x2758 = 0x49A8 - 0x2758 = 0x2250。但是第一条指令中的数据是50 12,这意味着0x1250,0x1000会减少。有任何想法吗???
你说的抵消,但反汇编列表是从绝对地址。 – arul