Microchip XC32 1.40 – libc – multiple definition of `_atexitptr’

Problème

Erreur pendant la compilation d’un projet avec le compilateur XC32 de Microchip :

c:/microchip/xc32/v1.40/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a(stdclean_full.o):(.bss+0x0): multiple definition of `_atexitptr'
c:/microchip/xc32/v1.40/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a(stdclean_simple.o):(.bss+0x0): first defined here

Explication

C’est un bug de la version 1.40 du compilateur XC32. Le problème est lié à la fonction exit() et à certaines fonctions de la bibliothèque standard stdio.

Solution

Pour corriger le bug, il va falloir modifier le fichier libc.a fournit avec XC32. Mais, comme ce compilateur est livré avec plusieurs fichiers libc.a, il faut trouver le bon. Pour ce faire, il suffit d’analyser le chemin donné dans le message d’erreur.

Identification le bon fichier libc.a

Dans l’exemple décrit précédemment :

c:/microchip/xc32/v1.40/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a

Simplifions le chemin vers le fichier libc.a en supprimant successivement les chemins relatifs :

c:/microchip/xc32/v1.40/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a
c:/microchip/xc32/v1.40/bin/../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a
c:/microchip/xc32/v1.40/lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib\libc.a
c:/microchip/xc32/v1.40/lib/gcc/pic32mx/../../../pic32mx/lib\libc.a
c:/microchip/xc32/v1.40/lib/gcc/../../pic32mx/lib\libc.a
c:/microchip/xc32/v1.40/lib/../pic32mx/lib\libc.a

Une dernière itération et voici le chemin du fichier fautif :

c:/microchip/xc32/v1.40/pic32mx/lib\libc.a

Nous pouvons maintenant appliquer un correctif à ce fichier.

Application le correctif

/!\ Avant toute chose, faite une copie de ce fichier dans son dossier d’origine.

Ensuite, copiez le fichier libc.a dans un dossier temporaire. Par exemple D:\temp

Ouvrir une Invite de commandes avec Windows et se placer dans le dossier temporaire :

cd /d d:\temp

Puis exécutez successivement les commandes suivantes :

xc32-ar x libc.a stdclean_simple.o
xc32-strip -N _atexitptr stdclean_simple.o
xc32-ar r libc.a stdclean_simple.o

Voici la méthode en image :

Modification libc.a de XC32

Replacez le fichier libc.a modifié dans son dossier d’origine.

Conclusion

Vous pouvez maintenant compiler à nouveau votre projet, le message d’erreur ne doit plus apparaitre.

La solution décrite dans ce billet est inspirée par une discussion du forum officiel de Microchip :
Bug in XC32 standard libraries? (stdclean_full.o and stdclean_simple.o both linking)

Ce problème sera sans doute corrigé avec la prochaine version du compilateur XC32.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>