AVR: Релокация усечена, чтобы соответствовать

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

У меня 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. Но я пробовал это безрезультатно.

Всем большое спасибо. Я ценю помощь этого сообщества.


person kofdog    schedule 07.12.2013    source источник
comment
Поможет ли это stackoverflow.com/questions/10486116/ ??   -  person Alkis Kalogeris    schedule 08.12.2013
comment
Потенциально неприятные вспомогательные функции с плавающей запятой. Может быть, у вас слишком мало оперативной памяти на вашем чипе?   -  person    schedule 08.12.2013
comment
Или даже этот stackoverflow.com/ вопросы/8188849/??   -  person Alkis Kalogeris    schedule 08.12.2013


Ответы (1)


См. это для обсуждения ошибки relocated to fit. . Я никогда не работал с avr, но по типу релокации r_avr_13_pcrel я предполагаю, что это означает, что ваша инструкция имеет 13-битный адрес относительно программного счетчика. Это означает, что данные (предположительно, которые вы вызываете для входа в систему) должны отличаться от кода журнала не более чем на 13 бит. 13 бит — это всего 8192 байта.
Итак, то, что вы пытаетесь получить, находится на расстоянии более 8 КБ от инструкции, в которой оно используется. К сожалению, рассматриваемая инструкция находится в libm, а не в вашем коде, поэтому исправить ее может быть сложнее. Кроме того, обратите внимание, что, поскольку это относится к ПК, у вас, вероятно, всего 4096 байт, потому что у вас есть знаковый бит, поэтому вы можете ссылаться на местоположения как до, так и после адреса.

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

person Sam Hartman    schedule 07.12.2013