Comment faire de la faiblesse de la relation entre travail avec GCC?
Il y a 3 façons de raconter à GCC de maillon faible d'un symbole:
__attribute__((weak_import))
__attribute__((weak))
#pragma weak symbol_name
Aucune ne fonctionne pour moi:
#pragma weak asdf
extern void asdf(void) __attribute__((weak_import, weak));
...
{
if(asdf != NULL) asdf();
}
J'ai toujours une erreur de lien comme ceci:
Les symboles non définis: "_asdf", référencé à partir de: _asdf$non_lazy_ptr dans ccFA05kN.o ld: symbole(s) non trouvé collect2: ld a retourné 1 code de sortie
Je suis en utilisant GCC 4.0.1 sur OS X 10.5.5. Ce que je fais mal?
int __attribute__((weak)) main() { ... }
fonctionne très bien pour moi avec gcc/Mac OS X, mais ne parvient pas à compiler avec gcc/MinGW. 🙁
Vous devez vous connecter pour publier un commentaire.
Je viens de regarder dans le présent et de pensée, d'autres pourraient être intéressés dans mes conclusions.
Faible liaison avec weak_import vraiment ne marche bien qu'avec les bibliothèques dynamiques. Vous pouvez l'obtenir pour fonctionner avec la liaison statique (en spécifiant défini dynamic_lookup comme suggéré ci-dessus), mais ce n'est pas une idée à chaud. Cela signifie qu'aucun des symboles non définis seront détectés jusqu'à l'exécution. C'est quelque chose que je voudrais éviter dans le code de production, personnellement.
Ici est un Mac OS X session de Terminal montrant comment le faire fonctionner:
Ici est f.c
Ici est whatnof.c
Faire une bibliothèque dynamique de f.c:
Compiler et lier l'encontre de la dynamique lib, liste dynamique libs.
Exécuter whatnof pour voir ce qui se passe:
Maintenant remplacer les f.dylib avec une bibliothèque vide (pas de symboles):
Exécuter même whatnof pour voir ce qui se passe:
L'idée de base (ou "cas d'utilisation") pour weak_import est qu'il vous permet de vous lier avec un ensemble de dynamiques (partagée) des bibliothèques, mais ensuite exécuter le même code par rapport à des versions antérieures de la même bibliothèque. Vous pouvez vérifier des fonctions par rapport à la valeur NULL pour voir si ils sont pris en charge dans la dynamique particulière de la bibliothèque que le code est actuellement en cours d'exécution contre. Cela semble être une partie de la base d'un modèle de développement pris en charge par Xcode. J'espère que cet exemple est utile; il a aidé à mettre mon esprit à l'aise sur cette partie de l'Xcode conception.
Ajouter
-Wl,-flat_namespace,-undefined,dynamic_lookup
pour le compilateur gcc ligne que vous utilisez pour faire le lien final.cc1.exe: error: unrecognized command line option "-flat_namespace,-undefined,dynamic_lookup"
.Vous devez définir la MACOSX_DEPLOYMENT_TARGET variable 10.2 ou une version ultérieure. Voir La documentation d'Apple et leur technote sur la faiblesse de la liaison.
De la gcc doc manuel:
faible
ce qui signifie qu'un objet est légitimé à l'écrasement d'un faible le symbole (défini dans un autre objet/bibliothèque) sans avoir des erreurs au moment de la liaison. Ce qui est clair, c'est si vous êtes reliant la bibliothèque avec le faible symbole ou pas. Il semble que vous n'avez pas défini le symbole et la bibliothèque n'est pas correctement relié.
Minimale exécutable Linux exemple
principal.c
notmain.c
De compiler et d'exécuter à la fois des objets:
De sortie:
De compiler et d'exécuter sans
notmain.o
:De sortie:
GitHub en amont.
Nous voyons donc que s'il est donné à
notmain.o
, puis le non-faible le symbole de l'emporte comme prévu.Nous pouvons analyser la ELFE de fichier de l'objet symboles avec:
qui donne:
et puis:
contient:
Si vous traitez avec
.a
bibliothèques statiques cependant, vous pourriez avoir à utiliser-Wl,--whole-archive
comme l'explique: Comment faire de la gcc lien très fort avec le symbole dans la bibliothèque statique pour écraser les faibles symbole?Faible symboles peuvent également être laissés dans le vague, ce qui en Binutils conduit à la "plate-forme de comportement spécifique", voir: GCC comportement non résolues faible fonctions
Testé sur Ubuntu 18.10, GCC 8.2.0.