IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Dlopen hpux et coredump au dlclose sur linux


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut Dlopen hpux et coredump au dlclose sur linux
    Salut tout le monde,
    Voila, j'ai un petit fichier c qui fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #ifdef _HPUX_SOURCE
    #include <dl.h>
    #else
    #include <dlfcn.h>
    #endif
    ....
    char name[10+1];
    /* chargement ... */
    	handle = dlopen(data.lib,RTLD_NOW);
    	if (!handle)
    	{
    		errstr = dlerror();
    		if (errstr != NULL)
    			fprintf(stdout,"lib could not be loaded(%s)\n",data.lib,errstr);
    		else
    			fprintf(stdout,"lib could not be loaded\n",data.lib);
    		return uxspv_strerror(ERROR,NULL);
    	}
     
    	/* Recherche la fonction de la librairie */
    	ptr_u_get_func = (void (*)(char *)) dlsym(handle,"u_get_name");
    	if (!ptr_u_get_func)
    	{
    		if (handle)	  
    			dlclose(handle);
     
    		fprintf(stdout,"The function (u_get_name) of the library could not be loaded.\n");
    		return uxspv_strerror(UNKNOWN,NULL);
     
    	}
     
    	(*ptr_u_get_func)(name);
    Le problème c'est que quand j'essaye de compiler ce fichier sur HPUX (10 ou 11) avec CC (j'ai pas gcc), j'ai ces erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cc: "../src/load.c", line 140: error 1588: "RTLD_NOW" undefined.
    cc: "../src/load.c", line 140: warning 527: Integral value implicitly converted to pointer in assignment.
    cc: "../src/load.c", line 143: warning 527: Integral value implicitly converted to pointer in assignment.
    *** Error exit code 1
    voilà mes options de compilations (sur hp10):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LFLAGS=-Aa -v +Z -D_HPUX_SOURCE -D_OPT_THREAD
    CFLAGS=-Ae
    LDFLAGS=-L/usr/bin -lm -lc -lrfc -lBSD -lDCE -ldl
    Quelqu'un peut me dire ce qui va pas, ce que j'ai oublié ?

    Merci


  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    quand tu appelle ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle = dlopen(data.lib,RTLD_NOW);
    ton RTLD_NOW, il correspond a quoi ? y aurait pas un include oublié ? Ou une déclaration ?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    bah je viens de chercher dlopen est une macro défini dans dlfcn.h
    le truc, c'est que j'ai bien ce fichier .h sur HPUX11, donc, ça compile bien sur HP11
    mais sur Hp 10, j'ai pas ce fichier .h, mais j'ai dl.h (mais y'a pas de dlopen, ni de RTLD_NOW de défini). Je sais pas ce qu'il faut que j'utilise du coup et comment faire sur hp10...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    ben la, heu ....

    connais pas dlopen comme fonction, donc peux pas donner d'équivalence...

  5. #5
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    Effectivement, c'est etrange.... (J'utilise moi aussi les fonctions dl* pour gerer des plugins dans mes applications )
    Mais il me semble que sur HP*, c'est plutot les fonctions equivalentes suivantes qu'il faut utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <dl.h>
     
    shl_load(), shl_definesym(), shl_findsym(), shl_gethandle(),shl_unload(), etc....
    Les drapeaux ne sont pas les mêmes, mais le principe de fonctionnement est identique...

    Je pense que ca devrait regler ton probleme

    ++
    Pouic

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    ouais, ca y est j'ai trouvé
    voilà la doc hp :
    http://docs.hp.com/en/B2355-90654/ch05s03.html?btnPrev=%AB%A0prev

    merci.

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut dlopen sur linux -> segmentation fault signal 11
    Salut
    voila, j'ai fait un prog qui load et unload une lib
    sur linux, ca marche, mais a la fin (au moment du dlclose) ça plante :
    segmentation fault signal 11

    pourtant que test bien le handle
    if (handle)
    dlclose(handle);

    Et le handle n'est pas vide, puisque j'arrive bien a appeler une fonction de cette lib dynamique que je charge avec dlopen

    mais au dlclose ça me fait un coredump !!!!!

    help! please!
    Delphine.

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Mouais, c'est bizarre... Une petite remarque tout de même : pour tester si les fonctions dlsym,etc... ont reussi, il faut utiliser la fonction dlerror :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      fonc = dlsym(handle, "fonc_entry");
      if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
      }
    Sinon, tu peux poster le bout de code incriminé ? (je suppose que c'est la fin de celui que tu as deja posté )

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Salut,
    Je fais bien ce que tu dis (je test le dlerror) et j'ai pas d'erreur.
    Tout fonctionne bien, sauf ce ...bip... de dlclose !!! qui me fait un coredump.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    /* chargement ... */
                    /* data.lib contient par exemple : /var:opt/var/libspv.so */
    	handle = dlopen(data.lib,RTLD_NOW);
     
    	if (!handle)
    	{
    		errstr = dlerror();
    		if (errstr != NULL)
    			fprintf(stdout,"The %s library could not be loaded (%s)\n",data.lib,errstr);
    		else
    			fprintf(stdout,"The %s library could not be loaded\n",data.lib);
     
    		ux_free(&data);
    		return ux_strerror(UX_ERROR,NULL);
    	}
     
    	/* Recherche la fonction de la librairie */
    	ptr_u_get_name = (void (*)(char *)) dlsym(handle,"u_get_name");
     
    	if (!ptr_u_get_name)
    	{
    		if (handle)	  
    			dlclose(handle);
     
    		fprintf(stdout,"The function (u_get_name) of the  library could not be loaded.\n");
     
    		ux_free(&data);
    		return ux_strerror(UNKNOWN_NAME,NULL);
     
    	}
     
                    /* appel de la fonction de la lib */
    	(*ptr_u_get_spvname)(name);
     
                    /* dans name j'ai le résultat de la fonction */
                    if(name != NULL && strlen(name) > 0)
                    {
                          printf("name=%s\n",name);
                     }
     
                    /* j'ai fini */
                    if (handle != NULL )
    	{
                            /* CA PLANTE LA !!!!!!!!!!!!! */
    	        dlclose(handle);
    	}
     
                    ux_free(&data);
                     exit (0);
    ...
    j'ai bien a la fin le resultat de la fonction de la lib : name=<result de la fonction de libspv.so>

    mais j'ai un vilain coredump a la suite :
    Segmentation fault (core dumped)


  10. #10
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    C'est bon les zipotes, j'ai trouvé !!!
    J'ai définie mes flags de mon makefile a ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CC="/usr/bin/gcc"
    LFLAGS="-v -fpic -fPIC -D__EMX__ -D_OPT_THREAD -Dlinux"
    LDFLAGS="-L/usr/lib -lbsd -lnsl -lm -lz -ldl -lpthread"
    Par rapport a mon précédent makefile, les options -v -fpic -fPIC -D__EMX__ et -Dlinux sont en plus

    j'ai plus de coredump !!! (enfin pour le moment...)
    youpi !

    thanks.

    Delphine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JBuilder existe sur Linux ?
    Par hm_hopeful47 dans le forum JBuilder
    Réponses: 4
    Dernier message: 21/02/2005, 19h07
  2. performances 9i sur linux
    Par learn dans le forum Oracle
    Réponses: 4
    Dernier message: 17/12/2004, 20h42
  3. quel sgbd sur linux??
    Par fabfab1 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 27/11/2004, 18h38
  4. lancer OEM via le browser (10g sur linux)
    Par learn dans le forum Entreprise Manager
    Réponses: 6
    Dernier message: 20/09/2004, 17h04
  5. [analyse de syntaxe] pour C et C++ sur Linux
    Par Madmac dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/07/2004, 06h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo