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 :

question sur la compilation statique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 258
    Par défaut question sur la compilation statique
    Bonsoir,

    Je me pose une petite question sur la compilation statique.

    Quand je compile avec 1 bibliothèques, est-ce la bibliothèque complète qui est liée à mon code ou juste les fonctions de celles-ci que j'utilise;

    Merci pour votre réponse.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Salut
    Question que je ne m'étais jamais posé. A priori je dirais qu'il s'agit de la bibliothèque intégrale. Je pense que c'est ça parce qu'une bibliothèque possède un index sur ses fonctions permettant un accès plus rapide. Et si c'était juste le code de la fonction qui était intégré dans l'exe, cela rendrait cet index inutile...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 483
    Par défaut
    Bonjour,

    Citation Envoyé par chrtophe Voir le message
    Je me pose une petite question sur la compilation statique.

    Quand je compile avec 1 bibliothèques, est-ce la bibliothèque complète qui est liée à mon code ou juste les fonctions de celles-ci que j'utilise; Merci pour votre réponse.
    Oui, c'est la bibliothèque entière qui est liée à ton programme. Intégrer uniquement les ressources réellement utilisées serait beaucoup plus compliqué que ce que l'on pourrait imaginer car cela demanderait d'une part des infrastructures spéciales permettant d'isoler, d'extraire et de reloger les ressources exploitées (c'est-à-dire pratiquement recompiler la bibliothèque) et en outre, il serait algorithmiquement très compliqué d'affirmer de manière déterministe si le code va réellement être utilisé ou pas.

    Même en considérant qu'à partir du moment où ton programme fait référence à une ressource de ta bibliothèque, celle-ci est considérée comme utilisée, il faudrait passer la bibliothèque elle-même aux rayons X pour affirmer que ses fonctions ne se feront pas références entre elles.

    À dire vrai, le problème se pose également avec les bibliothèques dynamiques : à partir du moment où on en a besoin, celles-ci seront chargées intégralement en mémoire. Cela dit, le mécanisme de pagination qui gère en même temps la mémoire swap fera que seules les pages réellement lues à un instant donné seront chargées dans les faits. Dans le principe, ça semble être la solution au problème. En pratique, ce sera vrai mais seulement avec la granularité d'une page.

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À dire vrai, le problème se pose également avec les bibliothèques dynamiques : à partir du moment où on en a besoin, celles-ci seront chargées intégralement en mémoire. Cela dit, le mécanisme de pagination qui gère en même temps la mémoire swap fera que seules les pages réellement lues à un instant donné seront chargées dans les faits. Dans le principe, ça semble être la solution au problème. En pratique, ce sera vrai mais seulement avec la granularité d'une page.
    Au moins pour les systèmes de type Unix ou Linux, ce mécanisme de chargement en RAM uniquement des pages effectivement accédées est identique qu'il s'agisse de bibliothèques dynamiques ou statiques.

    Il y a deux différences notables qui font que la compilation statique est une technique le plus souvent à oublier:

    • si plusieurs programmes utilisent les mêmes bibliothèques, leur code ne sera chargé qu'une seule fois en RAM si dynamique mais autant de fois qu'il y a de programmes dans le cas de bibliothèques statiques d'ou gaspillage de mémoire et baisse des performances.


    • un programme lié statiquement ne bénéficiera pas de corrections et améliorations apportées par les versions futures des bibliothèques qu'il utilise.


    C'est la raison pour laquelle par exemple Solaris ne fournit plus de versions statique des bibliothèques système depuis 2005.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 258
    Par défaut compilation
    Pour moi, l’intérêt de compiler en statique, c'est de ne pas avoir à installer de bibliothèques, au détriment effectivement de la possibilité de mise à jour, et que 2 logiciels statiques utilisant la même bibliothèque utiliseront plus de mémoire du coup.

    C'est un choix à faire.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Théoriquement, la compilation statique supprime les blocs inutilisés, tandis que la bibliothèque dynamique est indépendante de toute application.

    La notion même de bibliothèque n'existe plus une fois liée statiquement au code de l'exécutable.
    Les fonctions qu'elle définit sont dans le binaire, exactement comme les autres.

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    Les bibliothèques statiques ne sont que des archives de fichiers objets et rien de plus. Pour créer une bibliothèque statique tu n'as d'ailleurs besoin que de tes fichiers objets et d'un archiveur. Sous linux par exemple l'archiveur utilisé est ar (il n'est à ma connaissance plus utilisé sauf pour créer des bibliothèques statiques). Il crée une archive à partir des fichiers objets et ajoute un index pour accéder rapidement au contenu (il y a longtemps un autre utilitaire ranlib construisait cet index, mais il est maintenant intégré à ar).
    L'important dans la création d'une bibliothèque statique n'est pas tant sa création que la segmentation des fichiers objets. Imaginons que tu veuilles créer une bibliothèque statique libstat qui va proposer 3 fonctions : fct1, fct2, fc3. Supposons que fct1 se suffise à elle-même, et que fct2 appelle fct3.
    Si tu définis les 3 fonctions dans un source bigsource.cqui donnera un objet bigsource.o alors lors de l'édition des liens il suffit que tu utilises une seule des trois des fonctions pour te retrouver avec le code des trois dans ton exécutable (bien que gcc par exemple permette aussi de faire de l'optimisation lors de l'édition des liens mais c'est plus difficile/délicat).
    Si tu définis un source par fonction fct1.c, ... alors tu auras trois fichiers objets fct1.o, ... et lors de l'édition des liens seul le code des fonctions utilisées sera lié à ton exécutable, bien que cela dépende aussi des options de compilations. Si tu n'utilises que fct3 alors seul le code de fct3 sera lié, en revanche si tu utilises fct2 alors le code de fct2 et de fct3 seront liés.
    Tout se passe exactement comme si tu n'utilisais pas de bibliothèque statique mais les objets qu'elle contient à la place.
    Les détails précis dépendent de la chaîne de compilation utilisée.

    Les bibliothèques dynamiques doivent contenir tout le code de tous les objets car on ne sait pas comment elles pourront être utilisées.
    On peut lier dynamiquement, c'est-à-dire décider au moment de l''édition des liens que certaines parties de codes se trouveront ailleurs dans une bibliothèque dynamique, le loader de l'OS se débrouillera pour trouver tout ce qu'il faut.
    On peut également charger à l'exécution une bibliothèque dynamique et y chercher du code qui sera exécuté par la suite (ce que font les plugins) mais là tout est à la charge de l'exécutable. Si je ne me trompe pas, toute la bibliothèque sera intégralement mappée en mémoire virtuelle dans les deux cas.
    Les détails précis dépendent principalement de l'os.

  8. #8
    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 jlliagre Voir le message
    Il y a deux différences notables qui font que la compilation statique est une technique le plus souvent à oublier:

    • si plusieurs programmes utilisent les mêmes bibliothèques, leur code ne sera chargé qu'une seule fois en RAM si dynamique mais autant de fois qu'il y a de programmes dans le cas de bibliothèques statiques d'ou gaspillage de mémoire et baisse des performances.


    • un programme lié statiquement ne bénéficiera pas de corrections et améliorations apportées par les versions futures des bibliothèques qu'il utilise.
    A l'inverse, dans certains cas, la compilation dynamique est a oublier :
    • Probleme de mise a jour des versions : on ne compte plus les bibilotheques qui ne sont pas backward compatibles, et qui s'en foutent. Dans ce cas, un simple update de la bibliotheque, et ton programme ne fonctionne plus.
    • Probleme des libs en matiere de securite : n'importe qui (ou presque) peut remplacer la lib dynamique par une version differente, changeant le comportement. C'est d'ailleurs pour cette raison qu'il n'y a pas (ou qu'il ne devrait pas y avoir) de lib incluant des fonctions de securite (login, cryptographie, ...)
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    ah? et libcrypto, libssl et libssh, c'est quoi?

  10. #10
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    C'est plus un problème de sécurité des libs et de l'environnement en général...

    Mais ça n'est pas négligeable non plus comme argument en effet ! (imaginons un script online qui écrit dans les fichiers temporaire un .so/.dll, et force le navigateur à faire un export/setenv... tout peut arriver après !)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Probleme des libs en matiere de securite : n'importe qui (ou presque) peut remplacer la lib dynamique par une version differente, changeant le comportement.
    Normalement sur un système bien configuré, il faut déjà être admin pour ça.
    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.

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pas forcément, il suffit de changer l'environnement pour changer le chemin de recherche de la lib. Ca a même un nom: lib spoofing

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    A l'inverse, dans certains cas, la compilation dynamique est a oublier :
    • Probleme de mise a jour des versions : on ne compte plus les bibilotheques qui ne sont pas backward compatibles, et qui s'en foutent. Dans ce cas, un simple update de la bibliotheque, et ton programme ne fonctionne plus.
    Les bibliothèques correctement développées sont versionnées pour résoudre ce problème.
    • Probleme des libs en matiere de securite : n'importe qui (ou presque) peut remplacer la lib dynamique par une version differente, changeant le comportement. C'est d'ailleurs pour cette raison qu'il n'y a pas (ou qu'il ne devrait pas y avoir) de lib incluant des fonctions de securite (login, cryptographie, ...)
    On ne doit pas vivre dans le même monde ... avoir des binaires liés statiquement à une bibliothèque contenant des failles de sécurité non patchées n'est pas franchement idéal et alors que seul quelqu'un disposant des privilèges requis peut remplacer une bibliothèque dynamique.

Discussions similaires

  1. Question sur la compilation des classes
    Par azerty.123.450 dans le forum Visual Studio
    Réponses: 3
    Dernier message: 26/02/2010, 15h32
  2. question sur la compilation d'un projet
    Par eric_vi dans le forum Qt
    Réponses: 1
    Dernier message: 10/01/2010, 19h55
  3. Questions sur la compilation
    Par LeGEC dans le forum EDI
    Réponses: 3
    Dernier message: 13/05/2008, 12h17
  4. Questions sur la compilation Kernel sous Ubuntu
    Par jaymzwise dans le forum Administration système
    Réponses: 2
    Dernier message: 12/03/2008, 15h29
  5. [Tomcat] question sur la compilation des Jsp
    Par Invité dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 01/06/2006, 10h29

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