"неопределенная ссылка на _spill": что такое _spill и почему gcc хочет получить к нему доступ?
Я занимаюсь разработкой на собственной встроенной платформе с пользовательской версией gcc, основанной на gcc-2.8.0 (egcs-2.91.02)
, Да, он старый. Это для ядра CoolRISC C816.
Иногда я сталкиваюсь со странной ошибкой, когда во время ссылки моего встроенного C-проекта gcc выдает мне эту ошибку:
неопределенная ссылка на _spill
Действительно, при просмотре временного файла *.s, сгенерированного gcc при компиляции исходных файлов в этих конкретных случаях, я вижу такую инструкцию:
MOVE __spill + 4,% a
Я удивлен, потому что эта ошибка _spill происходит только время от времени, на нескольких больших проектах (20k+ LOC) нет никаких признаков этой ошибки, и нет никаких ссылок на _spill в файлах *.s.
У меня уже есть исправление, состоящее в выделении _spill в моем файле начальной сборки, но я хотел бы узнать больше об этом.
Что такое "_spill" и зачем оно мне? Кроме того, если мне нужно статически выделить его, как узнать, какой размер я должен дать?
Изменить: Как советовали в комментариях, я посмотрел на соответствующий код C и строка, которая кажется источником пакета инструкций, содержащих _spill, это:
pStruct->psConst->puRegister[CONST_VALUE] = 0x00;
куда pStruct
это указатель на структуру typedef (называемую Foo), объявленную локально так: Foo *pStruct = &MyStruct
, с MyStruct
внешняя переменная типа Foo
это в другом файле. psConst
является константным указателем на другую структуру typedef (назовите ее Bar). puRegister
является членом Бар объявлен типа volatile uint8_t *
И наконец, CONST_VALUE
является постоянным значением из перечисления.
Следовательно, это может быть проблемой, которая возникает только тогда, когда имеется много разыменований в строке или что-то связанное.