Forum: Compiler & IDEs ld status -1 - werde aus Fehlermeldung nicht schlau


von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
bitte entschuldigt die merkwürdige Überschrift - aber ich habe keine 
bessere Beschreibung. Ich nutze Atmel Studio 6 und einen ATmega32.

Beim build habe ich eine Fehlermeldung des Linkers, die ich überhaupt 
nicht einordnen kann, alle vom Typ:

"C:\Users\Nicolas\Desktop\SVN\Funkenerodierer\AVR_FirmwareAS6\Pulsgenera 
tor04\default/.././edm.c:103:(.text+0x110):  relocation truncated to 
fit: R_AVR_13_PCREL against symbol `pwm_disable' defined in .text 
section in pwm.o"

und das ganze für recht viele Funktionen, die alle für sich problemlos 
funktionieren, d.h. keine Funktion lädt plötzlich eine neue Library. Hat 
jemand einen Anhaltspunkt für die Fehlersuche?

Viele Grüße
Nicolas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Die Objektmodule, für die der Linker das beanstandet, wurden laut
diesem Build-Log soeben nicht neu gebaut. Bist du dir sicher,
dass für deren Compilieren auch -mmcu=atmega32 gesetzt war?

von Walter T. (nicolas)


Lesenswert?

Hallo Jörg,
danke, daß Du Dir diesen Wust angesehen hast. Ich bin mir zumindest sehr 
sicher, daß das Objectfile noch nie für ein andere Target als den 
ATmega32 erzeugt worden ist. Aber Du hast Recht: Ich hätte besser das 
Log eines kompletten Rebuilds gezeigt.

Ich konnte den Fehler jetzt auf ein paar snprintf auf static 
uint8_t-Variablen in der Datei "edm.c" eingrenzen (Sprich: sind die 
auskommentiert, geht alles sichtbare so, wie ich es erwarte). Mir ist 
die Ursache noch etwas rätselhaft, aber ein Ansatz zur Behebung ist 
jetzt da.

Viele Grüße
Nicolas

von Konrad S. (maybee)


Lesenswert?

Beim Relozieren kann ein relativer Sprung nicht aufgelöst werden, weil 
da, wo die Relokation eingetragen werden soll, nur ein 13-Bit-Feld zu 
Verfügung steht, aber die Distanz größer als 13 Bit ist.

Siehe http://www.technovelty.org/c/relocation-truncated-to-fit-wtf.html

von Walter T. (nicolas)


Lesenswert?

Hallo Konrad,
Du meinst die Objekte liegen weiter als 8kB auseinander und der Linker 
schafft das nicht mehr, die Teile sinnvoll anzuordnen?

Die Größenordnung von 8kB für das Hex-File könnte tatsächlich so langsam 
erreicht werden (die genaue Größe kann ich momentan nicht prüfen) - ist 
das eine harte Grenze für irgendetwas und gibt es 
"Programmierrichtlinien über 8kB"?

Viele Grüße
Nicolas

P.S.: Nach dem Artikel scheint es ein Problem der Buildoptionen zu sein. 
Vielleicht '-mshort-calls'? Also wird der zweite Schritt die Suche in 
die Richtung sein.

von Walter T. (nicolas)


Lesenswert?

OK, bin durch Zufall gerade drauf gestoßen:

http://www.nongnu.org/avr-libc/user-manual/using_tools.html

> -mshort-calls
>
> Use rjmp/rcall (limited range) on >8K devices. On avr2 and avr4
> architectures (less than 8 KB or flash memory), this is always the case.
> On avr3 and avr5 architectures, calls and jumps to targets outside the
> current function will by default use jmp/call instructions that can cover
> the entire address range, but that require more flash ROM and execution
> time.

d.h. die Build-Optionen passen einfach nicht mehr, wenn der Flash >8kB 
benötigt wird. Komisch, daß Atmel Studio die Defaultoptionen so 
"gefährlich" setzt.

Bleibt die Frage: Kann ich den Build so ändern, daß kurze Sprünge immer 
reichen, z.B. große Lookuptables irgendwie in die Näher der sie 
aufrufenden Funktionen rücken?

Viele Grüße
Nicolas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nicolas S. schrieb:
> -mshort-calls >

Ach du Sch***.  Die war mir entgangen.

Diese Option hätte nie im GCC implementiert werden dürfen, und erst
recht nicht im AVR Studio den Nutzern zugänglich gemacht werden.

Auf einem Controller mit mehr als 8 KiB Flash müssen by default lange
Aufrufe benutzt werden (CALL statt RCALL).  Wenn überhaupt, kann
man dem Linker (mit -mrelax) es überlassen, daraus wieder kurze zu
machen, denn der weiß, wo die einzelnen Funktionen liegen. Andererseits
ist der Performancegewinn minimal, kann man also auch sein lassen.

lookup tables liegen ohnehin direkt bei den Funktionen, die sie
benötigen, aber das spielt keine große Rolle.

von Stefan E. (sternst)


Lesenswert?

Nicolas S. schrieb:
> Komisch, daß Atmel Studio die Defaultoptionen so
> "gefährlich" setzt.

Macht es nicht. Das hast du selber irgendwann mal 
angeklickt/eingetragen.

von Walter T. (nicolas)


Lesenswert?

Mag sein, daß es durch die Konvertierung von AVR-Studio 4 auf 
Atmel-Studio 6 (ich bin gerade dabei, ein 2 Jahre liegengebliebenes 
Projekt fortzuführen) irgendwie hineingekommen ist. Normalerweise halte 
ich mich mit dem Auswählen von Optionen, deren Zweck mir nicht völlig 
klar ist, sehr zurück und gehe davon aus, daß die Standardoptionen 
durchaus einen Sinn haben.

Naja, ganz ausschließen kann man es nie, in mehreren Jahren ein Häkchen 
womöglich angeklickt zu haben.

Also ist es vielleicht eine gute Idee, das Projekt unter AtmelStudio 6 
noch einmal neu aufzusetzen - wer weiß welche Settings sonst noch 
implizit übernommen wurden aus den Zeiten, wo es mal unter AVR Studio 4 
auf einem ATmega48 aufgesetzt wurde, und womöglich erst mit zunehmender 
Codegröße zum Vorschein kommen. Allein daß der Projektname, der an allen 
möglichen Stellen als Dateiname auftaucht nun wirklich überhaupt nichts 
mehr mit dem gegenwärtigen Entwicklungsziel zu tun hat nervt schon ein 
bischen.

Vielen Dank für die Unterstützung
Nicolas

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Nicolas S. schrieb:
>> -mshort-calls
>
> Diese Option hätte nie im GCC implementiert werden dürfen, [...]

Ab 4.8 ist wieder aus dem Compiler entfernt :-)

> On AVR, support has been removed for the command-line option
> -mshort-calls deprecated in GCC 4.7.

http://gcc.gnu.org/gcc-4.8/changes.html

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Ab 4.8 ist wieder aus dem Compiler entfernt :-)

Verbindlichsten Dank! ;-)

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.