Forum: Compiler & IDEs ARM GCC literal pool needs to be closer


von Microman (Gast)


Lesenswert?

Hallo,

bin gerade dabei Software für das AT91SAM9263EK-Board zu schreiben. Ich 
nutze den GNU-Compiler aus dem Yagarto-Paket mit Version:

binutils: 2.17
gcc:      4.1.1
newlib:   1.14.0
insight:  6.5.50.20060612

Dabei bekomme ich ab einer gewissen Projektgröße folgenden Error:

Assembler message: invalid literal constant: pool needs to be closer.

Wenn ich die Prokektgröße reduziere verschwindet der Fehler wieder.
Meine Frage ist ob jemand weiß was zu tun ist um dieses Problem zu 
lösen.

Über Vorschläge wäre ich super dankbar.

Beste Grüße

Microman

von Uhu U. (uhu)


Lesenswert?

Ich habe zwar nie was mit dem ARM gemacht, aber aus der Fehlermeldung 
und den von Dir beschriebenen Symptomen würde ich darauf tippen, daß mit 
PC-relativen Offsets gearbeitet wird und dieser Offset zu groß geworden 
ist.

Wenn z.B. ein Maschinenbefehl PC-relativ mit sagen wir 10 bit Offset 
arbeitet, dann kann die Zieladresse nur innerhalb von 4 K um den 
aktuellen Programmzähler liegen.

Da der Compiler nichts über die tatsächlichen Adressverhältnisse weiß, 
setzt er eine symbolische Adresse in den relativ adressierenden Befehl 
ein und der Assembler merkt dann, daß das garnicht geht.

Wie Du das Problem praktisch lösen kannst, weiß ich nicht, aber 
vielleicht kannst Du in den Manuals was zu diesem Thema finden, was 
weiter hilft.

von Peter D. (peda)


Lesenswert?

Der ARM versucht, Code zu sparen, indem Konstanten nicht im Befehl 
gespeichert werden, sonderen nur der Offset zur Konstanten. In der Regel 
werden dann diese Konstanten hinter der Funktion gespeichert.

Es könnte aber sein, daß Du ne Monsterfunktion mit riesen Spaghetticode 
hast und dann werden die 4k Offset überschritten.

Oder sie werden am Ende des Objekts abgelegt und das Objekt ist zu groß.

Aufteilen in mehrere Unterfunktion bzw. Objekte sollte helfen.


Peter

von Microman (Gast)


Lesenswert?

Danke für die Antworten,

habe jetzt eine Lösung für mein Problem gefunden, die ich nur mal 
schnell noch posten wollte. Vielleicht hilft sie ja jemandem weiter der 
auch das Problem hat. Mit der Option " -ffunction-sections " bei den 
CCFLAGS weist man den Compiler an den Pool für jede Funktion separat 
direkt hinter dieser anzulegen. Dabei darf dann eine einzelne Funktion 
nicht größer als 4k werden, da sonst der Offset zum Adressieren nicht 
mehr ausreicht.


Mfg

Microman

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.