2

在编译过程中出现以下错误

(.sram.text+0x1283):危险的重定位:窗口化的 longcall 跨越 1GB 边界;返回可能失败:( UND +0xdeadcafe)

在其中一个功能中。

架构是 Xtensa,使用的工具链是为 Xtensa 构建的 GNU 工具链。此错误位于 binutils 源代码中文件 elf32-xtensa.c 中的函数 elf_xtensa_do_reloc() 内。

请让我知道此错误的原因以及任何可能的解决方案。

4

1 回答 1

0

这是默认 Xtensa 窗口寄存器 ABI 的一个已知警告。引用Xtensa ISA 参考手册

与返回地址寄存器一起存储的窗口增量a4 占据了寄存器的两个最高有效位,因此这些位必须由子程序返回填充。和指令从它们自己地址的两个最高有效位中填充这些位RETWRETW.N这可以防止寄存器窗口调用被用于调用地址空间的不同 1GB 区域中的例程。

您有两种选择来解决此问题:

  1. 您可以尝试调整代码的加载基地址和/或使其更小(!),直到它适合 1GB 区域来修复它。
  2. 如果这不起作用或不是一个选项,则必须使用支持替代 CALL0 ABI 的编译器重新编译Xtensa 系统上运行的所有内容,该编译器将寄存器文件视为“平面”,从而避免违规窗口呼叫和返回指令。
于 2015-11-19T17:36:06.703 回答