链接器错误-Xtensa——危险的重新定位:窗口长调用跨越1GB边界



我在编译时遇到以下错误

(.sram.text+0x1283):危险的重新定位:带窗口的长呼叫交叉1GB边界;返回可能失败:(UND+0kdadcafe)

在其中一个函数中。

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

请让我知道这个错误的原因和任何可能的解决方案。

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

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

你有两个选项来解决这个问题:

  1. 您可以尝试调整代码的加载基地址和/或将其缩小(!),直到它适合1GB的区域来修复它
  2. 如果这不起作用或不是一个选项,您将不得不使用支持替代CALL0 ABI的编译器重新编译Xtensa系统上运行的所有,该编译器将寄存器文件视为"平面",从而避免出现有问题的窗口调用和返回指令

在PlatformIO上为ESP32开发时遇到了同样的错误,我找到的解决方案是将optimatazion标志从-Os更改为-O3

[env:esp32dev]
build_unflags = -Os
build_flags = -O3

相关内容

  • 没有找到相关文章

最新更新