В чем причина невозможности деления чисел в GCC? - PullRequest
5 голосов
/ 05 июля 2011

У меня очень странная ситуация.Каждый раз, когда я пытаюсь скомпилировать свой проект arm (LPC2378, codeourcery arm-none-eabi-gcc-4.5.1), у меня остается одна и та же ошибка, когда я связываю

/media/data/Projects/arm/uart/main.c:39: undefined reference to `__aeabi_uidiv'
/media/data/Projects/arm/uart/main.c:40: undefined reference to `__aeabi_uidiv'

Код ошибки выглядит следующим образом:

U0DLL = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) % 256;
U0DLM = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) / 256;

Я искал и что это может быть вызвано, AFAICT, не используя параметры lgcc & lc для LD.Я исправил это, и все еще ошибка остается.

Полный проект может быть найден в моем репозитории github .

Если кто-нибудь сможет помочь, он будет очень принят.Приветствия.

Ответы [ 5 ]

10 голосов
/ 05 июля 2011

Семейство процессоров ARM не имеет встроенной инструкции деления целых чисел.Итак, деление должно быть реализовано библиотечной функцией.GCC знает об этом и создает ссылку на (в вашем случае) __aeabi_uidiv (для unsigned int деления).

Вам нужно будет связаться с соответствующей библиотекой поддержки времени выполнения, содержащей эту функцию.

2 голосов
/ 12 февраля 2013

Я столкнулся с этой проблемой и решил ее, передав правильное местоположение libgcc.a в Makefile.Возможно, вам придется добавить:

"-L*path_to_libgcc.a* -lgcc" 

к LDFLAGS

2 голосов
/ 05 июля 2011

Звучит как проблема с набором инструментов - возможно, ваш gcc создан для ARM EABI, но ваши библиотеки (libgcc?) Созданы для традиционного ABI?

0 голосов
/ 15 февраля 2013

Проверьте, находится ли ваш libgcc.a в каталоге Cossourcery, где он должен быть.У меня была та же проблема с TI Starterware, которая исправила путь к libgcc.a в одном из make-файлов.

0 голосов
/ 05 июля 2011

Я обычно избегаю делений, когда мне приходится их использовать, иногда я сталкиваюсь с этой проблемой.Источник (ассемблер) для этих функций деления находится в исходниках gcc, не слишком сложно извлечь этот код и просто связать его, когда gcc не сотрудничает.Когда у вас есть версия с удаленными макросами и т. Д., Чистый источник, вы можете просто носить ее с собой в заднем кармане.Погуглив одно время, я обнаружил, что было предложено использовать не linux eabi, но, как вы обнаружили, это не всегда работает, иногда, но не всегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...