J'essaie de créer une bibliothèque C++, et j'ai besoin d'appeler une fonction au moment du chargement pour l'initialiser. J'utilise GCC, donc j'ai essayé d'utiliser la fonction __attribute__((constructor))
et la fonction est effectivement appelée au moment du chargement.
Mais la fonction susmentionnée utilise des objets statiques qui se trouvent dans différentes unités de traduction, et il n'est donc pas précisé si ces objets statiques dans ces unités de traduction sont initialisés lorsque je dois les utiliser. Ainsi, par exemple, si je veux utiliser std::cout dans cette fonction, je suis fichu.
L'extrait de code suivant illustre assez bien le problème :
#include <iostream>
void __attribute__((constructor)) init()
{
std::cout << "Test\n";
}
int main(int argc, char* argv[])
{
return 0;
}
Ici, la fonction init() sera appelée au moment du chargement, mais il n'est pas spécifié si std::cout est initialisé à ce moment, et vous pourriez bien obtenir une erreur en essayant d'exécuter la 5ème ligne.
Ma question est donc la suivante : est-il possible de s'assurer que la fonction d'initialisation que je dois appeler au moment du chargement sera exécutée après la construction de tous les objets statiques ?
Edit : J'ai oublié de mentionner que cette bibliothèque sera utilisée en la préchargeant à l'intérieur d'un autre programme en utilisant la variable d'environnement LD_PRELOAD afin d'intercepter certains appels, donc je ne peux pas demander à un utilisateur d'appeler une fonction lib_init() à l'intérieur de son main().