AVR libgcc 中缺少数学符号

Math symbols missing from AVR libgcc

我有一些为未知版本的 GCC 生成的 AVR 程序集。我可以将此源 assemble 转换为目标代码,但如果我尝试 link 它,我会被告知它包含未定义的符号。

具体来说,我缺少以下符号:

__lshrsi3, __ashlsi3, 
__divsi3, __divhi3, __divqi3, __modsi3, __modhi3, __modqi3, 
__udivsi3, __udivhi3, __udivqi3, __umodsi3, __umodhi3, __umodqi3

这些似乎是 libgcc 符号,但对于我的 AVR-GCC (4.8.3) 版本,libgcc.a 中没有它们。我在这些文件上验证了这个 运行 nm 并且没有定义这些名称的符号。

我无法确定这些符号出现在哪个版本的 AVR-GCC 中(如果有的话),或者它们是否由另一个库提供。其他搜索都无果,所以现在我希望SO的智慧能够解开我的谜团。

为清楚起见,这里是一个简单的程序集文件示例,它将 assemble 没有问题但失败 linking:

    .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

尝试 link 失败并出现以下错误:

/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 版本,是否有它们的替代品可以遵循相同的调用约定并执行相同的任务?

库函数 __udivqi3 已于 2001 年 1 月 20 日从 libgcc 中删除。您需要找到在该日期之前发布的 GCC 版本,例如 GCC 2.95.2。您正在使用的大多数函数已被将除法和模数组合到同一操作中的函数所取代,因此替代方法是重写函数以调用这些例程。例如,不是调用 __udivqi3,而是调用 __udivmodqi4。请注意,这些新功能不会被替换掉。

我不确定 __lshrsi3__ashlsi3 何时成为 libgcc 的一部分。如有必要,为这些功能推出自己的替代品应该不会太难。