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