2015-03-24 3 views
1

У меня есть сборка 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, которая когда-либо содержала эти символы, есть падение в заменах для них, которые будут следовать за то же соглашением о вызовах и выполняют те же задачи?

+0

Вы пытались явно связать в maths lib с -lm? – user268396

+0

@ user268396 Я попробовал просто добавить -lm к вызову avr-gcc, если это то, что вы имеете в виду. Это не разрешило символы. – seanmk

ответ

2

Функция библиотеки __udivqi3 была удалена с пути libgcc назад 2001-01-20. Вам нужно будет найти версию GCC, выпущенную до этой даты, например GCC 2.95.2. Большинство функций, которые вы используете, были заменены функцией, которая объединяла деление и модуль в одну и ту же операцию, поэтому альтернативой было бы переписать функции для вызова этих подпрограмм. Например, вместо звонка __udivqi3 звоните __udivmodqi4. Обратите внимание, что эти новые функции не заменяются.

Я не уверен, когда __lshrsi3 и __ashlsi3 были частью libgcc. При необходимости не стоит слишком сильно откачивать свои собственные замены для этих функций.

Смежные вопросы