Édition de liens statique vs dynamique : les différences expliquées

L'édition de liens associe votre code compilé au code des bibliothèques qu'il utilise. Avec l'édition de liens statique, le code de bibliothèque nécessaire est copié dans l'exécutable à la compilation : le programme est autonome. Avec l'édition de liens dynamique, l'exécutable enregistre seulement les bibliothèques partagées dont il a besoin, et le système d'exploitation les charge au démarrage du programme : de nombreux programmes peuvent ainsi partager une seule copie. Le statique est plus simple à déployer ; le dynamique économise la mémoire et facilite les mises à jour.

CritèreÉdition de liens statiqueÉdition de liens dynamique
MomentÀ la compilation : le code de bibliothèque est copié dans l'exécutableAu chargement ou à l'exécution : un éditeur de liens dynamique trouve et mappe les bibliothèques partagées (.so, .dll)
Taille de l'exécutablePlus grandePlus petite
Utilisation mémoireChaque programme embarque sa propre copie du code de bibliothèqueUne seule copie d'une bibliothèque partagée peut être partagée par de nombreux processus
Mises à jour et correctifs de sécuritéLe programme doit être recompilé et redistribuéOn met à jour la bibliothèque une fois ; les programmes en profitent sans recompilation (si l'interface reste compatible)
Temps de démarrageLégèrement plus rapideLégèrement plus lent : les symboles doivent être résolus (souvent de façon paresseuse)
DéploiementAutonome : fonctionne sans que les bibliothèques soient installéesNécessite les bonnes versions des bibliothèques sur le système cible, sinon le programme ne démarre pas
Coût à l'exécutionPermet l'optimisation globale du programme et les appels directsLéger surcoût dû aux appels indirects via la GOT et la PLT
Problèmes de versionAucun à l'exécutionIncompatibilités possibles entre le programme et la bibliothèque installée
Usages typiquesFirmware embarqué, outils en un seul fichier, conteneurs minimauxLa plupart des programmes sur les systèmes d'exploitation généralistes, plug-ins, bibliothèques système comme la libc

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Statique
Lorsqu'on veut un binaire autonome qui fonctionne partout, ou lorsqu'il n'y a pas de chargeur de système d'exploitation, comme dans un firmware embarqué.
Dynamique
Lorsque de nombreux programmes partagent les mêmes bibliothèques et qu'on veut économiser la mémoire et corriger les bibliothèques de façon centralisée.

Questions fréquentes

Pourquoi mon programme échoue-t-il avec une erreur de bibliothèque manquante ?

Il a été lié dynamiquement, et la bibliothèque partagée dont il a besoin (un fichier .so ou .dll) n'est pas installée sur cet ordinateur. Installez la bibliothèque ou liez le programme statiquement.

L'édition de liens dynamique économise-t-elle la mémoire ?

Oui. Une seule copie d'une bibliothèque partagée en RAM peut être partagée par de nombreux processus.

L'édition de liens statique est-elle plus rapide ?

Légèrement. Elle évite la résolution des symboles au démarrage et les appels indirects via la GOT et la PLT, et elle permet l'optimisation globale du programme.

Pourquoi l'édition de liens dynamique facilite-t-elle les mises à jour de sécurité ?

Une bibliothèque partagée peut être corrigée une seule fois, et tous les programmes qui l'utilisent en profitent sans être recompilés.

Vérifier vos connaissances

Quelle description de l'édition de liens statique est correcte ?

  1. ALe code des bibliothèques utilisées est copié et intégré dans l'exécutable
  2. BLes bibliothèques sont chargées et liées à chaque exécution du programme
  3. CTout le traitement est écrit dans un seul fichier source, sans bibliothèque
Afficher la réponse et l'explication

Réponse : A. Le code des bibliothèques utilisées est copié et intégré dans l'exécutable

En édition de liens statique, l'éditeur de liens extrait les fonctions nécessaires de bibliothèques statiques (fichiers .a sous Linux) et les intègre dans l'exécutable. Le programme fonctionne même sans les bibliothèques dans l'environnement d'exécution, et aucune liaison n'est nécessaire au démarrage, mais l'exécutable grossit et chaque programme utilisant la même bibliothèque en possède une copie. Une correction de bogue dans la bibliothèque n'est prise en compte qu'après reconstruction.

Quel est l'avantage de l'édition de liens dynamique (bibliothèques partagées) ?

  1. ALe programme fonctionne toujours même sans les bibliothèques dans l'environnement d'exécution
  2. BPlusieurs programmes peuvent partager une même bibliothèque en mémoire, et la mise à jour de la bibliothèque applique les corrections sans reconstruction
  3. CAucun traitement n'est nécessaire au démarrage, et le démarrage est toujours plus rapide qu'avec l'édition de liens statique
Afficher la réponse et l'explication

Réponse : B. Plusieurs programmes peuvent partager une même bibliothèque en mémoire, et la mise à jour de la bibliothèque applique les corrections sans reconstruction

En édition de liens dynamique, l'exécutable n'enregistre que « quelle fonction de quelle bibliothèque partagée utiliser », et l'éditeur de liens dynamique charge et lie les bibliothèques à l'exécution. Le code des bibliothèques partagées n'étant pas modifié, une seule copie en mémoire physique peut être partagée par de nombreux processus. Les corrections de bogues ou de vulnérabilités se font simplement en remplaçant la bibliothèque. En revanche, la liaison coûte du temps au démarrage.

Un programme utilisant l'édition de liens dynamique, copié sur un autre ordinateur, ne démarre pas. Quelle est la cause la plus probable ?

  1. AL'exécutable contenait tout le code des bibliothèques et était trop gros
  2. BUn programme à liens dynamiques ne peut par principe fonctionner que sur l'ordinateur où il a été construit
  3. CLa bibliothèque partagée nécessaire est absente, ou seule une version incompatible est présente
Afficher la réponse et l'explication

Réponse : C. La bibliothèque partagée nécessaire est absente, ou seule une version incompatible est présente

Un programme à liens dynamiques utilise les bibliothèques partagées présentes sur l'ordinateur d'exécution. Si une bibliothèque nécessaire est absente, ou si seule une ancienne version dépourvue de certaines fonctions existe, l'éditeur de liens dynamique ne peut pas effectuer la liaison et le démarrage échoue. Sous Linux, la commande ldd permet de vérifier les bibliothèques partagées requises par un programme et si elles sont trouvées. Pour faciliter la distribution, on choisit parfois volontairement l'édition de liens statique.

  1. Lors de l'édition de liens avec une bibliothèque statique (fichier .a), qu'est-ce que l'éditeur de liens intègre dans l'exécutable ?
  2. Quel est le rôle de la GOT (table globale des déplacements) utilisée dans les bibliothèques partagées ?
  3. Lorsque 100 processus utilisent la même bibliothèque partagée, quelle est l'utilisation correcte de la mémoire physique ?

Questions d'entraînement sur Éditeurs de liens, chargeurs et exécutables

Termes clés expliqués

Édition de liens statique
Méthode qui copie le code des bibliothèques utilisées dans l'exécutable. Le programme fonctionne même sans les bibliothèques dans l'environnement d'exécution, mais le fichier est plus gros et les correctifs des bibliothèques ne sont pris en compte qu'après reconstruction.
Édition de liens dynamique
Méthode qui charge et lie les bibliothèques partagées à l'exécution. Les bibliothèques peuvent être partagées entre processus et une correction s'applique par simple remplacement, mais des bibliothèques compatibles doivent être présentes dans l'environnement.
Bibliothèque partagée
Bibliothèque chargée à l'exécution par édition de liens dynamique : .so sous Linux, .dll sous Windows. Compilée en code indépendant de la position, ses pages de code peuvent être partagées par de nombreux processus.
Bibliothèque statique
Archive regroupant de nombreux fichiers objets (.a sous Linux). Lors de l'édition de liens statique, l'éditeur de liens n'en extrait que les objets nécessaires pour les intégrer à l'exécutable.

Comparatifs associés