2013-12-07 2 views
3

Я новичок в этом сообществе, поскольку я никогда раньше не создавал учетную запись и не задавал вопрос, но я постоянно использую этот сайт для решения моих проблем с программированием. Так что спасибо тебе! На этот раз, однако, я не мог найти другого вопроса, соответствующего моим конкретным потребностям. Если это повторение, прошу прощения.AVR: Перемещение усечено, чтобы соответствовать

Я нахожусь на элементарной ОС 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. Но я пробовал это безрезультатно.

спасибо, каждый. Я ценю помощь этого сообщества.

+0

Это поможет http://stackoverflow.com/questions/10486116/what-does-this-gcc-error-relocation-truncated-to-fit-mean ?? – alkis

+0

Потенциально неприятные вспомогательные функции с плавающей запятой. Может быть, у вас слишком мало ОЗУ на чипе? –

+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-relative, у вас, вероятно, всего 4096 байт, потому что у вас есть знаковый бит, чтобы вы могли ссылаться на места как до, так и после адреса.

Таким образом, это, вероятно, связано с размером кода вашего исполняемого файла.

Смежные вопросы