Chargement RTL de librairies dynamiques sous

SebManfred Messages postés 484 Statut Membre -  
SebManfred Messages postés 484 Statut Membre -
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 Statut Membre 128
 
erratum :
if( DisplayD = (void (*) (int))dlsym(handle,"testfunction") )
{
(*testfunction)(1);
}

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