Objective c 来自armv7的otool的方法实现地址错误?

Objective c 来自armv7的otool的方法实现地址错误?,objective-c,assembly,arm,mach-o,otool,Objective C,Assembly,Arm,Mach O,Otool,我不断地得到“otool”所示方法的实现地址的1字节偏移量 例如,“otool-o”给出0xe99d5,但“otool-tvV”给出: +[NSError(SomeCategory) someMethod]: 000e99d4 b590 push {r4, r7, lr} 000e99d6 f6441184 movw r1, 0x4984 000e99da af01 add r

我不断地得到“otool”所示方法的实现地址的1字节偏移量

例如,“otool-o”给出0xe99d5,但“otool-tvV”给出:

+[NSError(SomeCategory) someMethod]:
000e99d4            b590        push    {r4, r7, lr}
000e99d6        f6441184        movw    r1, 0x4984
000e99da            af01        add     r7, sp, #4
000e99dc        f2c0010a        movt    r1, 0xa
所以方法从0xe99d4开始。0xe99d5看起来错误,未对齐。 我相信“otool”可以很好地工作,我不了解实现的某些方面。
如何解释输出?

现代ARM内核有两种类型的指令集。最初的一种称为
arm
模式,其中每条指令的长度为四个字节,较新的一种称为
thumb2
(您可以猜到它已经通过了一些迭代),其中指令的长度可以是两个或四个字节(引入的原因是代码密度)

CPU在进行分支时可以更改模式,通知CPU所使用的指令集的方法是通过设置要跳转的指令地址中的最低有效位。如果为0,则指令将被解释为
arm
模式;如果为1,则指令将被解释为
thumb
模式

因此,您看到的是您的函数处于
thumb2
模式,我们可以通过看到它由两个和四个字节长的指令组成来验证