PIC32: relocation truncated to fit: R_MIPS_GPREL16

Gast #6239726
Lesenswert?
• ▲
▼
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 #6239737
Lesenswert?
• ▲
▼
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 #6239815
Lesenswert?
• ▲
▼
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 #6239827
Lesenswert?
• ▲
▼
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

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.