c - 交叉编译时添加-O2选项导致展开回溯失败

标签 c arm cross-compiling libgcc

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

最佳答案

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

帧指针

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

省略帧指针

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

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

当然,如果fp用作通用寄存器,其内容是未定义的并且回溯将不起作用。

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

关于c - 交叉编译时添加-O2选项导致展开回溯失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59486236/

相关文章:

c - 将C代码转换为汇编语言

c - UNIX shell C 管道的执行

gcc - 为什么 GCC 交叉编译没有构建 `crti.o` ?

c++ - 使用 Maven NAR 插件对 ARM 进行交叉编译

在嵌入式设备上转换指针

C预处理器: Is there any way to expand the name of a macro inside itself

linux - 在 darwin for linux 上交叉编译 CGO 应用程序

mono - 为 MIPS 交叉编译 Mono 框架 3.0.6+

erlang - 尝试为ARM交叉编译Erlang R13B04时失败

c - 有循环的 Stty 错误,没有循环没有 stty 错误