MIPS Global Pointer Linker error

OP (Firma: fritzler-avr.de) #4798065
Lesenswert?
• ▲
▼
Hallo,
der Globalpointer bei MIPS zeigt auf den Speicherbereich für "kleinere 
Variablen" zum schnelleren Zugriff aus jeder Funktion des Programms 
heraus.
Diese Variablen landen in den Sections .sdata und .sbss
Da diese Variablen mit loadword gelesen werden, darf dieser Speicher 
nicht größer als 64k sein.

Bisher hat alles funktioniert, bis ich ein 32kByte großes Array angelegt 
habe. Dieses landet laut mapfile aber komplett richtig im .bss

Aber trotzdem habe ich nun diesen Fehler beim compilen:
1
ld: small-data section exceeds 64KB; lower small-data size limit (see option -G)
Danach fliegt mir dann alles um die Ohren:
1
libnosys.a(sbrk.o): In function `sbrk':
2
sbrk.c:14:(.text+0x20): relocation truncated to fit: R_MIPS_GPREL16 against `end'
3
collect2: Fehler: ld gab 1 als Ende-Status zurück

Kann mir mal wer erklären wieso mir der Global Pointer / die small data 
Section um die Ohren fliegt wenn das große Array aber im .bss und NICHT 
.sbss platziert wurde?

.sbss und .sdata sind auch nicht zu groß mit 384Byte und 2020Byte.

Im Anhang noch Linkerscript und mapfile.
Das große Array ist in linpack.o vorhanden.

Die Erklärung des Linkerscripts:
http://www.fritzler-avr.de/spaceage2/soft_start.php


Hat da wer ne Idee was da Amok läuft?
Angehängte Dateien:
Persönliche Seite #4798252
Lesenswert?
• ▲
▼
Evtl. sind Module, die externe Referenzen enthalten, mit einem größeren 
-G übersetzt bzw. überhaupt mit -G.  D.h. es wird davon ausgegangen, 
dass bestimmte Objekte small adressierbar sind.  Wenn die entsprechenden 
Objekte dann aber anders angelegt werden als erwartet (z.B. das, was 
sbrk.c referenziert) dann passt das nicht (mehr).  Jedenfalls liegt 
zwischen end und .sbss immerhin noch .bss.

Und linkerscript.lds sieht auch ziemlich hausbacken aus...
OP (Firma: fritzler-avr.de) #4798513
Lesenswert?
• ▲
▼
Das Linkerscript ist 100% Handmade, weil eigenbau CPU.

Die erste Fehlermeldung ist wohl irreführend, das Label "end" muss wohl 
auch per Global Pointer erreichbar sein.
Warum auch immer?! Hab ich jetzt nur durch ausprobieren rausgefunden.
Wenn jetzt natürlich zwischen dem Linkerscript Label _gp und _end die 
.sbss und die große .bss liegt dann wird as natürlich nichts.

Habe die .bss Section verschoben und schon gehts wieder.

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.