Chargement d'une librairie via dlopen

Lolienette Messages postés 1 Statut Membre -  
pyschopathe Messages postés 2053 Statut Membre -
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

neria
 
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 2053 Statut Membre 135
 
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