我有一些AVR组件,是为一个未知版本的GCC而产生的。我可以将这个源代码组装成目标代码,但是如果我试图链接它,我会被告知它包含未定义的符号。
具体来说,我遗漏了以下符号:
__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曾经包含这些符号,是否会有替代他们将遵循相同的召唤惯例,并执行同样的任务?
发布于 2015-03-24 05:18:46
库函数__udivqi3在2001-01-20年间从libgcc中删除.你需要在那个日期之前找到GCC的版本,比如GCC 2.95.2。您所使用的大多数函数都被一个将除法和模数组合成相同操作的函数所取代,因此另一种方法是重写函数来调用这些例程。例如,不要调用__udivqi3调用__udivmodqi4。请注意,这些新函数并没有减少替换。
我不确定,如果有的话,__lshrsi3和__ashlsi3何时是libgcc的一部分。如果需要的话,使用自己的替换函数应该不会太难。
https://stackoverflow.com/questions/29222673
复制相似问题