3

我不断地为“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”工作正常,我不了解实施的某些方面。如何解释输出?

4

1 回答 1

5

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

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

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

于 2013-02-23T20:33:35.700 回答