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 :

Librairie partagée versus librairie statique ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut Librairie partagée versus librairie statique ?
    Salut les C,

    En faites je n'arrive pas a déduire d'après ma maigre expérience a quoi bon une bibliothèque statique.

    J'ai déduit:

    que sous Linux une bibliothèque partagée (d'extension *.so) est charger en RAM au démarrage puis si un programme a besoin d'une fonction de la bibliothèque partagée il va la chercher en RAM.

    Sous Windows ce sont des fichiers d'extension *.dll qui doivent se trouver dans le dossier ou est situé l'exécutable.

    Pour les bibliothèques statiques:
    sous Windows il les faut afin qu'on puisse linker la bibliothèque pour son programme.
    sous Linux: je ne sais pas...

    Corriger moi si j'ai dit des bêtises.

    Je vous pris, si vous le désirez bien, de bien vouloir m'informer sur ces 2 types de bibliothèques.

    Merci pour vos réponses éclairées.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    À ma connaissance, sous aucun des deux OS une bibliothèque dynamique/partagée n'est chargée en RAM tant qu'aucun programme n'en a eu besoin.
    De plus, il y a des conditions au fait que le segment de code d'une bibliothèque dynamique/partagée soit réellement partagé en RAM par plusieurs processus: Sous Windows, il ne faut pas que la bibliothèque ait subit un relogement lors de son chargement, il faut donc qu'il n'y ait rien qui occupe l'adresse préférée de la bibliothèque à ce moment-là (comme une autre bibliothèque dynamique compilée avec les mêmes paramètres). Il y a probablement d'autres prérequis comme l'appartenance de tous les processus impliqués au même utilisateur.

    Les bibliothèques dynamiques sont nécessaires lors de l'exécution. Elles peuvent être "trouvées" à divers endroits par le code de chargement: Sous Linux, il me semble que la variable d'environnement LD_LIBRARY_PATH est là pour ça; sous Windows, il y a tout un ordre de recherche, commençant par le répertoire de l'EXE et finissant par les répertoires de la variable d'environnement PATH.

    Les bibliothèques dynamiques/partagées peuvent être liées complètement dynamiquement lors de l'exécution avec les fonctions de chargement (dlopen() / LoadLibrary()), permettant d'obtenir des pointeurs vers les fonctions contenues (dlsym() / GetProcAddress()), mais peuvent aussi être liées mi-dynamiquement mi-statiquement lors du chargement du programme, permettant des appels de fonction normaux. J'ignore comment c'est fait sous Linux, mais sous Windows, on utilise pour cela une bibliothèque statique d'importation (madll.lib sous Visual, libmadll.a sous MinGW) nécessaire lors de l'édition de liens.*

    *Je ne m'attarderai pas ici sur les DLLs .Net, qui au lieu d'avoir un .lib séparé, accomplissent les deux rôles à la fois.


    Les bibliothèques statiques normales sont nécessaires lors de l'édition de liens, et leur contenu est directement intégré dans l'exécutable obtenu. Ainsi, si un exécutable n'utilise aucune bibliothèque dynamique, l'exécutable seul suffit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Une lib statique est intégrée dans l'exécutable, donc tu ne verras pas de dépendance.

    Cela peut être utile par exemple si une partie de ton code fait de la crytographie/vérification de mot de passe : tu ne veux pas forcément dépendre d'une lib dynamique qui est donc remplaçable par n'importe quel programme, tu voudras surement embarquer cette lib dans ton programme, quitte à devoir relivrer en cas de découverte d'un problème.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci beaucoup a vous deux pour ces précisions même si j'avoue que je n'ai pas tout compris.

    J'avais dit sur un autre forum qu'une bibliothèque partagée sous Linux est charger en RAM au démarrage et personne ne m'a contredit, apparemment que si un programme en a besoin comme a dit medinoc, ce qui permet de gagner de la place.
    Car j'avais créer une shared library (GHOBDCalc) et l'on a critiquer le fait que ce soit une bibliothèque partager me conseillant de faire une bibliothèque statique (moins lourde).

    Vous m'avez confirmer ce que je pensais: sous Linux une bibliothèque statique introduit les fonctions de la library dans l'exécutable grâce a son linkage.

    Et sous Windows elles sont nécessaire au linkage de la bibliothèque, bibliothèques statiques d'inclusion.

    D'ailleurs ont m'a recommandé d'utilisé libtool pour la distribution de libraries, outil qu'il n'est pas facile a prendre en mains (je viens de commencer a lire la documentation), surtout quand on ne connais que le stricte minimum d'un Makefile comme moi (pas de connaissances concernant autotools).

    Encore merci pour vos réponses éclairées.

    PS: Sur mon OS Linux la variable d'environnement LD_LIBRARY_PATH n'est pas définis par défaut.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Note: Les bibliothèques statiques ordinaires existent aussi sous Windows. C'est juste qu'on en voit moins.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    J'avais dit sur un autre forum qu'une bibliothèque partagée sous Linux est charger en RAM au démarrage et personne ne m'a contredit, apparemment que si un programme en a besoin comme a dit medinoc, ce qui permet de gagner de la place.
    Je confirme ce point : la lib n'est chargée que sur demande (et heureusement !).

    Sur mon OS Linux la variable d'environnement LD_LIBRARY_PATH n'est pas définis par défaut.
    À ne pas utiliser si tu peux t'en passer. En gros, tu dois faire ta bibliothèque, et la lier à ton programme (-l sous gcc si je me souviens bien), et préciser à ton exécutable ou est-ce qu'il devra chercher ses librairies dynamiques lors de l'exécution (avec -Wl,rpath=... dans gcc par exemple).
    la variable d'environnement LD_LIBRARY_PATH permet à un utilisateur de définir un autre chemin, prioritaire, où chercher les librairies. Tu ne peux donc pas supposer que cette variable sera définie, ni quel sera son contenu.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Comme j'ai dit précédemment j'ai commencer a lire la doc de libtool et je suis perdus entre les options de GCC:

    -rpath

    ou les outils comme :
    -ar
    -ranlib
    etc...

    est-ce-que quelqu'un pourrait m'expliquer ou du moins m'aider un peu:

    Voici par exemple le Makefile de ma library partagée GHOBDCalc:

    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
     
    CC=gcc
     
    LIB_PATH=/usr/lib 
    SYS_MANPATH=/usr/share/man/man3/
    INCLUDE_PATH=/usr/include 
    LIBRARY_PATH=/usr/share/hobdcalc
     
    PWD := $(shell pwd)
    CUR_MANPATH=$(PWD)/manpages/
     
    CFLAGS_MK_OBJ=-fPIC -c
    CFLAGS_MK_SO=-shared -Wl,-soname=libHOBDCalc.so.1
     
    default: 
    	$(CC) $(CFLAGS_MK_OBJ) Hobdcalc.c -o Hobdcalc.o
     
    	$(CC) $(CFLAGS_MK_SO) Hobdcalc.o -o libHOBDCalc.so.1.0.0
     
    	install -m 0755 libHOBDCalc.so.1.0.0 $(LIB_PATH)
    	ldconfig
    	ln -s /usr/lib/libHOBDCalc.so.1 /usr/lib/libHOBDCalc.so
    	cp hobdcalc.h $(INCLUDE_PATH)
    	mkdir $(LIBRARY_PATH)
    	cp hobdcalc_assertions.c $(LIBRARY_PATH) 
     
    	gzip $(CUR_MANPATH)*
    	cp $(CUR_MANPATH)* $(SYS_MANPATH)
     
    	rm Hobdcalc.o
    	rm libHOBDC*
    Toute aide est la bienvenue: liens, tutoriel a lire, explications, conseils...

    Merci pour votre précieuse aide.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/10/2006, 07h31
  2. Librairie partagé VS librairie statique
    Par Madmac dans le forum Linux
    Réponses: 4
    Dernier message: 03/02/2006, 21h09
  3. Recompiler une librairie dynamique (DLL) en statique
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 07/04/2005, 19h28
  4. [UNIX Forte 6.1 G++] pbl chargement de librairie partagée
    Par claudio.matzke dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/10/2003, 14h45
  5. Réponses: 2
    Dernier message: 30/09/2003, 15h57

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