ARM:没有帧指针的调用堆栈生成

时间:2013-10-28 19:05:36

标签: c arm stack-trace eabi

我正在尝试在Cortex-M3处理器(ARMv7-M架构)上构建调用堆栈,而不是OS(裸机)。但是,此ABI没有帧指针寄存器。因此,当我没有帧指针时,我正在努力生成调用堆栈。

无论在GCC中使用-mapcs-frame-fno-omit-frame-pointer-O0选项,都不会保留帧指针。我想知道是否有不同的ABI我可以强制GCC使用所以我有一个帧指针/堆栈帧?如果没有,是否有其他可靠的生成调用堆栈的方法?

提前致谢。

1 个答案:

答案 0 :(得分:2)

BTW上面的注释,ARM调用标准与Thumb相同,请参阅(AAPCS Arm calling standard)指令集不同但是CPU寄存器集不是。

我更愿意在评论中提问,但到目前为止我还没有足够的分数。 考虑到这一点....

您是否已成功构建并执行二进制文件,但是您尝试转储某种调用跟踪?我的困惑是'无帧指针寄存器'语句 - r13是堆栈帧指针。我认为你指的是存储帧指针。

已经有一段时间但我认为这些是我使用的选项

  

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

这是gcc-arm-none downloaded from linaro. 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,依此类推。