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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.