Comment une bibliothèque partagée (.donc) appeler une fonction qui est mis en œuvre dans son programme de charge?
J'ai une bibliothèque partagée que j'ai mis en place et souhaitez le .afin d'appeler une fonction qui est mis en œuvre dans le programme principal qui permet de charger la bibliothèque.
Disons que j'ai principaux.c (exécutable) qui contient:
void inmain_function(void*);
dlopen("libmy.so");
Dans le mon.c (le code de la libmy.donc), je tiens à appeler inmain_function
:
inmain_function(NULL);
Comment la bibliothèque partagée appel inmain_function
indépendamment du fait inmain_function
est défini dans le programme principal.
Note: je tiens à appeler un symbole dans la main.c de mon.c pas vice-versa, ce qui est l'usage commun.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de faire un registre de la fonction dans votre .donc, pour que l'exécutable peut donner un pointeur de fonction de vos .donc pour l'utiliser plus tard.
Comme ceci:
la register_function doit stocker le pointeur de fonction dans une variable dans le .alors, où l'autre fonction dans les .donc peut la trouver.
Votre mylib.c serait le besoin de ressembler à quelque chose comme ceci:
if (callback) { callback(); return 0; } else { return -1; }
pour indiquer une erreur et d'éviter d'appelerNULL
(qui pourrait être fatale).Vous avez deux options, à partir de laquelle vous pouvez choisir:
Option 1: exporter tous les symboles de votre exécutable.
C'est simple option, lors de la construction de l'exécutable, ajouter un drapeau
-Wl,--export-dynamic
. Cela permettrait de faire toutes les fonctions disponibles à la bibliothèque des appels.Option 2: créer un fichier d'export du fichier de symboles avec la liste des fonctions, et l'utilisation
-Wl,--dynamic-list=exported.txt
. Cela nécessite un peu d'entretien, mais plus précis.À démontrer: simple exécutable et dynamiquement chargés de la bibliothèque.
Code de bibliothèque (lib.c):
Donc, en premier lieu la construction de la bibliothèque (cette étape n'est pas différent):
Maintenant construire un exécutable avec tous les symboles exportés:
Exécuter l'exemple:
Symboles exportés:
Maintenant avec la liste exportée (
exported.txt
):Build & vérifiez les symboles visibles:
-undefined dynamic_lookup
. sur linux avec gcc cette magie fonctionne comme décrit dans le post, mais je n'ai aucune idée pourquoi.Mettre votre principale prototype de la fonction dans un .h de fichier et de les inclure dans votre principal et dynamique de la bibliothèque de code.
Avec GCC, il suffit de compiler votre programme principal avec la
-rdynamic
drapeau.Une fois chargé, votre bibliothèque sera en mesure d'appeler la fonction dans le programme principal.
Un peu plus loin l'explication est que, une fois compilé, votre bibliothèque dynamique aura un symbole non défini pour la fonction qui est dans le code principal. Sur votre application principale de charger la bibliothèque, le symbole sera résolu par le programme principal de la table des symboles. J'ai utilisé le schéma ci-dessus de nombreuses fois et il fonctionne comme un charme.
static
mot-clé.Le suivant peut être utilisé pour charger une bibliothèque dynamique dans votre code (dans le cas où quelqu'un est venu ici après avoir regardé comment le faire):
Ne pas oublier de mettre
#include <dlfcn.h>
et le lien avec l'–ldl
option.Vous pouvez également ajouter un peu de logique qui vérifie si
NULL
est retourné. Si c'est le cas, vous pouvez appelerdlerror
et il devrait vous donner quelques messages significatifs en décrivant le problème.D'autres affiches ont cependant fourni des réponses plus appropriées pour votre problème.
.so
de la bibliothèque à partir d'un autre fichier (comme le votre où vos principales est). Est-ce ce que vous voulez dire désolé?main.c
contientfunc
et je veux.so
fichier sera chargé par la main.c pour appeler une fonction decalred en main.c. principal.c n'est pas un .donc.