Dans quelle mesure la liaison est-elle portable? #pragma faible my_symbol
-
05-07-2019 - |
Question
Dans quelle mesure la liaison est-elle portable?
#pragma weak my_symbol
Je vois cette question: comment créer de la faiblesse link-work-with-gcc explique comment le faire fonctionner. Mais existe-t-il un bon moyen de faire cela de manière à ce que gcc ne soit pas nécessaire?
Quelle est la différence entre une liaison faible et la protection de la déclaration avec un #ifdef?
#ifndef my_weak_fn
void my_weak_fn(){/* Do nothing */ return;}
#endif
La solution
#pragma
est, par définition, non portable.
Et la liaison faible est faite au moment du lien (assez étonnamment). Il permet à une fonction (ou à n’importe quel symbole, réellement) avec la même signature d’en remplacer une autre. Cela signifie qu'un fort sera choisi de préférence au faible, mais s'il n'y en a pas, le faible sera utilisé.
Les gardes à inclure sont effectués par le compilateur, pas par l'éditeur de liens, et ils ne permettent pas le repli sur un faible si le plus fort n'y est pas. Vous pouvez simuler le même comportement si vous contrôlez la source pour les deux fonctions (avec ifdef
-ing pour une, ifndef
-ing pour l'autre), mais ce n'est pas toujours le cas et c'est plus choisir entre deux fonctions fortes.
Une liaison faible vous permet d'effectuer des opérations telles que d'insérer votre propre malloc () / free ()
à des fins de débogage tout en assurant la liaison avec la bibliothèque qui les fournit.