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