2

我正在使用自定义版本的 gcc 开发自定义嵌入式平台,该版本基于gcc-2.8.0 (egcs-2.91.02). 是的,它很旧。它适用于 CoolRISC C816 内核。

我有时会遇到一个奇怪的错误,在我的嵌入式 C 项目 gcc 的链接期间给我这个错误:

未定义的 _spill 引用

实际上,在这些特定情况下编译源文件时查看 gcc 生成的临时 *.s 文件时,我看到了这种指令:

移动 __spill+4,%a

我很惊讶,因为这个 _spill 错误只偶尔发生一次,在多个大型项目(20k+ LOC)上没有这个错误的迹象,也没有在 *.s 文件中对 _spill 的任何引用。

我已经有一个修复程序,包括在我的启动程序集文件中分配 _spill,但我想了解更多关于此的信息。

什么是“_spill”,我为什么需要它?另外,如果我必须静态分配它,如何知道我应该给它哪个大小?

编辑:按照评论中的建议,我查看了相应的 C 代码,并且似乎包含“_spill”的指令包的来源是这一行:

pStruct->psConst->puRegister[CONST_VALUE] = 0x00;

pStruct本地声明的 typedef 结构(称为 Foo)上的指针在哪里: Foo *pStruct = &MyStruct,其MyStruct类型为 extern 变量,Foo位于另一个文件中。 psConst是另一个 typedef 结构(称为 Bar)上的 const 指针。 puRegister是 Bar 声明类型的成员volatile uint8_t * 最后,CONST_VALUE是来自枚举的常量值。

因此,这可能是一个问题,仅在连续大量取消引用或相关内容时才会发生。

4

0 回答 0