Fehler beim Linken : relocation truncated

OP #1802903
Lesenswert?

Hallo,

schreibe einen Bootloader fuer den at90usb1287. Die Interruptvektoren 
linke ich an Adresse 0x0000. Den restlichen Code (.text) moechte ich an 
die Adresse 0xf000 linken.

Allerdings erhalte ich die Fehlermeldung:
int.o:(.vectors+0x0): relocation truncated to fit: R_AVR_13_PCREL 
against `no symbol'

zurueck.

Linke ich die .text section unterhalb 0x0ff4, geht alles gut. Erst wenn 
ich die section an eine hoehere Adresse linke, tritt dieser Fehler auf.

Weiss jemand Rat? Oder hat jemand eine Idee den Fehler zu finden?

Vielen Dank

Martin
Gast #1802953
Lesenswert?

Hallo,

genau den hatte ich gestern. In meinem Fall fehlte ein -lm im 
Linkerbefehl und schon
war der Fisch geputzt. Hast Du alle von Dir benutzen Bibliotheken im 
Makefile (oder wo auch immer Du das in deiner Entwicklungsumgebung 
machst)??

Beste Grüße

Alfred
OP #1802995
Lesenswert?

Hallo,

den vorhandenen Beitrag habe ich schon gesehen. Habe auch im Makefile 
die Mathe-Bibliothek hinzugelinkt mit -lm. Genutzt hat es nichts. Ich 
sehe auch die Notwendigkeit nicht ein, da ein Linken im unteren 
Adressbereich ja funktioniert.

Ich liefere hier mein Linkerskript:

MEMORY
{
  vec         (rx)      : ORIGIN = 0x0000, LENGTH = 0x008e
  text        (rx)      : ORIGIN = 0xf000, LENGTH = 0x0fff
  data        (rw!x)    : ORIGIN = 0x800060, LENGTH = 0xffa0
  eeprom      (rw!x)    : ORIGIN = 0x810000, LENGTH = 64K
  fuse        (rw!x)    : ORIGIN = 0x820000, LENGTH = 1K
  lock        (rw!x)    : ORIGIN = 0x830000, LENGTH = 1K
  signature   (rw!x)    : ORIGIN = 0x840000, LENGTH = 1K
}

SECTIONS
{
  .vec :
  {
    int.o(.vectors)
  } > vec
  .text :
  {
     int.o(.isr) *(.text) *(.init4) *(.text.avr-libc) *(.fini0)
  } > text
  .data : AT (ADDR (.text) + SIZEOF (.text))
  {
    PROVIDE (__data_start = .);
    PROVIDE (__data_load_start = .);
    *(.data)
    PROVIDE (__data_end = .);
    PROVIDE (__data_load_end = .);
  } > data
  .bss : AT (ADDR (.data) + SIZEOF (.data))
  {
    PROVIDE (__bss_start = .);
    *(.bss)
    PROVIDE (__bss_end = .);
    PROVIDE (__heap_start = .);
    PROVIDE (__heap_end = .);
    RAMEND = 0x20ff;
    __stack = RAMEND;
   } > data
}

Vielen Dank.

Gruss Martin
OP #1803016
Lesenswert?

Hallo,

habe die ISR durch einen rjmp aus den Interrupt Vektoren angesprungen. 
Das war wohl die Ursache fuer den Fehler.

Jetzt verwende ich einen normalen jmp und alles ist in Ordnung.

Aus der Zusammenfassung der Instruktionen wird mir die Ursache 
allerdings nicht ersichtlich.

rjmp: PC <- PC + k + 1
jmp : PC <- k

Ich kann da keine Restriktionen fuer den relativen Sprung erkennen.

Kann mir das jemand erklaeren?

Vielen Dank fuer den Tipp.

Viele Gruesse

Martin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren