Chargement RTL de librairies dynamiques sous

Fermé
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 - 28 oct. 2008 à 13:29
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 - 28 oct. 2008 à 14:06
Bonjour,

Je cherche à charger une librairie dynamique sous AIX via dlopen

la librairie semble compilée correctement et le chargement "normal" ne pose pas de problème
le chargement dynamique est effectué comme il suit

les objets statiques sont compilés comme il suit :
xlC_r -o monobjet.o -c monfichiersource.c

les objets dynamiques sont créés à partir des objets statiques comme il suit
xlC_r -G -o monobjetdynamique.so monobjet.o -bnoentry -bexpall -lc

la librairie est empaquetée comme il suit
ar r malib.a monobjetdynamique.so

mon programme est généré comme il suit
xlC_r -o main.o -c main.c
xlC_r -o programme main.o

dans le programme, je cherche à charger dynamiquement la lib via dlopen

void * handle;
void (* DisplayD)(int,char**);
handle = dlopen("malib.a",RTLD_LAZY|RTLD_GLOBAL);
if(handle == NULL)
{
printf(dlerror());
return;
}
if( DisplayD = (void (*) (int))dlsym(handle,"testfunction") )
{
(*testfunction)(1);
}
dlclose(handle)

tout compile, mais à l'exécution, il me marque
could not load module mylib.a
the module has an invalid magic number

si à la place de malib.a je mets monobjetdynamique.so, ca marche, mais ca ne me convient pas. pour uniformiser le code du projet et faire quelque chose de propre, j'ai besoin de travailler sur les libs (fichier.a) et non pas les objets

si je veux appeler la fonction testfunction proprement dans mon main.c, ce qui revient à modifier un tantinet le code, mettre des #include et modifier la ligne de commande de création de mon executable par
xlC_r -o main.o -c main.c -Iinclude
xlC_r -o programme malib.a main.o
ca fonctionne, donc à priori ma lib est bonne

si quelqu'un connait le fonctionnement de la chose et a une idée, ça pourrait beaucoup m'aider

merci d'avance
Seb

1 réponse

SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
28 oct. 2008 à 14:06
erratum :
if( DisplayD = (void (*) (int))dlsym(handle,"testfunction") )
{
(*testfunction)(1);
}

il fallait lire
if( DisplayD = (void (*) (int))dlsym(handle,"testfunction") )
{
(*DisplayD )(1);
}
1