Comment faire de la gcc lien très fort avec le symbole dans la bibliothèque statique pour écraser les faibles symbole?
Mon problème peut se résumer dans les points suivants:
bar.c:
#include <stdio.h>
void bar() {
printf("bar\n");
}
principal.c:
#include <stdio.h>
void __attribute__((weak)) bar() {
printf("foo\n");
}
int main() {
bar();
return 0;
}
Makefile:
all:
gcc -c bar.c
ar -rc libbar.a bar.o
gcc main.c -L. -lbar
Sortie:
$ ./a.out
foo
De sorte que le symbole de la faiblesse de la barre principale.c n'est pas remplacé par le symbole fort dans la barre.c en raison de la barre.c étant lié à main.c dans une bibliothèque statique libbar.un.
Comment puis-je demander à gcc de faire le symbole fort dans libbar.un écrasé à la faiblesse du symbole principal.c?
OriginalL'auteur user1777342 | 2012-10-26
Vous devez vous connecter pour publier un commentaire.
En règle générale: si vous ne mettez pas une faible mise en œuvre dans votre
main
, l'éditeur de liens se résoudre à la fin au moment de l'exécution. Mais si vous la mettre en œuvre dansmain.c
, vous ne être en mesure de la remplacer par une forte lié (bar.c
) lors de la liaison de cette statique.Veuillez lire http://www.bottomupcs.com/libraries_and_the_linker.html - il contient beaucoup de choses intéressantes sur ce sujet.
J'ai fait un test en moi-même:
bar.c
baz.c
principal.c
Mon Makefile:
Prendre un coup d'oeil à main1 && main2... si vous ne mettez pas de la faiblesse de la mise en œuvre dans
main.c
mais garder le faible dans un la bibliothèque et la forte dans une autre lib., vous serez en mesure de remplacer la faible si la forte lib définit une forte mise en œuvre debar()
.😉 Un plaisir de vous aider.
La seule référence à cette importante __attribute__((faible)) question sur l'Internet.
Thx! Vous voyez cela fait quelques essais et d'erreurs. Mais la question était vraiment intéressant.
OriginalL'auteur max.haredoom
Je suis surpris par la réponse donnée par max.haredoom (et qu'il a été accepté). La réponse traite de bibliothèques partagées et la liaison dynamique, alors que la question a été clairement sur le comportement de la liaison statique à l'aide de bibliothèques statiques. Je crois que c'est trompeur.
Lors de la liaison de bibliothèques statiques,
ld
ne pas de soins par la faiblesse de la/des symboles forts par défaut: il résout une simple symbole non défini premier rencontrés symbole (donc de l'ordre de bibliothèques statiques dans la ligne de commande est important).Cependant, ce comportement par défaut peut être modifié à l'aide de la
--whole-archive
option. Si vous réécrivez votre dernière étape dans le Makefile comme suit:Ensuite, vous verrez:
En un mot,
--whole-archive
les forces de l'éditeur de liens pour le scan de toutes ses symboles (y compris ceux déjà résolu). Si il est un symbole fort qui a déjà été résolu par un faible le symbole (comme dans notre cas), le symbole fort emportera sur le faible.Aussi voir beaucoup de post sur les bibliothèques statiques et leur processus de liaison "Bibliothèque de l'ordre dans la liaison statique" par Eli Bendersky et cette SORTE de question.
Cela fonctionne pour moi, cependant, j'ai regardé le manuel, et je pense qu'il devrait être noté que le
--whole-archive
option ajoute également que tous les symboles dans les bibliothèques, ce qui permettra de résoudre ce problème, mais d'augmenter la taille de l'exécutable et peut fournir d'autres erreurs de liaison.OriginalL'auteur Dmitrii Kuvaiskii