ATtiny85 : relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' ...

Magari è cosa nota, ma non mi sembra di aver visto informazioni in merito nella sezione Italiana ...

Questi giorni, giochicchiando con gli ATtiny85, a seconda del codice (... che veniva compilato correttamente per ATmega328 ...ed ovviamente era nei limiti di memoria dell'ATtiny), ricevevo alla fine della compilazione l'errore :

relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25/libgcc.a(_exit.o)

Facendo delle ricerche ho scoperto che il problema è dato da un buco presente nel linker che arriva con l'IDE di Arduino.
E' stato difatti sufficiente sostituire "ld" originale con quello più aggiornato che, per MAC, è disponibile all'interno del CrossPack per vedere completare la compilazione senza problemi.

In pratica, per sicurezza prima è meglio salvare il vecchio linker :

cp /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin/ld /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin/ld_save

e quindi prendere quello del CrossPack e copiarlo al posto del vecchio :

cp /usr/local/CrossPack-AVR/avr/bin/ld /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin/ld

Probabilmente, gli utenti Win e Linux possono recuperarlo dall'ultima ToolChain pre-compilata di Atmel ... ma NON ho verificato la cosa quindi ... tutto da provare !

Guglielmo

P.S. : Se la cosa era già stata risolta in altro modo, mi scuso per la duplicazione di informazioni e vi prego di segnalarmi DOVE, nella sezione Italiana, se ne era parlato :slight_smile:

Il problema è che ld appartiene al pacchetto binutils che cresce di release man mano che cresce di release il compilatore gcc e la avr-libc, usando ld di una versione precedente potrebbe portare a risultati inaspettati, mentre ci sono buone probrabilità che sia compatibile ld di una versione più recente.

Non ho indagato, ma mi pare che il linker trovi il simbolo "exit" nella libgcc.a più di una volta e normalmente dovrebbe risolvere senza dare errore, ricordo qualcosa del tipo: ora il nuovo linker non va in confusione quando trova due simboli e sa cosa fare.

Di questo errore nella sezione Italiana io non ricordo di averne visto alcun post.

Ciao.

MauroTec:
...
Non ho indagato, ma mi pare che il linker trovi il simbolo "exit" nella libgcc.a più di una volta e normalmente dovrebbe risolvere senza dare errore, ricordo qualcosa del tipo: ora il nuovo linker non va in confusione quando trova due simboli e sa cosa fare.
...

La cosa strana è che il problema appare in modo del tutto casuale quando il codice comincia a raggiungere i 4 KB (circa il 50% del disponibile sul ATtiny85).

Levi un'istruzione da una parte e scompare, ne metti un'altra da un'altra parte e riappare ... sembra senza una logica se non le dimensioni del codice da linkare ... :roll_eyes:

Probabilmente un subdolo buco di una vecchia versione di ld (... quella che arriva con l'IDE è la 2.19, quella con cui l'ho rimpiazzato è la 2.22, quella dell'ultima toolchain vedo che è la 2.23.1).

Interessante è anche il risultato delle emulazioni supportate ...

Originale (2-19) :
   avr2
   avr1
   avr25
   avr3
   avr31
   avr35
   avr4
   avr5
   avr51
   avr6
   avrxmega1
   avrxmega2
   avrxmega3
   avrxmega4
   avrxmega5
   avrxmega6
   avrxmega7

Quello che non mi da problemi (2.22) :
   avr2
   avr1
   avr25
   avr3
   avr31
   avr35
   avr4
   avr5
   avr51
   avr6
   avr7
   avrxmega1
   avrxmega2
   avrxmega3
   avrxmega4
   avrxmega5
   avrxmega6
   avrxmega7
   avrtiny10

Quello della ultima ToolChain (2.23.1) :
   avr2
   avr1
   avr25
   avr3
   avr31
   avr35
   avr4
   avr5
   avr51
   avr6
   avr7
   avrxmega1
   avrxmega2
   avrxmega3
   avrxmega4
   avrxmega5
   avrxmega6
   avrxmega7
   avrtiny

... voglio fare delle prove anche con l'ultimo (2.23.1) e vedere se ci sono altri cambiamenti :wink:

Guglielmo

x iscrizione

Sembra un bug noto ma, fortunatamente, anche già risolto:

http://forum.arduino.cc/index.php?topic=91491.0

leo72:
Sembra un bug noto ma, fortunatamente, anche già risolto:
...

Si Leo, difatti scrivevo :

gpb01:
Facendo delle ricerche ho scoperto che il problema è dato da un buco presente nel linker che arriva con l'IDE di Arduino.

... solo che NON avevo trovato nessuna indicazione per gli utenti del forum Italiano mentre avevo trovato da altre parti le indicazioni per una possibile soluzione (... ma non avevo trovato quelli che indichi XD) ... eppure c'è parecchia gente anche qui che si diverte con gli ATtiny ... :slight_smile:

Guglielmo

Leggendo in uno dei 2 link parrebbe un bug presente solo su Mac, forse chi ha "giocato" con i Tiny qui ha Windows/Linux.

leo72:
Leggendo in uno dei 2 link parrebbe un bug presente solo su Mac, forse chi ha "giocato" con i Tiny qui ha Windows/Linux.

... bé, ad esempio, se a te non è mai capitato ... potrebbe essere già un indicazione.
Hai programmi per il Tiny85 che superano i 4 KB ? Se SI, già potremmo essere quasi certi che su Linux (dove tu lavori) la cosa non si presenta ... :wink:

Ti faccio invece una domanda OT : il core "arduino-tiny-0100-0017" scaricabile da QUI è il più aggiornato ed è quello che tu consigli ? O c'è qualche cosa di più completo ? Grazie XD

Guglielmo

Ho uno sketch per Attiny84 che arriva a 4188 bytes:

Dimensione del file binario dello sketch: 4.188 bytes (su un massimo di 8.192 bytes)

Il core Tiny va preso da quel link, esatto. Io ho lo 0100-0017 come da te indicato.

leo72:
Ho uno sketch per Attiny84 che arriva a 4188 bytes:
...

Siamo proprio proprio al limite ...
... puoi fare una semplice prova ? Se e quando hai tempo, prendi una funzione e aggiungici un po' di istruzioni ... che so io ... analogWrite o simili .... tanto per creare codice e vedi se, arrivato a 5K, continua a non darti problemi ... così abbiamo una conferma :wink:

Guglielmo

Accontentato.

Dimensione del file binario dello sketch: 5.328 bytes (su un massimo di 8.192 bytes)

:grin: ... GRAZIE ...

... così almeno sappiamo che il problema è circoscritto ad un determinato ambiente (... sarebbe carino capire il perché ... ma lasciamo stare XD XD XD).

Probabilmente su Linux e Win hanno già corretto il buco mentre sulla versione Mac non lo hanno fatto :wink:

Piuttosto ... sicuri che parliamo della versione di "ld" che arriva con la distribuzione ufficiale ??? Perché ti conosco ... tu hai le TUE distribuzioni ... ]:smiley:

Guglielmo

Sì, ho compilato con la toolchain Atmel, non con quella di Arduino.
Se vuoi domani rifaccio la prova con la toolchain contenuta nell'IDE.

leo72:
Sì, ho compilato con la toolchain Atmel, non con quella di Arduino.
Se vuoi domani rifaccio la prova con la toolchain contenuta nell'IDE.

XD XD XD XD ... sei terribile ... così falsi tutte le prove !!!

Allora, ho provato io ...

... su Win7 x64 con l'IDE 1.05 ... da esattamente lo stesso errore
... su Ubuntu x64 sempre con IDE 1.05 ... non mi da alcun errore

Non ho installata la versione a 32 bit di Ubuntu per cui, purtroppo, non posso provare con l'ambiente a 32 bit ... :roll_eyes:

Quindi, almeno su Win, abbiamo la stessa condizione che su OS X e, per risolvere, occorre sostituire il linker (ld.exe) con una versione più aggiornata :wink:

Guglielmo

Edit : Provato anche su Ubuntu x32 ... nessun problema, quindi ... su Linux e con l'IDE 1.05 NON ci sono problemi. I problemi sono su OS X e su Win.

Compilato or ora per un Tiny84:
5292 bytes.

Nessun errore. Usata la toolchain Arduino su Arch Linux a 32 bit.
Nessun errore e circa lo stesso codice in byte compilando per Attiny85.
Se può aiutare, questo è avr-ld presente nell'IDE:

[leo@desktop-hp bin]$ ./avr-ld --version
GNU ld (GNU Binutils) 2.18 (WinAVR 20080610)
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

Questo è avr-ld presente nella toolchain Atmel:

[leo@desktop-hp bin]$ ./avr-ld --version
GNU ld (AVR_8_bit_GNU_Toolchain_3.4.2_939) 2.23.1
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

Si, esatto Leo, sono gli stessi dati che avevo verificato anche io sotto Ubuntu ... :slight_smile:

Quindi, ricapitolando :

  • Linux : OK
  • OS X : ERRORE - Aggiornare /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin/ld
  • Win : ERRORE - Aggiornare C:\arduino\hardware\tools\avr\avr\bin\ld.exe

Guglielmo