Qu'est-ce que Éditeur de liens dynamique ?

Logiciel qui, au lancement d'un programme lié dynamiquement, recherche et charge les bibliothèques partagées, effectue la relocalisation et la liaison des symboles, puis démarre le programme. Par exemple ld.so sous Linux.

Nom japonais: 動的リンカ

« Éditeur de liens dynamique » apparaît dans 10 questions d'entraînement réparties sur 1 thèmes, dont Éditeurs de liens, chargeurs et exécutables.

Domaine: Éditeurs de liens, chargeurs et exécutables

Ce qui se passe au lancement d'un programme

Un exécutable ELF lié dynamiquement désigne un interpréteur dans ses en-têtes de programme, comme ld-linux sous Linux. Après qu'execve a projeté le programme en mémoire, le noyau projette aussi cet éditeur de liens dynamique et lui transfère le contrôle plutôt qu'au programme. L'éditeur de liens dynamique lit la liste des bibliothèques nécessaires, les recherche dans les chemins configurés et dans son cache, les projette dans l'espace d'adressage, applique les relocalisations, lie les symboles, exécute les fonctions d'initialisation des bibliothèques (listées dans des sections comme .init_array), puis saute enfin au point d'entrée du programme. Les bibliothèques ouvertes plus tard avec dlopen passent par le même mécanisme.

GOT, PLT et liaison paresseuse

Les bibliothèques partagées sont compilées en code indépendant de la position : leurs pages de code ne contiennent aucune adresse absolue d'autres modules. Le code lit plutôt les adresses dans la table globale des décalages (GOT), une table de données modifiable que l'éditeur de liens dynamique remplit. Les appels de fonctions passent par des stubs de la table de liaison des procédures (PLT). Avec la liaison paresseuse (lazy binding), le premier appel via un stub entre dans le résolveur de l'éditeur de liens, qui écrit l'adresse réelle dans la GOT, et les appels suivants y sautent directement. De nombreux systèmes lient au contraire tout au démarrage puis rendent la GOT en lecture seule (full RELRO) afin de bloquer les attaques par écrasement de la GOT.

Éditeur de liens dynamique et éditeur de liens statique

L'éditeur de liens statique (ld) s'exécute à la compilation : il combine les fichiers objets, résout les symboles et applique la plupart des relocalisations, produisant un exécutable. L'éditeur de liens dynamique s'exécute à chaque démarrage du programme et achève le travail pour les bibliothèques partagées. C'est cette répartition qui permet à une seule copie physique du code d'une bibliothèque d'être partagée par de nombreux processus, et à un correctif de sécurité d'atteindre tous les programmes en remplaçant un seul fichier. La contrepartie est un travail supplémentaire au démarrage et la dépendance à la présence des bonnes versions de bibliothèques sur la machine cible.

Le contrôler et le déboguer

La plupart des échecs au démarrage des programmes liés dynamiquement sont dus à des bibliothèques manquantes ou incompatibles ; la commande ldd liste les dépendances et indique celles qui sont introuvables. Sous Linux, des variables d'environnement comme LD_LIBRARY_PATH ajoutent des répertoires de recherche et LD_PRELOAD injecte une bibliothèque avant les autres, ce qui est utile pour le débogage et l'instrumentation. Les auteurs de bibliothèques peuvent accélérer le chargement en n'exportant que les fonctions publiques et en marquant les symboles internes comme cachés (hidden), ce qui réduit le nombre de symboles que l'éditeur de liens dynamique doit traiter et permet aux appels internes de contourner la PLT.

S'entraîner : questions sur Éditeur de liens dynamique

Quel est le rôle de l'éditeur de liens dynamique (ld.so, etc.) qui intervient au démarrage d'un programme à liens dynamiques sous Linux ?

  1. ACompiler le code source pour produire du langage machine
  2. BRechercher les bibliothèques partagées nécessaires, les charger en mémoire, lier les symboles puis lancer le programme
  3. CRéorganiser l'espace libre du disque après la fin du programme
Afficher la réponse et l'explication

Réponse : B. Rechercher les bibliothèques partagées nécessaires, les charger en mémoire, lier les symboles puis lancer le programme

Un exécutable à liens dynamiques indique l'emplacement de l'éditeur de liens dynamique à utiliser ; après avoir chargé le programme, l'OS passe d'abord la main à celui-ci. L'éditeur de liens dynamique recherche et charge les bibliothèques partagées nécessaires, effectue la relocalisation et la liaison des symboles, puis transfère le contrôle au point d'entrée du programme. Le chargement supplémentaire de bibliothèques en cours d'exécution par dlopen relève aussi de l'éditeur de liens dynamique.

Questions fréquentes

Qu'est-ce que ld.so sous Linux ?

C'est l'éditeur de liens et chargeur dynamique : le programme que le noyau exécute en premier pour un exécutable lié dynamiquement, qui charge les bibliothèques partagées, résout les symboles puis démarre le programme.

Pourquoi mon programme indique-t-il qu'une bibliothèque partagée est introuvable ?

L'éditeur de liens dynamique n'a pas pu localiser une bibliothèque requise dans ses chemins de recherche, ou n'y a trouvé qu'une version incompatible. Exécuter ldd sur le programme indique quelle dépendance manque.

Quelle différence entre la GOT et la PLT ?

La GOT est une table de données contenant les adresses résolues, remplie par l'éditeur de liens dynamique, tandis que la PLT est un ensemble de petits stubs de code par lesquels passent les appels de fonctions externes, qui lisent leurs cibles dans la GOT.

« Éditeur de liens dynamique » dans les explications

Questions mentionnant « Éditeur de liens dynamique » (10)

  1. Quel est le rôle de l'éditeur de liens dynamique (ld.so, etc.) qui intervient au démarrage d'un programme à liens dynamiques sous Linux ?
  2. Quelle description de la relocalisation effectuée par l'éditeur de liens est correcte ?
  3. Quel est l'avantage de l'édition de liens dynamique (bibliothèques partagées) ?
  4. Un programme utilisant l'édition de liens dynamique, copié sur un autre ordinateur, ne démarre pas. Quelle est la cause la plus probable ?
  5. Quel est le rôle de la GOT (table globale des déplacements) utilisée dans les bibliothèques partagées ?
  6. En édition de liens dynamique, quelle description de la liaison différée (lazy binding) utilisant la PLT (table de liaison des procédures) est correcte ?
  7. Que fait le chargeur de l'OS au démarrage d'un programme (execve sous Linux notamment) ?
  8. En désassemblant un fichier objet, on constate que la destination de l'instruction appelant la fonction externe printf a une valeur provisoire comme 0. Quand cette valeur est-elle correctement renseignée ?
  9. Lors de la création d'une bibliothèque partagée, quel est l'avantage de n'exporter que les fonctions utilisées de l'extérieur et de régler la visibilité des symboles des fonctions internes sur « hidden » ?
  10. En C++, quel est le mécanisme correct par lequel les constructeurs d'objets globaux s'exécutent avant main ?

Termes associés

Édition de liens dynamique GOT (table globale des décalages) Relocalisation Éditeur de liens (linker) PLT (Procedure Linkage Table) Point d'entrée Bibliothèque partagée Édition de liens statique Code indépendant de la position Via

Retour au glossaire