Chargement d'une librairie via dlopen

Fermé
Lolienette Messages postés 1 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 16 juillet 2007 - 16 juil. 2007 à 10:23
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 - 2 juin 2009 à 12:11
Bonjour,

Je m'adresse à vous car je me trouve dans une impasse.
Voilà, je souhaite ajouter une UDF à MySQL. Pour celà je dois charger la librairie correspondant à mon UDF dans /usr/lib. Cependant, je ne suis pas le root du système, je ne peux demander le mot de passe, je ne suis que stagiaire...
Par conséquent, j'ai décidé de passer par dlopen.

Voici le code mon udf :

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <mysql/mysql.h>
#include <pthread.h>

//#include "hello_wolrd.sql"

char Hello_World ()
{
printf ("Hello World !\n");

return (0);

}

voici le code pour la copie de la lmibrairie :

#include <dlfcn.h>
#include <stdio.h>

int main ()
{
char * erreur;

void * handle = dlopen ("/home/aurelie/devel/udf-hellowolrd/src/ hello_world.so", RTLD_GLOBAL);

if (! handle)
{
fputs (dlerror (), stderr);
exit(1);
}
if ((erreur = dlerror()) != NULL)
{
fprintf (stderr, "%s0, error);
exit(1);
}

dlclose (handle);
}

Je compile donc l'udf avec
gcc -shared -o hello_world.so hello_world.c

Je complile le second avec
gcc -rdynamic -o hello_world.so hello_world.c -ldl

Et j'obtiens, toujours ce message :

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: dans la fonction « _start »:
../sysdeps/i386/elf/start.S:115: référence indéfinie vers « main »
collect2: ld returned 1 exit status

J'ai essayé en ne compilant pas l'udf au préalable, mais j'obtiens le même message.

Merci à l'avance pour votre aide




A voir également:

2 réponses

La méthode de compilation de la bibliothèque partagée est fausse. Dans ton cas tu crées un fichier exécutable normal (même s'il a l'extension .so) et comme il ne trouve pas de main il râle !
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
2 juin 2009 à 12:11
Essaie en compilant comme ça:
gcc -c -fPIC fichier -o fichier.o
gcc -shared -fPIC fichier.o -o libfichier.so
L'option -fPIC permet de générer un code indépendantde l'adresse mémoire.
0