我提到 ARM 工具链可以生成不同的函数序言。实际上,我看到两个 obj 文件(vmlinux)具有完全不同的函数序言:
第一种情况如下所示:
push {some registers maybe, fp, lr} (lr ommited in leaf function)
第二种情况如下所示:
push {some registers maybe, fp, sp, lr, pc} (i can confuse the order)
所以我看到第二个额外推动了 pc 和 sp。另外,我在崩溃实用程序(kdump 项目)中看到了一些评论,其中指出,内核堆栈帧应该具有格式 {..., fp, sp, lr, pc} 这让我更加困惑,因为我发现在某些情况下它不是真的。
1.) 我关于在函数序言中额外推送 pc 和 sp 需要一些 gcc 额外标志的说法正确吗?如果是的话,它们是什么?
2.) 这是做什么用的?基本上,据我所知,我只能使用 FP 和 LR 来展开堆栈,为什么我需要这个附加值?
3.)如果这件事与编译标志无关 - 我如何强制生成此扩展函数序言,目的是什么?
谢谢。