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

C Discussion :

Modification dynamique du LD_LIBRARY_PATH pour dlopen()


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 50
    Points
    50
    Par défaut Modification dynamique du LD_LIBRARY_PATH pour dlopen()
    Bonjour,

    Voilà mon problème. Je fais un petit programme qui reçoit en entrée un ficher XML contenant entre autres une liste de librairies (.so) à charger.
    Ce fichier contient également le ou les répertoires dans le(s)quel(s) on peut trouver ces librairies.
    Un exemple de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <Appli>
      <LibDir mode="relative" name="./Lib" />
      <LibDir mode="absolute" name="/home/noodles/Lib" />
      <Dependency lib="action1.so" />
      <Dependency lib="action2.so" />
    </Appli>
    Mon programme parse ce petit fichier, puis tente de charger dynamiquement les librairies.

    Ma première idée était que le programme rajoute dans la variable d'environnement LD_LIBRARY_PATH les chemins fournis, pour pouvoir charger les librairies.
    J'ai donc procédé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string ld = "LD_LIBRARY_PATH=" + libDir; //libDir parsé depuis le XML
    if (putenv(const_cast<char *>(ld.c_str())) == -1)
      printf("putenv failed \n");
    Ce code marche bien (j'ai vérifié en faisant getenv("LD_LIBRARY_PATH")). Mais quand je fais dlopen(), il me dit qu'il ne trouve pas la librairie, comme si le nouveau LD_LIBRARY_PATH n'était pas pris en compte. Après quelques recherches, j'ai l'impression que le programme charge les variables d'environnement à son lancement, et donc ne les met pas à jour.

    Je me suis donc dis que j'allais mettre directement dans le XML, les chemins complets des librairies. Malheureusement, cela ne marche pas non plus parce que quand dlopen() essaie de resoudre les dépendances, il n'y a pas ce qu'il faut dans le LD_LIBRARY_PATH!


    Donc pour résumer, ma question est : peut-on en C (ou C++), modifier la variable LD_LIBRARY_PATH qui est prise en compte par dlopen() pour ajouter des chemins à prendre en compte...

    Merci

    Noodles

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    C'est plutot une question developpement Linux que C.
    <HS>
    dlopen() prend le chemin complet de la bibliotheque comme premier argument. A priori, LD_LIBRARY_PATH n'est pas pris en compte (c'est utilise par le linker). Donc ton probleme doit venir d'ailleurs.
    </HS>
    Edit: et pendant que j'y pense, ton bout de code est en C++ et est donc aussi HS dans ce forum.

  3. #3
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Ma première idée était que le programme rajoute dans la variable d'environnement LD_LIBRARY_PATH les chemins fournis
    Il me semble que dans ton programme tu n'ajoutes pas, mais que tu écrases.

    Donc 2 solutions :
    (1) tu ne fais plus le putenv et tu ne touches plus au LD_LIBRARY_PATH, et tu garde l'idée de mettre un chemin complet dans le XML
    (2) avant de faire le putenv tu fais getenv et tu bricoles le tout pour avoir une variable qui contient le LD_LIBRARY_PATH avec tous les chemins "concaténées".

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par valefor
    Il me semble que dans ton programme tu n'ajoutes pas, mais que tu écrases.
    En fait le code que j'ai posté est simplifié. En réalité, je lis la variable existante et j'ajoute les chemins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    string ld = "LD_LIBRARY_PATH=";
    string oldPath = getenv("LD_LIBRARY_PATH");
    if(strlen(oldPath))
    {
      ld += oldPath;
      ld += ":";
    }
    ld += libDir; //libDir parsé depuis le XML
    if (putenv(const_cast<char *>(ld.c_str())) == -1)
      printf("putenv failed \n");
    Voilà, donc ca ne vient pas de là...

    Citation Envoyé par DaZumba
    dlopen() prend le chemin complet de la bibliotheque comme premier argument. A priori, LD_LIBRARY_PATH n'est pas pris en compte (c'est utilise par le linker). Donc ton probleme doit venir d'ailleurs.
    Et pourtant, la page de man de dlopen() nous dit :
    Si le nom filename n'est pas un chemin absolu (commençant pas un "/"), le fichier est recherché aux endroits suivants :
    - La liste des répertoires (séparés par des deux-points) contenue dans la variable d'environnement LD_LIBRARY_PATH.
    - La liste des bibliothèques mémorisées dans /etc/ld.so.cache.
    /usr/lib, puis /lib.
    Donc a priori, pas de problème de ce coté là...

    J'ai même essayé d'aller voir ce qu'il y a dans la variable gloable char** environ après le putenv, et les modifications sont prises en compte!

    Donc je ne comprends pas trop!


    Citation Envoyé par DaZumba
    C'est plutot une question developpement Linux que C.
    Edit: et pendant que j'y pense, ton bout de code est en C++ et est donc aussi HS dans ce forum.
    - Le forum Linux regroupe plutôt des questions concernant l'administration système, le réseau, les environnements de bureau, etc. Je pense donc qu'un problème concernant le chargement dynamique en C a sa place ici.
    - Mon bout de code est en C++... effectivement y'a des string!! Cependant, dlopen est une fonction système C, si ca peut te faire plaisir, je mets des char* à la place des string et je serai moins hors-sujet?


    Noodles

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il y a un forum programmation linux: http://www.developpez.net/forums/forumdisplay.php?f=327

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    D'accord, d'accord... devant la fronde générale, j'ai créé un nouveau sujet ici

    Si jamais vous avez des idées...

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/08/2007, 10h33
  2. Modification dynamique de la couche alpha
    Par Daedar dans le forum OpenGL
    Réponses: 6
    Dernier message: 22/10/2005, 14h22
  3. [JTree] Modification dynamique du texte à afficher
    Par jIdJo dans le forum Composants
    Réponses: 2
    Dernier message: 17/06/2005, 16h49
  4. Réponses: 12
    Dernier message: 26/04/2004, 08h32

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