我在编译时遇到以下错误
(.sram.text+0x1283):危险的重新定位:带窗口的长呼叫交叉1GB边界;返回可能失败:(UND+0kdadcafe)
在其中一个函数中。
体系结构是Xtensa,使用的工具链是为Xtensa构建的GNU工具链。此错误位于binutils源代码中文件elf32-xtensa.c中的函数elf_xtensa_do_reloca()中。
请让我知道这个错误的原因和任何可能的解决方案。
这是默认Xtensa窗口寄存器ABI的一个已知警告。引用Xtensa ISA参考手册:
与返回地址寄存器一起存储在
a4
中的窗口增量占用寄存器的两个最高有效位,因此这些位必须由子程序返回来填充。RETW
和RETW.N
指令从两个最高有效位填充这些位他们自己地址的位。这样可以防止注册窗口调用用于调用地址空间的不同1GB区域中的例程。
你有两个选项来解决这个问题:
- 您可以尝试调整代码的加载基地址和/或将其缩小(!),直到它适合1GB的区域来修复它
- 如果这不起作用或不是一个选项,您将不得不使用支持替代CALL0 ABI的编译器重新编译Xtensa系统上运行的所有,该编译器将寄存器文件视为"平面",从而避免出现有问题的窗口调用和返回指令
在PlatformIO上为ESP32开发时遇到了同样的错误,我找到的解决方案是将optimatazion标志从-Os
更改为-O3
。
[env:esp32dev]
build_unflags = -Os
build_flags = -O3