RaphAstronome | J'utilise cette classe pour charger des .so, le fonctionnement est assez simple :
Code :
- class DynamicLibrary {
- private:
- void* m_handle;
- public:
- DynamicLibrary() : m_handle(NULL) {}
- ~DynamicLibrary() {}
- // Ouverture de la librairie dynamique à l'adresse "path". S'il y a une erreur,
- // la fonction renvoie false, sinon true. Si auto_add_suffix est à true, le suffixe
- // .dll ou .so est automatiquement ajouté (selon l'OS sur lequel on compile).
- inline bool Open(const char* path, bool auto_add_suffix=true);
- // Fonction renvoyant un pointeur vers le symbole demandé s'il est trouvé, sinon
- // elle renvoie NULL.
- inline void* GetSymbol(const char* symbol_name);
- // Fermeture de la librairie.
- inline void Close();
- };
- bool DynamicLibrary::Open(const char* path, bool auto_add_suffix) {
- if(auto_add_suffix)
- {
- char* buffer = new char[strlen(path)+4];
- sprintf(buffer, "%s.so", path);
- m_handle = dlopen(buffer, RTLD_LAZY);
- char* erreur = dlerror();
- if (erreur) printf("ERROR : %s\n", erreur);
- delete [] buffer;
- }
- else
- m_handle = dlopen(path, RTLD_LAZY);
- return m_handle != NULL;
- }
- void* DynamicLibrary::GetSymbol(const char* symbol_name) {
- return dlsym(m_handle, symbol_name);
- }
- void DynamicLibrary::Close() {
- if(m_handle != NULL)
- {
- printf("Arret d'un module : " );
- dlclose(m_handle);
- m_handle = NULL;
- printf("ok\n" );
- }
- }
|
Tout fonctionne à merveille sauf que au niveau de dlclose() j'obtient :
Citation :
*** glibc detected *** free(): invalid pointer: 0x0000000000721ca8 ***
|
Et lorsque je l'enleve ça marche (sauf que ça ferme pas comme il faut la lib "dl" )
dlclose n'est jamais sensé planter même avec un pointeur foireux (et je suis sur que non). |