2017-05-19 1 views
0

gcc a __attribute__((weak)) qui permet de créer un symbole faible tel qu'une fonction. Cela permet à l'utilisateur de redéfinir une fonction. Je voudrais avoir le même comportement dans XC8.Est-ce que le compilateur XC8 supporte les symboles faibles?

Plus d'info:

Je vous écris un pilote pour XC8 et je voudrais déléguer l'initialisation de bas niveau à une fonction définie par l'utilisateur.

Je sais qu'il est possible de redéfinir une fonction: il y a la fonction putch qui est implémentée dans le fichier source de XC8 et qui est appelée par la fonction printf. L'utilisateur est autorisé à réimplémenter putch dans son application. Il y a deux fonctions avec le même nom, mais aucune erreur n'est soulevée. L'implémentation dans les fichiers sources de XC8 a un commentaire disant "Implémentation faible, l'implémentation de l'utilisateur peut être nécessaire", donc cela doit être possible.

J'ai regardé des pragmas dans le guide de l'utilisateur de XC8, mais il n'y a pas de directive liée à cette question.

+0

Nous ne sommes pas le site de support de Microchip. Pourquoi ne leur demandes-tu pas? – Olaf

+0

Si je posais une question sur la programmation Android, répondriez-vous que vous n'êtes pas le site d'assistance de Google? Je pense que la réponse de Clifford pourrait profiter à d'autres que moi-même. – a44043

+0

Étant donné que le manuel indique clairement que ces directives sont ignorées, peut-être la question devrait être _ « Comment puis-je mettre « lien faible » dans un compilateur qui ne supporte pas directement? » _ @Olaf pourrait objecter que moins, et ma réponse resterait le même. – Clifford

Répondre

1

Un éditeur de liens ne recherche que les bibliothèques statiques pour résoudre un symbole qui n'est pas déjà résolu par les fichiers d'objets d'entrée, afin de remplacer les fonctions de bibliothèque statique peut être fait sans lien faible. La liaison faible est utile pour le code fourni comme code source ou objet plutôt que comme une bibliothèque statique. Par conséquent, si aucune directive de liaison faible n'est prise en charge, vous pouvez créer une bibliothèque statique pour les symboles «faibles» et la lier.

Le XC8 manual comportement des documents à la fois la directive sur la compatibilité IAR __weak et un weak pragma, et dans les deux cas, les directives sont ignorées (uniquement pris en charge dans XC16 et XC32), vous devrez utiliser la méthode proposée ci-dessus, qui est en tout cas beaucoup plus portable - si quelque peu gênant.

Dans le cas de putch(), je soupçonne que cela ne fonctionne pas comme vous le croyez. J'imagine que ce n'est pas du tout un lien faible. dans la bibliothèque statique contenant printf() un lien non résolu vers putch() existe, et l'éditeur de liens le résout avec tout ce que vous fournissez; Si vous compiliez et liez à la fois l'implémentation de Microchip et la vôtre à partir du code source, vous obtiendrez une erreur de l'éditeur de liens; De même, si vous ne fournissez aucune implémentation, vous obtiendrez une erreur de l'éditeur de liens.

+0

Merci beaucoup! – a44043