1

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

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

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

4

1 回答 1

2

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

我不确定何时(如果有的话)是 libgcc__lshrsi3__ashlsi3一部分。如有必要,为这些功能推出自己的替代品应该不会太难。

于 2015-03-24T05:18:46.053 回答