¿Qué tan portátil es el enlace débil? #pragma débil my_symbol
-
05-07-2019 - |
Pregunta
¿Qué tan portátil es el enlace débil?
#pragma weak my_symbol
Veo esa pregunta: how-to-make-weak- link-work-with-gcc explica cómo hacer que funcione. Pero, ¿hay una buena manera de hacer esto de modo que no se requiera gcc?
¿Cuál es la diferencia entre un enlace débil y la protección de la declaración con un #ifdef?
#ifndef my_weak_fn
void my_weak_fn(){/* Do nothing */ return;}
#endif
Solución
#pragma
es, por definición, no portátil.
Y el enlace débil se realiza en el momento del enlace (sorprendentemente). Permite que una función (o cualquier símbolo, realmente) con la misma firma anule a otra. Eso significa que se elegirá uno fuerte con preferencia al débil pero, si no hay uno fuerte, se usará el débil.
Las compilaciones de inclusión las realiza el compilador, no el enlazador, y no permiten el retroceso a uno débil si el fuerte no está allí. Puede simular el mismo comportamiento si controla la fuente de ambas funciones (mediante ifdef
-ing para una, ifndef
-ing para la otra), pero ese no es siempre el caso y esto es más elegir entre dos funciones fuertes.
La vinculación débil le permite hacer cosas como colocar su propio malloc () / free ()
para propósitos de depuración mientras se vincula con la biblioteca que los proporciona.