c - AVR : Relocation truncated to fit

标签 c avr-gcc atmega relocation

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

我使用的是 elementary 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。 但我已经试过了,但无济于事。

非常感谢大家。我感谢这个社区的帮助。

最佳答案

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

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

关于c - AVR : Relocation truncated to fit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447573/

相关文章:

c - 反向字符串程序中的空字符是什么?

使用c中的结构进行复杂 vector 加法

c - 访问通过引用接收的结构体的成员

在C中将uint16_t十六进制数转换为十进制数

c++ - __FUNCTION__ 上的 PSTR()

c - 使用 MAX7219 启用 SPI 并创建数组

arduino - I2C 从发送器 NACK(又名可变长度回复)

c - 在 C 中传递字符串

c++ - 使用 SPI 从从机读取

arduino - 无法在 OS X 中编译和链接 AVR 程序