Recevoir des “undefined symbol” erreur lors du chargement de la bibliothèque avec dlopen
Je suis en train d'écrire un peu de code qui utilise la dynamique des bibliothèques partagées sous forme de plugins.
Ma ligne de commande pour la construction de bibliothèques partagées ressemble:
cc -shared -fPIC -o module.so -g -Wall module.c
Dans le module, je peux appeler des fonctions qui sont dans aucune autre bibliothèque partagée qui a été chargé au sein de l'exécutable principal.
Cependant je ne peux pas accéder (exporté) les fonctions qui sont dans l'exécutable lui-même (j'ai undefined symbol
erreurs).
Mon appel à dlopen
ressemble à ceci:
void *handle = dlopen(plugin, RTLD_NOW);
Quelqu'un peut veuillez en aviser comment mon module peut appeler à mon exécutable, sans avoir à mettre l'ensemble de l'exécutable de l'utilitaire de fonctions dans une autre bibliothèque partagée?
Vous devez vous connecter pour publier un commentaire.
Bonne solution est d'ajouter
-rdynamic
à la commande de liaison de l'exécutable principal. Cela va ajouter une option appropriée pourld
(qui, lors de l'utilisation deGNU ld
, il arrive à être--export-dynamic
).Ajoutant
--export-dynamic
directement est techniquement incorrect: c'est une option de l'éditeur de liens, et devrait donc être ajouté comme-Wl,--export-dynamic
, ou-Wl,-E
. C'est aussi moins portable que-rdynamic
(autres linkers ont un équivalent, mais l'option elle-même est différente).J'ai trouvé la réponse moi-même.
J'ai dû ajouter de la
--export-dynamic
drapeaux aux options de liaison pour l'exécutable principal.Quand j'ai rencontré le même problème, j'ai simplement utilisé la solution suivante. Avant de charger un plugin, il suffit de charger le programme lui-même, en apportant ses symboles pour les tableaux dynamiques:
Je pense que la solution est préférable. La raison en est que, il résout également le même problème si vous
un), votre programme (ou un trird-partie module) est lié (pas dans l'exécution) à l'encontre de la bibliothèque partagée, les symboles qui doivent être dans la dynamique de la table;
b) ne peut pas recompiler le module avec -rdynamic drapeau.