Xtensa ---危险的重新定位:窗口长呼叫跨越1GB边界

时间:2015-06-25 12:02:23

标签: relocation

我在编译期间遇到以下错误

  

(。sram.text + 0x1283):危险的重定位:加窗的longcall十字架   1GB边界; return可能会失败:( UND + 0xdeadcafe)

其中一个功能。

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

请告诉我此错误的原因以及任何可能的解决方案。

谢谢和问候, 哈里

1 个答案:

答案 0 :(得分:0)

这是默认的Xtensa窗口寄存器ABI的一个已知警告。引用Xtensa ISA reference manual

  

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

您有两种方法可以解决此问题:

  1. 您可以尝试调整代码的加载基地址和/或将其缩小(!),直到它适合1GB区域进行修复。
  2. 如果这不起作用或者不是一个选项,则必须使用支持替代CALL0 ABI的编译器重新编译在Xtensa系统上运行的所有,该处理器处理寄存器文件为'平',从而避免了违规的窗口调用和返回指令。