Qu'est-ce que Éditeur de liens (linker) ?

Logiciel qui combine plusieurs fichiers objets et bibliothèques, résout les symboles et effectue la relocalisation pour produire un exécutable ou une bibliothèque partagée.

Nom japonais: リンカ

« Éditeur de liens (linker) » apparaît dans 18 questions d'entraînement réparties sur 3 thèmes, dont Éditeurs de liens, chargeurs et exécutables, ISA et assembleur, Compilateurs.

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

La place de l'éditeur de liens dans la compilation

La construction d'un programme C enchaîne normalement le compilateur, qui produit de l'assembleur ou du code objet, l'assembleur, qui produit un fichier objet en code machine, et enfin l'éditeur de liens. Chaque fichier objet est compilé isolément : il contient du code machine et des données, une table des symboles qu'il définit et référence, et des entrées de relocalisation marquant chaque endroit où une adresse est encore inconnue, comme un appel à printf situé dans un autre fichier. L'éditeur de liens combine de nombreux fichiers objets et bibliothèques en un seul exécutable ou une bibliothèque partagée que le système d'exploitation peut charger.

Résolution, placement et relocalisation

Le travail essentiel de l'éditeur de liens comporte trois parties. La résolution des symboles associe chaque nom référencé à exactement une définition, et signale sinon une erreur de référence indéfinie ou de définition multiple. Le placement fusionne les sections de même type de toutes les entrées, comme .text pour le code, .rodata pour les constantes, .data pour les variables initialisées et .bss pour celles initialisées à zéro, et leur attribue leurs adresses finales, souvent sous le contrôle d'un script d'édition de liens. La relocalisation parcourt ensuite chaque entrée de relocalisation et écrit l'adresse absolue ou la distance relative au PC correcte dans le mot d'instruction ou de données.

Édition de liens statique ou dynamique

Une bibliothèque statique (.a sous Linux) est une archive de fichiers objets, et l'éditeur de liens n'y copie que les membres nécessaires pour résoudre les références encore indéfinies, en parcourant les entrées de gauche à droite ; c'est pourquoi les bibliothèques sont listées après les fichiers qui les utilisent. L'édition de liens statique produit un exécutable autonome, mais duplique le code de bibliothèque dans chaque programme, et les correctifs de bibliothèque exigent une nouvelle édition de liens. Avec les bibliothèques partagées (.so), l'éditeur de liens enregistre les dépendances, et l'éditeur de liens dynamique lie les fonctions de bibliothèque au chargement ou à l'exécution via des stubs PLT et la GOT.

Ce qui s'exécute avant main

L'éditeur de liens ajoute aussi des objets de démarrage du runtime C, comme crt1.o, et fait de leur symbole _start le point d'entrée. _start prépare les arguments, initialise la bibliothèque et les objets globaux, puis appelle main et transmet sa valeur de retour à exit. Les constructeurs globaux C++ sont regroupés dans une table .init_array que le code de démarrage appelle avant main. Les compilateurs C++ décorent les noms (name mangling) pour encoder les types des arguments, afin que les fonctions surchargées obtiennent des symboles distincts, et extern "C" désactive cette décoration pour les fonctions partagées avec du code C.

S'entraîner : questions sur Éditeur de liens (linker)

Quel est le rôle principal de l'éditeur de liens (linker) ?

  1. ACombiner plusieurs fichiers objets et bibliothèques, associer les noms à des adresses et produire un exécutable
  2. BDétecter et signaler les erreurs de syntaxe du code source
  3. CLibérer automatiquement la mémoire d'un programme en cours d'exécution lorsqu'elle n'est plus utilisée
Afficher la réponse et l'explication

Réponse : A. Combiner plusieurs fichiers objets et bibliothèques, associer les noms à des adresses et produire un exécutable

L'éditeur de liens associe chaque nom (symbole) référencé dans les fichiers objets à l'entité qui le définit quelque part (résolution des symboles), dispose le code et les données de chaque fichier pour fixer les adresses définitives, et remplace les adresses provisoires dans les instructions par les valeurs correctes (relocalisation). Au besoin, il extrait des fonctions de bibliothèques pour les ajouter. On obtient ainsi un exécutable que l'OS peut charger et exécuter.

Quelle description de la résolution des symboles effectuée par l'éditeur de liens est correcte ?

  1. AAssocier les noms de fonctions et de variables utilisés dans un fichier à leur définition située dans un autre fichier
  2. BRemplacer les noms de variables du code source par des noms courts pour le rendre illisible
  3. CRecalculer en valeurs numériques les expressions contenant des symboles mathématiques
Afficher la réponse et l'explication

Réponse : A. Associer les noms de fonctions et de variables utilisés dans un fichier à leur définition située dans un autre fichier

Si main.c appelle la fonction sum et que sum.c en définit le contenu, main.o contient l'information « référence sum » et sum.o l'information « définit sum ». L'éditeur de liens rassemble les tables des symboles de tous les fichiers objets et trouve, pour chaque référence, une définition correspondante unique. Si aucune définition n'est trouvée, l'erreur « référence non définie » survient ; s'il y en a deux ou plus, l'erreur « définition multiple ».

Questions fréquentes

Quelle est la différence entre un compilateur et un éditeur de liens ?

Un compilateur traduit un fichier source en un fichier objet aux adresses non résolues, tandis qu'un éditeur de liens combine de nombreux fichiers objets et bibliothèques, résout les noms entre eux et fixe les adresses finales pour produire un exécutable.

Pourquoi l'ordre des bibliothèques compte-t-il lors de l'édition de liens avec GCC ?

L'éditeur de liens GNU parcourt les entrées de gauche à droite et n'extrait les membres d'une bibliothèque statique que pour des symboles déjà indéfinis ; une bibliothèque listée avant les objets qui l'utilisent n'apporte donc rien.

Quelle est la différence entre édition de liens statique et dynamique ?

L'édition de liens statique copie le code de bibliothèque nécessaire dans l'exécutable au moment de la construction, tandis que l'édition de liens dynamique laisse des références vers des bibliothèques partagées, que l'éditeur de liens dynamique lie au chargement ou à l'exécution du programme.

« Éditeur de liens (linker) » dans les explications

Questions mentionnant « Éditeur de liens (linker) » (18)

  1. Quel est le rôle principal de l'éditeur de liens (linker) ?
  2. Quelle description de la résolution des symboles effectuée par l'éditeur de liens est correcte ?
  3. Quelle description de la relocalisation effectuée par l'éditeur de liens est correcte ?
  4. 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 ?
  5. Avec l'éditeur de liens GNU, écrire une bibliothèque statique avant le fichier objet qui l'utilise, comme « gcc -lmylib main.o », peut provoquer une erreur de référence non définie. Quelle en est la raison ?
  6. Quel est le traitement correct d'un symbole faible (weak symbol) par l'éditeur de liens ?
  7. Quel est le rôle d'un script d'édition de liens (linker script) utilisé en développement embarqué ?
  8. Pour construire la constante 0x12345FFF en RISC-V avec les deux instructions lui et addi, quelle combinaison est correcte ?
  9. Quel est l'enchaînement courant permettant d'obtenir un exécutable à partir d'un programme C ?
  10. Quelle affirmation concernant le fichier objet (.o) produit par le compilateur à partir d'un fichier source est correcte ?
  11. La même fonction globale void init(void), sans static, est définie à la fois dans a.c et b.c, puis on effectue l'édition de liens. Que se passe-t-il ?
  12. Que signifie l'écriture « extern int count; » en C ?
  13. Quelle description de l'édition de liens statique est correcte ?
  14. Quelle affirmation concernant l'adresse où l'OS commence l'exécution d'un programme C (point d'entrée) est correcte ?
  15. Quel est le principal objectif de la décoration de noms (mangling), par laquelle le compilateur C++ ajoute au nom d'une fonction des informations comme le type de ses arguments pour former le nom de symbole ?

Termes associés

Relocalisation Fichier objet Éditeur de liens dynamique Résolution des symboles Édition de liens dynamique Bibliothèque statique Interruption Chargeur (loader) Assembleur Symbole faible

Retour au glossaire