La relocalisation est le processus d'attribution d'adresses de chargement pour le code et les données dépendant de la position d'un programme et d'ajustement du code et des données pour refléter les adresses attribuées. Avant l'avènement des systèmes multiprocessus, et encore dans de nombreux systèmes embarqués, les adresses des objets sont absolues à partir d'un emplacement connu, souvent zéro. Étant donné que les systèmes multiprocesseurs lient et basculent dynamiquement entre les programmes, il est devenu nécessaire de pouvoir relocaliser les objets à l'aide d' un code indépendant de la position . Un éditeur de liens effectue généralement la relocalisation en conjonction avec la résolution de symboles , le processus de recherche de fichiers et de bibliothèques pour remplacer les références symboliques ou les noms de bibliothèques par des adresses utilisables réelles en mémoire avant d'exécuter un programme.
La relocalisation est généralement effectuée par l'éditeur de liens au moment de la liaison , mais elle peut également être effectuée au moment du chargement par un chargeur de relocalisation , ou au moment de l'exécution par le programme en cours d'exécution lui-même . Certaines architectures évitent entièrement la relocalisation en différant l'affectation d'adresse au moment de l'exécution ; comme, par exemple, dans les machines à pile avec une arithmétique d'adresse nulle ou dans certaines architectures segmentées où chaque unité de compilation est chargée dans un segment distinct.
Segmentation
Les fichiers objets sont segmentés en différents types de segments ou sections de mémoire. Les exemples de types de segments incluent le segment de code (.text) , le segment de données initialisé (.data) , le segment de données non initialisé (.bss) ou d'autres définis par le programmeur, tels que les segments communs ou les segments statiques nommés.
Table de relocalisation
La table de relocalisation est une liste de pointeurs créée par le traducteur (un compilateur ou un assembleur ) et stockée dans le fichier objet ou exécutable. Chaque entrée de la table, ou « correction », est un pointeur vers une adresse absolue dans le code objet qui doit être modifiée lorsque le chargeur déplace le programme afin qu'il fasse référence à l'emplacement correct. Les corrections sont conçues pour prendre en charge la relocalisation du programme en tant qu'unité complète. Dans certains cas, chaque correction dans la table est elle-même relative à une adresse de base de zéro, de sorte que les corrections elles-mêmes doivent être modifiées lorsque le chargeur se déplace dans la table.
Dans certaines architectures, une correction qui dépasse certaines limites (comme une limite de segment) ou qui n'est pas alignée sur une limite de mot est illégale et signalée comme une erreur par le lieur.
DOS et Windows 16 bits
Les pointeurs lointains ( pointeurs 32 bits avec segment :offset, utilisés pour adresser l'espace mémoire 20 bits de 640 Ko disponible pour les programmes DOS ), qui pointent vers du code ou des données dans un exécutable DOS ( EXE ), n'ont pas de segments absolus, car l' adresse réelle du code/des données dépend de l'endroit où le programme est chargé en mémoire et cela n'est pas connu jusqu'à ce que le programme soit chargé.
Les segments sont des valeurs relatives dans le fichier EXE DOS. Ces segments doivent être corrigés lorsque l'exécutable a été chargé en mémoire. Le chargeur EXE utilise une table de relocalisation pour trouver les segments qui doivent être ajustés.
Windows 32 bits
Avec les systèmes d'exploitation Windows 32 bits, il n'est pas obligatoire de fournir des tables de relocalisation pour les fichiers EXE, car ils constituent la première image chargée dans l'espace d'adressage virtuel et seront donc chargés à leur adresse de base préférée.
Pour les DLL et les EXE qui optent pour la randomisation de la disposition de l'espace d'adressage (ASLR), une technique d'atténuation des exploits introduite avec Windows Vista , les tables de relocalisation redeviennent obligatoires en raison de la possibilité que le binaire puisse être déplacé dynamiquement avant d'être exécuté, même s'il s'agit toujours de la première chose chargée dans l'espace d'adressage virtuel.
Windows 64 bits
Lors de l'exécution de binaires 64 bits natifs sur Windows Vista et supérieur, ASLR est obligatoire et donc les sections de relocalisation ne peuvent pas être omises par le compilateur.
Systèmes de type Unix
Le format exécutable et le format de bibliothèque partagée ELF ( Executable and Linkable Format ) utilisés par la plupart des systèmes de type Unix permettent de définir plusieurs types de relocalisation.
Procédure de déménagement
L'éditeur de liens lit les informations de segment et les tables de relocalisation dans les fichiers objets et effectue la relocalisation en :
- fusionner tous les segments de type commun en un seul segment de ce type
- attribution d'adresses d'exécution uniques à chaque section et à chaque symbole, donnant à tout le code (fonctions) et à toutes les données (variables globales) des adresses d'exécution uniques
- se référer à la table de relocalisation pour modifier les références de symboles afin qu'elles pointent vers les adresses d'exécution correctes
Exemple
L'exemple suivant utilise l'architecture MIX de Donald Knuth et le langage assembleur MIXAL. Les principes sont les mêmes pour toutes les architectures, même si les détails peuvent varier.

- (A) Le programme SUBR est compilé pour produire un fichier objet (B), représenté à la fois sous forme de code machine et d'assembleur. Le compilateur peut démarrer le code compilé à un emplacement arbitraire, souvent l'emplacement 1 comme indiqué. L'emplacement 13 contient le code machine pour l'instruction de saut vers l'instruction ST à l'emplacement 5.
- (C) Si SUBR est ultérieurement lié à un autre code, il peut être stocké à un emplacement autre que 1. Dans cet exemple, le lieur le place à l'emplacement 120. L'adresse dans l'instruction de saut, qui est maintenant à l'emplacement 133, doit être déplacée pour pointer vers le nouvel emplacement du code de l'instruction ST , maintenant 125. [1 61 montré dans l'instruction est la représentation du code machine MIX de 125].
- (D) Lorsque le programme est chargé en mémoire pour être exécuté, il peut être chargé à un autre emplacement que celui assigné par le linker. Cet exemple montre SUBR maintenant à l'emplacement 300. L'adresse dans l'instruction de saut, maintenant à 313, doit être relocalisée de nouveau pour qu'elle pointe vers l'emplacement mis à jour de ST , 305. [4 49 est la représentation machine MIX de 305].