Lancer une fonction d’une bibliothèque dynamique

Problème

Vous souhaitez, après avoir chargé une bibliothèque avec dlopen(), que votre programme exécute une fonction de celle-ci.

Solution

Utilisez dlsym() pour obtenir une référence sur la fonction et l’attribuer à un pointeur. Puis exécutez-la en utilisant ce pointeur sur fonction.

Discussion

Supposons qu’une bibliothèque, chargée avec dlopen(), contienne la fonction module_test(), voici le code pour exécuter cette fonction :


/* Prototype de la fonction module_test() */ 
int module_test (int arg1, char *arg2); 
 
/* Chargement de la bibliothèque libtest.so 
 * et exécution de la fonction. 
 */ 
void *dh; 
int (*m_test) (int arg1, char *arg2); 
int resultat; 
 
if (NULL == (dh = dlopen ("libtest.so", RTLD_LAZY))) 
  { 
    fprintf (stderr, "Impossible d'ouvrir libtest.so\n"); 
    exit (EXIT_FAILURE); 
  } 
 
if (NULL == (m_test = dlsym (dh, "module_test"))) 
  { 
    fprintf (stderr, "Impossible d'obtenir module_test\n"); 
    exit (EXIT_FAILURE); 
  } 
 
resultat = m_test (1, "un"); 
printf ("Résultat = %d\n", resultat);
 

Prototypes


#include <dlfcn.h> 
 
void *dlsym (void *restrict handle, const char *restrict symbol);
 
Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Charger une bibliothèque de manière dynamique
Suivant
Écrire un greffon