AVR:重定位被截断以适应

时间:2013-12-07 22:36:41

标签: c avr-gcc atmega relocation

我是这个社区的新手,因为我以前从未创建过帐户并提出过问题,但我一直使用这个网站来解决我的编程问题。所以谢谢!但这一次,我找不到符合我确切需求的其他问题。如果这是重复,我道歉。

我在基础OS 0.2(Luna),Ubuntu 12.04的衍生物。我正在使用avr-gcc库来编译ATmega32u4微处理器的程序。我开发它时已经多次编译了这个程序,但直到现在我还没有收到这个错误。我在下面粘贴它。

/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(log.o):../../../libm/fplib/log.S:100: relocation truncated to fit: R_AVR_13_PCREL against symbol `__addsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o)
/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/libc.a(modf.o):../../../libm/fplib/modf.S:90: relocation truncated to fit: R_AVR_13_PCREL against symbol `__subsf3' defined in .text section in /usr/lib/gcc/avr/4.5.3/avr5/libgcc.a(_addsub_sf.o)
collect2: ld returned 1 exit status
make: *** [main.elf] Error 1

简而言之,我不知道这是指什么。我的程序包含大量文件,所以我不能在这里发布完整的内容;相反,我会对以下问题的一般答案感兴趣:

  1. 什么是“重定位被截断以适应”错误?我已经读到它与访问距离太远的内存有关,但这在我的C程序中实际上是如何发生的?
  2. 什么是R_AVR_13_PCREL?它似乎是avr-gcc库固有的;我的程序的哪个方面可能会引用这样一个变量?
  3. 我所包含的唯一通用C头是math.h;其他文件都是我自己的。我知道math.h有一个时髦的标志,应放在Makefile中;我相信它是-lm。 但我试过这个无济于事。
  4. 非常感谢大家。我感谢这个社区的帮助。

1 个答案:

答案 0 :(得分:2)

有关重定位到适合错误的讨论,请参阅this。我从未使用过avr,但是从重定位类型r_avr_13_pcrel,我猜这意味着你的指令相对于程序计数器有一个13位的地址。 这意味着数据(可能是您正在调用登录)与日志代码的距离不超过13位。 13位仅为8192字节 所以,你试图获取地址的东西距离它使用的指令超过8 kb。不幸的是,有问题的指令是在libm内,而不是你的代码,所以修复它可能更棘手。 另请注意,由于它是PC相对的,因此您可能只有4096个字节,因为您有一个符号位,因此您可以在地址之前和之后引用位置。

因此,这可能与您的可执行文件的代码大小有关。