У меня есть сборка AVR, созданная для неизвестной версии GCC. Я могу собрать этот исходный код в объектный код, но если я попытаюсь связать его, мне сообщат, что он содержит неопределенные символы.
В частности, мне не хватает следующих символов:
__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
Вот 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, которая когда-либо содержала эти символы, есть ли для них вставные замены, которые следовали бы тому же соглашению о вызовах и выполняли бы те же задачи?