Quão portátil está fraco vinculando? #pragma fraco my_symbol
-
05-07-2019 - |
Pergunta
Quão portátil está fraco vinculando?
#pragma weak my_symbol
Eu vejo essa pergunta: Como fazer o que fazer-se-link-with-gcc discute como fazê -lo funcionar. Mas existe uma boa maneira de fazer isso de modo que o GCC não seja necessário?
Qual é a diferença entre vincular e proteger a declaração com um #IFDEF?
#ifndef my_weak_fn
void my_weak_fn(){/* Do nothing */ return;}
#endif
Solução
#pragma
é, por definição, não portátil.
E a ligação fraca é feita na hora do link (surpreendentemente). Ele permite uma função (ou qualquer símbolo, na verdade) com a mesma assinatura para substituir outra. Isso significa que um forte será escolhido em preferência ao fraco, mas, se não houver um forte, o fraco será usado.
Incluem guardas são feitos pelo compilador, não pelo vinculador, e eles fazem não Deixe o fallback a um fraco se o forte não estiver lá. Você pode simular o mesmo comportamento se controlar a fonte das duas funções (por ifdef
-ing para um, ifndef
-ing para o outro), mas esse nem sempre é o caso e isso é mais uma escolha entre duas funções fortes.
A ligação fraca permite que você faça coisas como cair no seu próprio malloc()/free()
Para fins de depuração, enquanto ainda vincula à biblioteca que os fornece.