top of page
Rechercher

Le Linker Script : L'Art de l'Organisation Mémoire

  • Photo du rédacteur: Renaud Jordi
    Renaud Jordi
  • 16 mai
  • 2 min de lecture

Aujourd'hui, les coulisses de la compilation : le fichier linker script (.ld) 🙂


Tout développeur embarqué le sait : la mémoire est une ressource précieuse qu'il faut savoir organiser efficacement. C'est là qu'intervient le linker script, ce fichier souvent mystérieux, mais essentiel 😉


Dans un système embarqué, nous avons différents types de mémoire à notre disposition. Par exemple :

  • La Flash : pour stocker le code et les données constantes

  • La RAM : pour les variables et la pile d'exécution

  • L'EEPROM : pour les données modifiables et persistantes


Le linker script permet de définir précisément ces espaces et où placer chaque élément de notre programme (variables dans la RAM, code dans la flash…).

Pour commencer, il faut définir chacune de ces mémoires avec son adresse de départ, sa taille et ses propriétés (lecture possible ?, écriture possible ?, exécution possible ?). Par exemple, une flash de taille 32KB à l’adresse 0xF1000 sera définie comme suit :

MEMORY {
  flash (rx) : ORIGIN = 0xF1000, LENGTH = 32K
}

Certains microcontrôleurs ont plusieurs RAM dans le même chip avec des propriétés différentes : plus rapide, plus grande, avec accès DMA… Nous pouvons justement toutes les définir ici.


Ensuite, pour faire le lien avec le code source, 4 sections sont initialement créées :

  • .text pour le code

  • .rodata pour les constantes

  • .data pour les données initialisées à des valeurs non-nulles dont les valeurs d’initialisation seront stockées dans .rodata

  • .bss pour les données non initialisées explicitement ou initialisées à zéro

En pratique, toute donnée avec adresse déterminée est initialisée à 0 par contrainte du langage C, et est donc placée en zone .bss. Celle-ci sera repeinte à 0 à chaque démarrage afin d’assurer un comportement déterministe.


Vous pouvez ensuite ajouter autant de sections que nécessaire et les utiliser si besoin explicitement dans votre code grâce à la syntaxe suivante :

int variable __attribute__((section("foobar"))) = 10;

Il ne reste plus qu’à allouer ces sections dans les différentes mémoires, et le tour est joué ;)


Encore beaucoup à dire sur ce sujet, nous n’avons fait qu’aborder des concepts, mais maintenant si vous avez des problèmes de linker, vous saurez par où commencer vos recherches ;)



 
 

© LH&TECH, tous droits réservés.

bottom of page