Forum: Mikrocontroller und Digitale Elektronik PIC32: relocation truncated to fit: R_MIPS_GPREL16


von Mike (Gast)


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};

von c-hater (Gast)


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

von PIClig (Gast)


Lesenswert?

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

von Mike (Gast)


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?

von PIClig (Gast)


Lesenswert?

> Wie kann ich die small-section vergrößern?

Tipp: Das fuehrt nicht zum Ziel.
Warum tust du nicht was ich geraten habe?

von Mike (Gast)


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.

von Mike (Gast)


Lesenswert?

PIClig schrieb:
> Warum tust du nicht was ich geraten habe?

Verzeihung, ich war leider zu langsam beim Lesen.

von PIClig (Gast)


Lesenswert?

> Danke für den Tipp

Na also, geht doch.

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.