2013-12-07 50 views
3

我是這個社區的新手,因爲我從未創建過帳戶並提出過問題,但我一直都在使用本網站來解決我的編程問題。所以謝謝!不過,這次我找不到符合我確切需求的另一個問題。如果這是重複,我表示歉意。AVR:Relocation truncated to fit

我在基本操作系統0.2(盧娜),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。 但我試過這個無濟於事。

非常感謝大家。我很感謝這個社區的幫助。

+0

這將有助於http://stackoverflow.com/questions/10486116/what-does-this-gcc-error-relocation-truncated-to-fit-mean ?? ?? – alkis

+0

潛在的令人討厭的浮點輔助函數。也許你的芯片內存太少了? – 2013-12-07 22:40:42

+0

甚至這個http://stackoverflow.com/questions/8188849/avr-linker-error-relocation-truncated-to-fit ?? – alkis

回答

2

請參閱this瞭解有關重新定位到適合的錯誤的討論。我從來沒有使用avr,但從重定位類型r_avr_13_pcrel,我猜想這意味着你的指令有一個13位地址相對於程序計數器。 這意味着數據(大概是你正在調用登錄)不能超過日誌代碼的13位。 13位只有8192字節。
所以,你試圖採取的地址是遠離它的使用說明超過8 kb的地方。不幸的是,有問題的指令是在libm中,而不是你的代碼,所以修復可能會更棘手。 此外,請注意,由於它與PC相對,因此您可能只有4096個字節,因爲您有一個符號位,因此您可以在地址前後引用位置。

所以,這可能與您的可執行文件的代碼大小有關。