linux dlopen: une bibliothèque peut-elle être «notifiée» quand elle est chargée?
-
05-07-2019 - |
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?)
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.