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.
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.
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.