ARM GCC literal pool needs to be closer

Gast #548876
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
#551692
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.
#551742
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
Gast #567105
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

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.