У меня есть сборка AVR, которая была создана для неизвестной версии GCC. Я могу собрать этот источник в объектный код, но если я попытаюсь связать его, мне сказали, что он содержит неопределенные символы.Математические символы отсутствуют в AVR libgcc
В частности, я отсутствую следующие символы:
__lshrsi3, __ashlsi3,
__divsi3, __divhi3, __divqi3, __modsi3, __modhi3, __modqi3,
__udivsi3, __udivhi3, __udivqi3, __umodsi3, __umodhi3, __umodqi3
Они кажется libgcc символов, но они не присутствуют в libgcc.a
для моей версии AVR-GCC (4.8.3). Я проверил этот запуск nm
на этих файлах и не было символов с указанными именами.
Мне не удалось определить, в каких версиях AVR-GCC эти символы присутствовали, если они вообще были, или если они были предоставлены другой библиотекой. Другие поиски оказались бесплодными, поэтому теперь я надеюсь, что мудрость SO сможет решить мою тайну.
Для ясности здесь тривиальный пример файла сборки, который будет собираться без проблем, но терпит неудачу связь:
.text
.globl main
.align 2
.type main,@function
main: ; @main
; BB#0:
ldi r24, 31
ldi r22, 31
call __udivqi3
ret
.Ltmp1:
.size main, .Ltmp1-main
Попытка связать это терпит неудачу со следующей ошибкой:
/tmp/ccxYMfat.o:udiv.s:9: undefined reference to `__udivqi3'
collect2: error: ld returned 1 exit status
Вот the libgcc Я использую:
$ avr-gcc -print-libgcc-file-name
/usr/lib/gcc/avr/4.8.3/libgcc.a
который не содержит символ __udivqi3
$ avr-nm /usr/lib/gcc/avr/4.8.3/avr6/libgcc.a |grep udivq
$
В качестве альтернативы, если не существует версия GCC, которая когда-либо содержала эти символы, есть падение в заменах для них, которые будут следовать за то же соглашением о вызовах и выполняют те же задачи?
Вы пытались явно связать в maths lib с -lm? – user268396
@ user268396 Я попробовал просто добавить -lm к вызову avr-gcc, если это то, что вы имеете в виду. Это не разрешило символы. – seanmk