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

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

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

提前致谢.

最佳答案 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编译

000
   
  

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

<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编译

000
   
  

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

<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,依此类推.

点赞