armot7的otool错误的方法实现地址?

Ale*_*nov 3 assembly arm mach-o objective-c 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     r7, sp, #4
000e99dc        f2c0010a        movt    r1, 0xa
Run Code Online (Sandbox Code Playgroud)

所以方法从0xe99d4开始.0xe99d5看起来不对,没有对齐.我相信'otool'工作正常,我不了解实施的某些方面.如何解释输出?

aus*_*len 5

现代ARM内核有两种类型的指令集.原始的一个被称为arm模式,其中每个指令是四个字节长,并且调用更新的一个thumb2(因为你可以猜测它已经通过了一些迭代),其中指令可以是两个或四个字节长(引入的原因是代码密度).

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

所以你看到的是你的函数处于thumb2模式,我们可以通过看到它包含两个和四个字节长的指令来验证.