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?