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

Bibliothèques, systèmes et outils C Discussion :

[Linux] - Exécution d'un programme avec une librairie qui dépend d'une autre librairie


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut [Linux] - Exécution d'un programme avec une librairie qui dépend d'une autre librairie
    Bonjour,

    J'essaie de développer un driver FUSE. Comme le fournisseur de données est développé en Java, j'essaie de faire le lien entre Java et C via une technologie qui s'appelle JNI et qui est faite pour ça.
    Afin d'éviter les problèmes, j'ai fais une première implémentation bidon du driver FUSE entièrement en C et cette implémentation arrive bien à invoquer des fonctions de la libfuse.
    J'ai ensuite fais un appel JNI à un programme C (bidon aussi). Comme JNI invoque des méthodes présentes dans des libs, j'ai compilé le prgramme en question sous forme de lib dynamique (appellons là libmyfs.so) que j'ai chargé depuis le programme Java, et là encore, ça fonctionne.

    Là où ça se gâte c'est quand j'essaye de faire fonctionner JNI et FUSE. Je modifie le source de libmyfs pour qu'elle appelle la libfuse. Ca compile sans problème mais à l'exécution j'ai l'erreur suivante:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/i386-linux-gnu/libmyfs.so: /usr/lib/i386-linux-gnu/libmyfs.so: undefined symbol: fuse_main_real

    Cette fonction fuse_main_real() est dans la libfuse (d'ailleurs j'avais la même erreur au moment de la compilation du programme exécutable lors de la première phase, mais c'était juste parceque pkg-config n'étais pas installé et donc `pkg-config fuse --cflags --libs` ne rajoutais pas la libfuse lors de la compile).

    Je ne sais pas si le problème vient de JNI ou de la façon dont j'ai compilé ma lib libmyfs, donc je cherche des deux cotés pour le moment. Est-ce qu'il y à des options de compilation particulières lorsqu'on compile une lib qui a des dépendances vers une autre lib?

    j'ai utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c myfs.c -I/usr/lib/jvm/java-7-openjdk-i386/include/ `pkg-config fuse --cflags --libs` -D_FILE_OFFSET_BITS=64 -o myfs.o
    gcc -shared -fPIC myfs.o -o libmyfs.so
    Merci d'avance pour votre aide éventuelle.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    Bon finalement j'ai finis par trouver la solution sur un autre site (j'ai bien faillis passer à coté, c'était une ligne noyée dans le code). Je la mets ici pour ceux qui pourraient se poser la question plus tard. Je vais aussi essayer de donner une explication mais comme je ne suis pas trop calé en C, n'hésitez pas à me corriger.

    En fait, j'essayais de charger la libfuse depuis le programme Java (ce qui me semblait logique puisque c'est lui qui exécutait ma lib). Mais il semble y avoir une sorte de vérification statique au chargement des libs dynamiques qui empêche de faire référence à des fonctions d'une autre lib dynamique. Il fallait donc dans le code de libmyfs

    1) Récupérer un handle sur la librairie dynamique dont j'avais besoin (ici libfuse)
    2) Récupérer un handle sur la fonction que je souhaitais appeller dans la librairie en question (ici fuse_main()).

    Le code correct est donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void *libFuseHandle = dlopen("libfuse.so",RTLD_NOW); 
    int (*fuseMain)(int, const char *[], const struct fuse_operations *, void *);
    fuseMain = (int (*) (int, const char *[], const struct fuse_operations *, void *)) dlsym(libFuseHandle, "fuse_main" );
     
    int result = fuseMain( 2, argv, &operations, NULL );

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/05/2016, 13h52
  2. Réponses: 2
    Dernier message: 19/02/2016, 22h12
  3. [AC-2003] Problème avec l'ajout d'un champ à une table qui résulte d'une requête
    Par ostrich95 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/03/2014, 19h12
  4. concevoir une liste qui dépend d'une autre
    Par doomi26 dans le forum Access
    Réponses: 3
    Dernier message: 27/02/2014, 09h27
  5. [XL-MAC 2011] Fonction NB.SI.ENS avec un critère qui dépend d'une cellule
    Par xavion dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/12/2012, 05h57

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