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 コアには、2 種類の命令セットがあります。元のarm命令はモードと呼ばれ、各命令は 4 バイト長であり、新しい命令はthumb2(すでにいくつかの反復を通過していると推測できるように) 呼び出され、命令は 2 バイトまたは 4 バイト長になる可能性があります (導入の理由はコード密度です)。

CPU は分岐を行っているときにモードを変更できます。使用されている命令セットについて CPU に通知する方法は、ジャンプする命令のアドレスの最下位ビットを設定することです。0 の場合はモードとして解釈されarm、1 の場合はthumbモードとして解釈されます。

つまり、関数がthumb22 バイトおよび 4 バイト長の命令で構成されていることを確認できるモードになっていることがわかります。

于 2013-02-23T20:33:35.700 に答える