Forum: Compiler & IDEs MIPS Global Pointer Linker error


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

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?

von Johann L. (gjlayde) Benutzerseite


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...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.