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

Autres éditeurs Discussion :

Bibliotheque partage (.so) et gcc dans Linux


Sujet :

Autres éditeurs

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut Bibliotheque partage (.so) et gcc dans Linux
    Bonjour! Ma question concerne les bibliotheque partage dans linux (lib***.so), le compilateur gcc, le linker. (je m'excuse d'avance pour un melange franco-anglais...)

    La question:
    On a un fichier binary et il faut le lier avec une shared library avec un linker. Est-ce possible de rajouter des donnees du fichier source (***.cpp par exemple) a cette bibliotheque PENDANT le processus de linkage? Et comment le faire?

    N'importe quelle reponse irait, mais serais mieux si vous repondez directement pour le compilateur gcc 2.95 (ou plus vieux ~ 2.94....).

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    euhhhhhhhhhh j'ai rien compris à ce que tu as dit
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    pour etre plus court:
    Est-ce qu'il ya un moyen de modifier (ou d'ajouter des elements) une "shared library" (fichier ".so" pour linux = ".dll" pour windows)?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Je n'y crois pas trop ou alors en bidouillant à fond avec les options de ld.

    Ceci est possible avec les librairies statiques. Il est très facile de rajouter un symbole à une archive.

    Mais la tâche se complique pour les librairies dynamiques. Tu aurais la librairie statique équivalente, je te dirais oui. Il te suffit d'utiliser l'option --whole-archive de ld pour ajouter à une librairie dynamique tous les symboles de ta librairie statique ainsi que ceux que tu veux en plus. On ne peut pas imaginer utiliser cette option pour une librairie dynamique : il y aurait sûrement des multiples définitions.

    Je viens de regarder ce que faisait libtool avec les `convenient libraries`. Les `convenient libraries` sont utilisées pour créer plusieurs librairies qu'on réunit au final dans une seule et même librairie. Mais dès qu'on travaille avec ces librairies, libtool ne génére plus que des libraries statiques. Seule la librairie finale peut être dynamique. A croire que ton problème n'a pas de solution.

    Voilà ce que je peux dire. Mais maintenant si quelqu'un voit un moyen de faire, propre, je suis preneur aussi...

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    mais il doit y avoir une solution. pour l'instant je cherche sans arret mais je ne trouve rien, peut etre parce que je suis loin d'etre expert dans ce theme.

    Mais a ce que j'ai compris libtool c'est l'un des meilleurs programmes pour gerer les libraries?
    Et qu'est ce que vous en dites de "dlopening" ou de "Reloadable objects" ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    dlopening c'est pour charger une librairie dynamique à l'éxécution. Ca ne rajoute pas le symbole dans la librairie.

    J'ai regardé "reloadable objects" de libtool.
    Ca s'applique aux objets pas aux librairies dynamiques.

    On a un fichier binary et il faut le lier avec une shared library avec un linker. Est-ce possible de rajouter des donnees du fichier source (***.cpp par exemple) a cette bibliotheque PENDANT le processus de linkage?
    Et si on revenait au problème de base. Quelle est la question, en clair ?
    Il est toujours possible de générer une nouvelle librairie dynamique qui contiennent les symboles du fichier "binary" mais sûrement pas tous les symboles de la "shared library".

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par aoyou Voir le message
    J'ai regardé "reloadable objects" de libtool.
    Ca s'applique aux objets pas aux librairies dynamiques.
    Oui, mais vu qu'on cree les librairies a partir d'objets...peut etre qu'il y a un moyen d'utiliser cette methode? C'est vrai qu'ici on ne va pas modifier la librairie dynamique elle-meme, mais on va modifier les fichiers objets (par ex. coller/rajouter un fichier objet additionnel), et creer une nouvelle librairie dynamique a partir du nouveau fichier objet?

    Citation Envoyé par aoyou Voir le message
    Il est toujours possible de générer une nouvelle librairie dynamique qui contiennent les symboles du fichier "binary" mais sûrement pas tous les symboles de la "shared library".
    (J'ai pas compris, librairie dynamique = shared library, non?) Et comment on peut le faire?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    J'ai fait quelques essais avec reloadable objects mais ld ne tient pas compte des librairies dynamiques.

    Sinon, un petit exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* ld1.c */
    int fonction1 () {return 1;}
    int fonction2 () {return 2;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* ld2.c */
    int fonction3 () {return fonction1 ();}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* myld.c */
    int main () {
      fonction2();
      fonction3();
      return 0;
    }
    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
    #Compilation
    gcc -c ld1.c ld2.c myld.c
    
    # Generation libld1.dll
    gcc -shared -o libld1.dll ld1.o
    
    # Generation libld2.dll
    gcc -shared -o libld2.dll ld2.o
    ld2.o:ld2.c:(.text+0x7): undefined reference to `_fonction1'
    collect2: ld returned 1 exit status
    gcc -shared -o libld2.dll ld2.o -L. -lld1
    
    # Generation myld.exe
    gcc -o myld.exe myld.o -L. -lld2
    myld.o:myld.c:(.text+0x30): undefined reference to `_fonction2'
    collect2: ld returned 1 exit status
    gcc -o myld.exe myld.o -L. -lld2 -lld1
    
    # Symboles
    nm libld1.dll | grep fonction
    10001000 T _fonction1
    1000100a T _fonction2
    nm libld2.dll | grep fonction
    100040c8 I __imp__fonction1
    100013f0 T _fonction1
    10001000 T _fonction3
    Le symbole _fonction2 n'est pas dans libld2.dll car la fonction fonction2() n'est pas appelé dans fonction3(). Seule le symbole _fonction1 reste.
    Si j'ai besoin d'utiliser fonction2 dans un programme, il faut aussi linker contre libld1.dll.

    Sous Linux, les librairies dynamiques peuvent contenir des symboles indéfinis. Il n'y aura donc pas d'échec si on ne linke pas libld2.so contre libld1.so. Toutefois, si on linke contre, il n'y alors pas besoin de linker myld.exe contre libld1.so, libld2.so retenant où se trouve libld1.so. A vérifier pour gcc 2.95.

    On peut donc générer une seconde librairie dynamique (qui sait où se trouve la première sous Linux) mais cette seconde librairie ne contiendra jamais tous les symboles de la première. Il faut les deux librairies alors que le problème initial était d'ajouter un symbole à une librairie.

    Si quelqu'un a la solution... mais je ne crois pas en une solution uniquement avec des librairies dynamiques.

  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par aoyou Voir le message
    Il faut les deux librairies alors que le problème initial était d'ajouter un symbole à une librairie.
    ...ca ne resolu toujours pas le probleme...
    Peut etre que pour ajouter un symbole à une librairie il faut utiliser un autre programme (comme libtool, a ce que j'ai compris, mais avec libtool, malheureusement, on ne peut pas le faire)?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Au moins sous Linux, l'utilisateur ne voit qu'une seule librairie même si derrière il y en a deux.

    Après plusieurs lectures et essais, je suis de plus en plus convaincu que ce n'est pas possible. Sous Windows, il est possible d'écrire un fichier .def permettant de dire quels symboles doivent être exportés dans la DLL. J'ai réussi à générer une DLL contenant tous les symboles à partir de la DLL d'origine. Mais elle n'est pas valide. La même méthode directement sur les fichiers objets marche. L'éditeur de liens qui est là pour générer une DLL ne sait que travailler avec des objets et des archives.

    ld combines a number of object and archive files, relocates their data and ties up symbol references. Usually the last step in compiling a program is to run ld.
    Libtool n'est qu'un outil générique pour créer des bibliothèques. Il encapsule les outils GNU de compilation tels que gcc ou ld en simplifiant leur utilisation. Qui dit simplification dit perte de possibilité.

    Ce problème ne devrait jamais se poser. S'il manque un fichier dans une librairie, eh ben on recompile la librairie. Ca a l'avantage d'être beaucoup plus propre que de hacker la librairie par la suite.

    Il n'y a pas moyen de récupérer tous les .o qui ont servi à la compilation ou une librairie statique équivalente ?

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Il n'y a pas moyen de récupérer tous les .o qui ont servi à la compilation ou une librairie statique équivalente ?
    ...non...
    Mais c'est vrai que ca commence a ressembler au hackage , des trucs dans le genre de disassembleur - sans doute c'est possible de faire qqch dans ce genre. Mais bon, ce n'est pas ce que je cherchais.

  12. #12
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Rebonjour!
    Je me suis dit que je pourrais trouver des tonnes d'info dans "man gcc" ou bien, aussi, j'ai entendu parler de "info gcc" - qqn peut me dire ou puis je trouver "info gcc"? (C'est une commande dans linux?)

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    C'est une commande. Mais c'est du côté de ld qu'il faut chercher.
    gcc -u ? Je n'ai jamais compris comment l'utiliser.

  14. #14
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Je precise un peu ma question:
    Comment linker une lib dynamique (*.so) contre un binaire pour ensuite faire des modifications dans cette lib dynamique (plus precisement - dans une section de cette lib) a partire du fichier binaire?

    (Comme exemple:
    On a un programme executable et un fichier de configuration (*.conf). Apres avoir demarre le programme on change son exterieur (par exemple la couleur de la fenetre par defaut est blanche et on la change en rouge) et ensuite on ferme le programme.
    La prochaine fois qu'on demarre ce programme - la couleur de la fenetre sera rouge des le debut (par defaut).
    Donc le changement qu'on a fait dans le programme avais ete sauvegarde dans le fichier de configuration (*.conf). C'est a peu pres de ca que je parle.)

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Dans ce cas, ce n'est plus de l'ajout de symboles mais de la surcharge de symboles. Ca se fait pour débugger mais ça ne devrait pas sortir de ce champ...
    Si ça peut aider... http://chl.be/glmf/ilay.org/yann/articles/dlfcn/

  16. #16
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Et la modularite ("modularity") - ca a avoir qqch avec ma question?
    C'etait ecrit, que ca permet de faire des changements aux code et donnees dans une lib dynamique a partir d'une application sans la modifier.

    Merci pour le lien - je vais voir.

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Citation Envoyé par 00700 Voir le message
    Et la modularite ("modularity") - ca a avoir qqch avec ma question?
    C'etait ecrit, que ca permet de faire des changements aux code et donnees dans une lib dynamique a partir d'une application sans la modifier.
    J'aimerais bien voir le site qui parle de ça.

  18. #18
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Voici ou j'ai vu cette info: http://en.wikipedia.org/wiki/Dynamic_link_library
    (Dans la partie "Background")

    J'ai aussi trouve une page, ou on parle, a ce que j'ai compris, de la meme chose que dans le lien que tu a donne (http://chl.be/glmf/ilay.org/yann/articles/dlfcn/) -
    http://www.linuxjournal.com/article/7795 .
    Ca parle aussi du prechargement, mais je n'ai pas tout a fait compris ce moment - quand on precharge une lib en utilisant LD_PRELOAD, on peut modifier la lib existente, ou bien on peut la precharger temporairement et rien modifier?

    Je crois que c'est la reponse a ma question initiale, mais je suis pas tout a fait sur...

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Voici ou j'ai vu cette info: http://en.wikipedia.org/wiki/Dynamic_link_library
    (Dans la partie "Background")
    D'accord. Ce n'est pas la réponse au problème. Ceci veut juste dire qu'on peut changer le comportement d'une application en changeant les DLLs sur lesquels s'appuient l'application. Mais bien sûr, il faut recompiler les DLLs.

    Le préchargement ne permet pas de modifier une librairie (ou un programme). Il en modifie juste le comportement en substituant un symbole par un autre à l'exécution, pour des besoins de debug...

    Tout ceci confirme qu'il n'est pas possible de rajouter un symbole à une librairie après coup. Il est déjà assez difficile de substituer un symbole et encore on ne modifie pas la librairie.

  20. #20
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Et si on parlait des sections d'une lib dynamique?
    Ca ne serait pas possible de "reserver" une section pour ensuite pouvoir y faire des modifications (de linker contre un binaire, un "jpg" par exemple, ou nimprte qui...) - linker de sorte, que les donnees des quelles est constitue le "jpg" soient introduites dans la section de la lib? (ensuite on peut changer ses donnees par des donnees d'un autre fichier binaire...et de suite)

    Je cherche du cote de "man ld" - il est vraiment grand...
    Mais bon j'ai deja trouve qqch qui permet d'avoir acces aux donnees de la lib: MIPS ECOFF (c'est un format des fichier objets), libelf, mais je ne suis pas sur que c'est ce qu'il faut
    Si vous aves des propositions, n'hesitez pas!

    PS: Je viens de trouver un lien ou ca parle des sections!
    http://www.gnu.org/software/binutils.../ld.html#SEC17
    voila
    Je crois que ca correspond tout a fait a ma question d'en haut, non?

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/06/2008, 13h37
  2. [débutant]compiler avec gcc sous linux
    Par Ickou dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/03/2006, 17h27
  3. [Partage de fichiers] Impossible dans un sens
    Par Raideman dans le forum Windows XP
    Réponses: 5
    Dernier message: 19/12/2005, 09h54
  4. Utilisation de classes C++ dans linux
    Par DestinyWar45 dans le forum Linux
    Réponses: 4
    Dernier message: 10/10/2005, 13h33
  5. Installer gcc sur linux SuSE
    Par rabobsky dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 18/03/2005, 18h28

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