从otool对ARMv7错误的方法实现的地址?(Wrong method implementatio

2019-07-20 10:05发布

我经常收到1个字节由“otool”显示方法的实现地址的偏移量。

举一个例子“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”工作正常,我不明白,实施的一些方面。 如何解释输出?

Answer 1:

现代ARM内核有两种类型的指令集。 原来一个被称为arm模式,其中每个指令长度为4字节和更新的一个叫thumb2 (你可以猜测它已经通过某些迭代),其中指令可以是两个或四个字节长(引进的原因是代码密度) 。

CPU时,它正在一个分支并告知所使用的指令集CPU的方式可以改变模式是通过设置至少显著位指令的地址被吓了一跳。 如果它是0指令将被解释为arm模式,如果它是1,他们将被解释为thumb模式。

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



文章来源: Wrong method implementation address from otool for armv7?