我有一些为未知版本的GCC生成的AVR程序集。我可以将这个源组装成目标代码,但如果我尝试链接它,我会被告知它包含未定义的符号。
具体来说,我缺少以下符号:
__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的智慧能够解开我的神秘。
为清楚起见,这里是一个简单的汇编文件示例,它将无问题地汇编但链接失败:
.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版本,是否有符合相同调用约定并执行相同任务的替代品?
答案 0 :(得分:2)
库函数__udivqi3
已于2001-01-20从libgcc中删除。您需要找到该日期之前发布的GCC版本,例如GCC 2.95.2。您正在使用的大多数函数都被一个将除法和模数组合到同一个操作中的函数所取代,因此另一种方法是重写函数来调用这些例程。例如,而不是调用__udivqi3
来电__udivmodqi4
。请注意,这些新功能不会替换掉。
我不确定__lshrsi3
和__ashlsi3
何时成为libgcc的一部分。如有必要,为这些功能推出自己的替代品应该不会太难。