0

-funwind-tables交叉编译时添加,可以通过_Unwind_Backtrace and _Unwind_VRS_Getlibgcc库中的interface()成功展开回溯。但是当我在交叉编译时添加 -O2 选项时,展开回溯会失败。我通过-Q -O2 --help=optimizers打印出来优化和测试,但是结果和-O2不一样,很奇怪,

4

1 回答 1

0

您还没有告诉我们您正在为哪种 ARM 架构构建 - 但假设它是 32 位架构,启用-O2也已启用-fomit-frame-pointer-fomit-frame-pointer)

帧指针

帧指针包含当前函数的堆栈帧的基础(并且知道调用者的帧指针存储在堆栈中,调用树中所有堆栈帧的链表)。它通常fp在文档中描述 - 的同义词r11

省略帧指针

ARM 寄存器文件很小,只有 16 个寄存器 - 其中之一是程序计数器。帧指针是剩下的 15 个之一,仅用于调试和诊断——特别是提供堆栈回溯和符号调试。

-fomit-frame-pointer告诉编译器不要维护帧指针,从而将其释放r11用于其他用途,并可能避免变量从寄存器溢出到堆栈。它还为堆栈存储的每个堆栈帧以及堆栈的存储和加载节省了 4 个字节。

自然,如果fp用作通用寄存器,它的内容是未定义的,回走也不起作用。

-fno-omit-frame-pointer为了您自己的理智,您可能希望重新启用帧指针。

于 2019-12-26T15:36:40.313 回答