La Force de GCC pour informer sur undefined références dans les bibliothèques partagées
J'ai une bibliothèque partagée qui est lié à un autre (tiers) de la bibliothèque partagée. Ma bibliothèque partagée est ensuite chargé à l'aide de dlopen dans mon application. Tout cela fonctionne très bien (en supposant que les fichiers sont dans le bon chemin d'accès, etc).
Maintenant, le problème est que je n'ai même pas besoin de spécifier un lien à l'encontre de la troisième partie de la bibliothèque partagée quand j'ai le lien de ma bibliothèque. GCC accepter sans erreurs de déclaration sur undefined références. Donc, la question; comment puis-je la force de GCC pour m'avertir undefined références?
Si je change ma bibliothèque (temporairement) un exécutable, je reçois pas défini références (quand ne pas fournir à la bibliothèque de l'éditeur de liens). (Fonctionne très bien si je le préciser.)
I. e., le suivant est fait:
g++ -fPIC -shared -o libb.so b.o
g++ -fPIC -shared -o liba.so a.o
g++ -o a.exe a.cpp
Où la deuxième ligne ne donne PAS une erreur, et la troisième ligne se plaint d'une référence non définie.
Exemple de code:
un.h:
class a
{
public:
void foobar();
};
a.cpp:
#include "a.h"
#include "b.h"
void a::foobar()
{
b myB;
myB.foobar();
}
int main()
{
a myA; myA.foobar();
}
b.h:
class b
{
public:
void foobar();
};
b.cpp:
#include "b.h"
void b::foobar()
{
}
Vous devez vous connecter pour publier un commentaire.
-Wl,--no-undefined linker option peut être utilisée lors de la construction d'une bibliothèque partagée, les symboles non définis seront affichées comme des erreurs d'édition de liens.
Après plus de recherches, j'ai réalisé quelle manière les œuvres de trucs. Il y a deux options du linker pour manipuler les symboles non définis de bibliothèques partagées:
Premier est
--no-undefined
. Il signale la non-résolution des symboles qui ne sont pas résolus immédiatement, à l'étape de lien. À moins que le symbole est trouvé dans une bibliothèque partagée lié contre, que ce soit manuellement (avec-l
switch) ou automatiquement (libgcc_s
, C++ runtime;libc
, C runtime;ld-linux-**.so
, l'éditeur de liens dynamiques utils) choisi,--no-undefined
rapports d'erreur. C'est la clé de l'interlocuteur nécessaire.Il y a une autre clé,
--no-allow-shlib-undefined
(dont la description suggère également--no-undefined
). Il vérifie si les définitions dans les bibliothèques partagées qui vous lier votre bibliothèque partagée contre sont satisfaits. Cette clé est de peu d'utilité dans le cas illustré dans cette rubrique, mais il peut être utile. Toutefois, Il a ses propres obstacles.La page de manuel fournit quelques justification de savoir pourquoi il ne l'est pas par défaut:
Le truc, c'est que ce qui est dit ci-dessus est également le cas, par exemple, pour les systèmes Linux, où certaines des routines internes de la bibliothèque partagée est mise en œuvre dans
ld-linux.so
, le chargeur dynamique (c'est à la fois l'exécutable et de la bibliothèque partagée). À moins que vous en quelque sorte le lien, vous obtiendrez quelque chose comme ceci:Ces sont pas défini des références dans le chargeur,
ld-linux.so
. C'est une plate-forme spécifique (par exemple, sur mon système, le bon chargeur est/lib64/ld-linux-x86-64.so
). Vous pouvez relier le chargeur à votre bibliothèque et de vérifier, même la plus délicate références indiquées ci-dessus:-Wl,
choses. t afficher l'erreur, bien que pas celle que vous voulez. Mais c'est le maximum que vous pouvez avoir.Vous ne pouvez pas faire ld (qui est ce que gcc est en cours d'exécution) l'attention à une bibliothèque qui n'est pas là dans le lien. Vous pouvez désactiver RTLD_LAZY pour obtenir agressif de déclaration, et vous pouvez ajouter un test unitaire qui s'exécute juste après le lien juste pour éliminer ces problèmes.
ld
de vous dire "je n'ai aucune idée de l'endroit où vous pensez que ces symboles vont venir, mais ils ne sont pas dans l'une des bibliothèques que vous m'avez dit au sujet."