我正在尝试在 Cortex-M3 处理器(ARMv7-M 架构)上构建调用堆栈,没有操作系统(裸机)。但是,该 ABI 没有帧指针寄存器。因此,当我没有帧指针时,我正在努力生成调用堆栈。
无论使用-mapcs-frame
,-fno-omit-frame-pointer
和-O0
GCC 选项,都不会保留帧指针。我想知道是否有不同的 ABI 我可以强制 GCC 使用所以我有一个帧指针/堆栈帧?如果没有,是否有其他可靠的方法来生成调用堆栈?
提前致谢。
我正在尝试在 Cortex-M3 处理器(ARMv7-M 架构)上构建调用堆栈,没有操作系统(裸机)。但是,该 ABI 没有帧指针寄存器。因此,当我没有帧指针时,我正在努力生成调用堆栈。
无论使用-mapcs-frame
,-fno-omit-frame-pointer
和-O0
GCC 选项,都不会保留帧指针。我想知道是否有不同的 ABI 我可以强制 GCC 使用所以我有一个帧指针/堆栈帧?如果没有,是否有其他可靠的方法来生成调用堆栈?
提前致谢。
顺便说一句,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,依此类推。