Question

Existe-t-il un moyen de "notifier" une bibliothèque partagée? quand est-il chargé?

En d'autres termes, supposons que j'utilise dlopen sur une bibliothèque partagée. Existe-t-il une fonction appelée automatiquement (si présente) sur la bibliothèque partagée (par exemple, main?)

Était-ce utile?

La solution

  

Les bibliothèques doivent exporter l'initialisation   et des routines de nettoyage utilisant le gcc   __attribute __ ((constructeur)) et __attribute __ ((destructeur)) attributs de la fonction. Voir les pages d’information de gcc pour   informations sur ceux-ci. Constructeur   les routines sont exécutées avant dlopen   retourne (ou avant le démarrage de main ()   si la bibliothèque est chargée au chargement   temps). Les routines de destruction sont   exécuté avant que dlclose ne retourne (ou   après la sortie () ou l'achèvement de la main ()   si la bibliothèque est chargée au chargement   temps). Les prototypes C pour ces   les fonctions sont:

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

Tiré de http://tldp.org/HOWTO/Program-Library- HOWTO / index.html

C’est que vous venez de clouer sur __attribute__ ((constructeur)) aux fonctions que vous voulez appeler lorsque la bibliothèque partagée est chargée. La documentation ci-dessus indique également que les anciennes fonctions _ini et _fini sont considérées comme obsolètes.

Autres conseils

Oui. Quand une bibliothèque est ouverte, toute la construction statique a lieu ... donc, si vous utilisez C ++, vous pouvez faire:

// mylibrary.cpp
namespace
{
    class dynamic_library_load_unload_handler
    {
         public:
              dynamic_library_load_unload_handler(){
                    // Code to execute when the library is loaded
              }
              ~dynamic_library_load_unload_handler(){
                    // Code to execute when the library is unloaded
              }
    } dynamic_library_load_unload_handler_hook;
}

Contrairement aux solutions __ attribut__ ((constructeur)) données, cela sera portable. Notez cependant que si vous avez plusieurs objets comme celui-ci, il n’ya aucune garantie en ce qui concerne l’ordre de construction / destruction.

Au moins sous Linux, et probablement sur au moins certains autres systèmes Unix, si la bibliothèque est ouverte de manière dynamique, une fonction globale nommée _init , si elle existe, sera appelée par l'éditeur de liens dynamique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top