PIC32: relocation truncated to fit: R_MIPS_GPREL16

Gast #6239726
Hallo,
ich programmiere gerade ein Grafikanwendungen auf einem PIC32MX460. Ich 
verwende dazu die -zugegebnermassen schon recht betagte - Microchip 
Graphics Object Library. Compiler ist der XC32. Fonts werden hier als 
großes Konstantenarray im ROM abgelegt. Mit dem Default-Font 
funktioniert alles prima. Sobald ich einen zusätzlichen Font einbinden 
will, erhalte ich die folgende Fehlermeldung des Linkers:

relocation truncated to fit: R_MIPS_GPREL16 against `Courier'

Der Fehler taucht an der Stelle auf, wo auf das Font-Array zugegriffen 
wird:
1
 SetFont(&Courier);

Interessanterweise funktioniert es, wenn ich den Defaultfont aus dem 
Projekt lösche und durch "Courier" ersetze.

Irgendwie scheint es so, als ob mit einer 16-bit-Addresse auf das Array 
zugegriffen wird. Dafür spricht, dass der Fehler nur auftritt, wenn das 
Array die ersten 64 kB des Flash-Speichers überschreitet. Wie kann das 
sein, der PIC32 ist doch ein 32bit-Controller und Pointer sollte doch 
eigentlich 32 bit lang sein?
Wer kennt sich mit dem XC32 aus und kann mir helfen?
1
extern const char L8232[] __attribute__((aligned(2)));
2
//FONT NAME CAN BE CHANGED HERE.
3
const FONT_FLASH Courier = {0,L8232};
4
//const FONT_FLASH GOLFontDefault = {0,L8232};
5
const char L8232[] __attribute__((aligned(2))) = {...lange Liste von Hex-Zahlen};
Gast
Mike schrieb:

> Fonts werden hier als
> großes Konstantenarray im ROM abgelegt. Mit dem Default-Font
> funktioniert alles prima. Sobald ich einen zusätzlichen Font einbinden
> will, erhalte ich die folgende Fehlermeldung des Linkers:
>
> relocation truncated to fit: R_MIPS_GPREL16 against `Courier'
>
> Der Fehler taucht an der Stelle auf, wo auf das Font-Array zugegriffen
> wird:
>
>
1
 SetFont(&Courier);
>
> Interessanterweise funktioniert es, wenn ich den Defaultfont aus dem
> Projekt lösche und durch "Courier" ersetze.

Ich tippe auf einen C&P-Fehler...
Gast
> Ich tippe auf einen C&P-Fehler...

Ne.
Der Fehler laesst sich recht einfach beheben.
Versuch mal die Kompileroption: -G2.
Wenn das noch nicht hilft: -G1.
Usw. Usf.
Gast
Ich habe mir den Linker-Output noch mal genauer angeschaut, dort steht 
eine weitere Meldung:

"small-data section exceeds 64KB; lower small-data size limit (see 
option -G)"

Klingt irgendwie nach segmentiertem Speichermodell. Sollte es doch bei 
32-bit-Prozessoren nicht mehr geben. Wie kann ich die small-section 
vergrößern?
Gast
PIClig schrieb:
> Der Fehler laesst sich recht einfach beheben.
> Versuch mal die Kompileroption: -G2.
> Wenn das noch nicht hilft: -G1.
> Usw. Usf.

Danke für den Tipp, -G4 hat auch schon funktioniert.
In der Dokumentation des gcc fand ich die Erklärung: Der PIC32 verfügt 
als MIPS-Controller über schnelle Speicherzugriffbefehle, die jedoch nur 
einen Bereich von 64kB abdecken. Der Linker versucht, alle Daten 
innerhalb dieses Bereichs unterzubringen, was er angesichts der Größe 
der Font-Arrays nicht mehr geschafft hat. Die -Gx Option speichert nur 
Variablen, die maximal x Bytes lang sind, in deisem Bereich.

Normalerweise ist wohl -G4 voreingestellt,anscheinend nicht beim XC32. 
Das muss man erst einmal wissen, zumal sich die Dokumentation des XC32 
sich über dieses Feature leider ausschweigt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.