Comment une bibliothèque partagée (.so) peut-elle appeler une fonction implémentée dans son programme de chargement?
J'ai une bibliothèque partagée que j'mettre en œuvre et je veux le .afin d'appeler une fonction dans le programme principal de chargement de 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.
source d'informationauteur 0x90
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:
Vous avez deux options, à partir de laquelle vous pouvez choisir:
Option 1: exporter tous les symboles de votre exécutable.
C'est simple, 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:
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.
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.