4

OSなし(ベアメタル)のCortex-M3プロセッサ(ARMv7-Mアーキテクチャ)でコールスタックを構築しようとしています。ただし、この ABI にはフレーム ポインタ レジスタがありません。したがって、フレーム ポインターがない場合、コール スタックを生成するのに苦労しています。

-mapcs-frame-fno-omit-frame-pointerおよび-O0GCC のオプションの使用に関係なく、フレーム ポインタは保持されません。フレームポインター/スタックフレームを持っているので、GCCに強制的に使用させることができる別のABIがあるかどうか疑問に思っていますか? そうでない場合、コールスタックを生成する他の信頼できる方法はありますか?

前もって感謝します。

4

1 に答える 1

2

ところで、上記のコメントに関して、ARM 呼び出し標準は Thumb と同じです。( AAPCS Arm 呼び出し標準) を参照してください。命令セットは異なりますが、CPU レジスタ セットは異なります。

コメントで質問したいのですが、まだ十分なポイントがありません。それを念頭に置いて....

バイナリのビルドと実行は成功していますが、何らかのコール トレースをダンプしようとしていますか? 私の混乱は、「フレーム ポインター レジスターなし」ステートメントです。r13 はスタック フレーム ポインターです。ただし、フレームポインタの保存について言及していると思います。

しばらく経ちましたが、これらは私が使用したオプションだと思います

arm-none-eabi-gcc - -nostdlib -ggdb -mthumb -mcpu=cortex-m3 -mtpcs-frame -mtpcs-leaf-frame myfile.c

これは、linaro からダウンロードした gcc-arm-none にありました。 gdb は、Atmel SAM3X でこれらのオプションを使用してバックトレースを実行できました。Thumb ABI は ARM EABI と同じか、少なくとも objdump -D を介してアセンブラを見ているようです。

-fno-omit-frame-pointer が指定されている (または暗示されている) 場合、前のフレーム ポインターは r7 に格納されます。

void test2(int i) {}
void main() { test(0); 

-fomit-frame-pointer でコンパイル

00008000 <test2>:
    8000:   b082        sub   sp, #8
    8002:   9001        str   r0, [sp, #4]
    8004:   b002        add   sp, #8
    8006:   4770        bx lr

00008008 <main>:
    8008:   b508        push  {r3, lr}
    800a:   f04f 0000   mov.w r0, #0
    800e:   f7ff fff7   bl 8000 <test2>
    8012:   bd08        pop   {r3, pc}

-fno-omit-frame-pointer でコンパイル

00008000 <test2>:
    8000:   b480        push  {r7}
    8002:   b083        sub   sp, #12
    8004:   af00        add   r7, sp, #0
    8006:   6078        str   r0, [r7, #4]
    8008:   f107 070c   add.w r7, r7, #12
    800c:   46bd        mov   sp, r7
    800e:   bc80        pop   {r7}
    8010:   4770        bx lr
    8012:   bf00        nop

00008014 <main>:
    8014:   b580        push  {r7, lr}
    8016:   af00        add   r7, sp, #0
    8018:   f04f 0000   mov.w r0, #0
    801c:   f7ff fff0   bl 8000 <test2>
    8020:   bd80        pop   {r7, pc}
    8022:   bf00        nop

したがって、r7 を使用して前のスタック フレームに移動し、その場所から次の r7 を取得します。

于 2013-10-28T20:26:34.957 に答える