Qu'est-ce que Script d'édition de liens ?

Fichier indiquant à l'éditeur de liens à quelles adresses mémoire placer chaque section. En développement embarqué, il sert à définir le placement en flash et en RAM et l'adresse de la table des vecteurs d'interruption.

Nom japonais: リンカスクリプト

« Script d'édition de liens » apparaît dans 2 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 que décrit un script d'édition de liens

Le compilateur produit des fichiers objets dont le code et les données sont regroupés en sections, comme .text (instructions), .rodata (constantes), .data (variables initialisées) et .bss (variables initialisées à zéro), mais sans adresses finales. Un script d'édition de liens indique à l'éditeur de liens comment les combiner. Dans la syntaxe de GNU ld, un bloc MEMORY déclare des régions avec une origine et une longueur, par exemple la flash à une adresse et la RAM à une autre, et un bloc SECTIONS fait correspondre les sections d'entrée à des sections de sortie et affecte chacune à une région. L'éditeur de liens signale une erreur si une région déborde.

Pourquoi l'embarqué en a besoin

Sur un PC, le chargeur du système d'exploitation décide où se place un programme en mémoire, et un script d'édition de liens par défaut convient presque toujours. Un microcontrôleur sans OS commence à s'exécuter à partir d'adresses fixes à la mise sous tension ; le programme doit donc être construit pour sa carte mémoire exacte. La table des vecteurs d'interruption doit se trouver là où le matériel l'attend, le code et les constantes ont leur place en flash non volatile, et les variables modifiables, le tas et la pile doivent être en RAM. Des puces différentes d'une même famille ne nécessitent souvent qu'un script d'édition de liens différent, car leurs tailles mémoire diffèrent.

Adresse de chargement et adresse d'exécution

Les variables initialisées posent un problème particulier : leurs valeurs initiales doivent survivre à la coupure d'alimentation, elles sont donc stockées en flash, mais le programme y écrit, elles doivent donc résider en RAM à l'exécution. Le script d'édition de liens donne par conséquent deux adresses à .data : une adresse de chargement en flash et une adresse d'exécution en RAM. Il définit aussi des symboles marquant le début et la fin de .data et .bss, et souvent le sommet de la pile. Le code de démarrage utilise ces symboles pour copier .data de la flash vers la RAM et remplir .bss de zéros avant d'appeler main, offrant au C l'état initial qu'il garantit.

Pièges courants

De nombreux problèmes des projets bare-metal proviennent du script d'édition de liens. Lorsque la suppression des sections inutilisées est activée, la table des vecteurs ou d'autres sections référencées uniquement par le matériel peuvent être éliminées si elles ne sont pas marquées comme à conserver. Une région de pile trop petite ne provoque pas d'erreur d'édition de liens, mais écrase silencieusement d'autres données à l'exécution. Placer une section à une mauvaise adresse de chargement laisse les variables avec des valeurs initiales aléatoires. Lire le fichier map que peut produire l'éditeur de liens, qui liste l'adresse de chaque symbole et l'occupation de chaque région, est la méthode standard pour vérifier le résultat.

S'entraîner : questions sur Script d'édition de liens

Quel est le rôle d'un script d'édition de liens (linker script) utilisé en développement embarqué ?

  1. AIndiquer à l'éditeur de liens à quelles adresses, en flash ou en RAM notamment, placer chaque section
  2. BDécrire la procédure d'exécution automatique des tests du programme
  3. CDéfinir les règles d'écriture du code source et signaler les violations
Afficher la réponse et l'explication

Réponse : A. Indiquer à l'éditeur de liens à quelles adresses, en flash ou en RAM notamment, placer chaque section

Avec un OS de PC, le chargeur fixe les adresses, mais sur un microcontrôleur, les adresses présentes à la mise sous tension sont utilisées telles quelles. Le script d'édition de liens indique l'adresse de début et la taille de la flash et de la RAM, et spécifie l'agencement, par exemple .text et les constantes en flash, .data, .bss et la pile en RAM. Les éléments qui doivent se trouver à une adresse fixe, comme les vecteurs d'interruption, y sont aussi spécifiés.

Questions fréquentes

À quoi sert un script d'édition de liens ?

Un script d'édition de liens indique à l'éditeur de liens quelles régions mémoire existent et à quelles adresses placer chaque section de code et de données. Les projets embarqués l'utilisent pour mettre le code en flash, les variables en RAM et la table des vecteurs d'interruption à l'adresse requise.

Quelle est la différence entre .data et .bss ?

.data contient les variables à valeur initiale non nulle, stockées en flash et copiées en RAM au démarrage. .bss contient les variables qui commencent à zéro : elle n'occupe aucune place en flash et est simplement effacée en RAM avant l'exécution de main.

Pourquoi .data a-t-elle deux adresses dans un script d'édition de liens ?

Ses valeurs initiales doivent être stockées en flash non volatile, mais les variables sont modifiées à l'exécution et doivent donc résider en RAM. L'adresse de chargement pointe vers la copie en flash et l'adresse d'exécution vers l'emplacement en RAM qu'utilise réellement le code.

« Script d'édition de liens » dans les explications

Questions mentionnant « Script d'édition de liens » (2)

  1. Quel est le rôle d'un script d'édition de liens (linker script) utilisé en développement embarqué ?
  2. Sur un microcontrôleur sans OS, quel traitement le code de démarrage effectue-t-il juste après la mise sous tension, avant d'appeler main ?

Termes associés

Microcontrôleur Éditeur de liens (linker) Chargeur (loader) Interruption ASLR Bibliothèque partagée Bibliothèque statique Code indépendant de la position Décoration de noms (name mangling) Éditeur de liens dynamique

Retour au glossaire