"Habituellement, un programme se trouve sur le disque sous la forme d’un fichier exécutable binaire. Le programme doit être chargé en mémoire et placé dans un processus pour s’exécuter. Ensuite, la plupart du temps, il a la possibilité d’accéder à la mémoire.
Avant d’être exécuté, un programme doit passer par plusieurs étapes. Au début, le programmeur crée un fichier et écrit son programme dans un langage source, le C par exemple.
Un compilateur transforme ce programme en un module objet. Il lie les adresses symboliques, par exemple la variable nb_etudiants, à une adresse relogeable, par exemple « 18 octets à partir du début du module ». Le module objet représente la traduction des instructions en C en langage machine.
Les adresses produites sont généralement relogeables; commençant à l’adresse 00000 et pouvant se traduire en n’importe quel endroit de la mémoire en recevant comme référence initiale le registre de base. Les adresses représentent alors le décalage par rapport à ce registre de base.
On peut faire appel dans le code à des procédures externes, qui se trouvent dans des bibliothèques externes (libraries), par exemple, l’appel à printf. Les appels à des procédures externes sont laissés comme des points de branchements jusqu’à l’étape d’édition de lien (linkage).
L’éditeur de liens (linker) fait correspondre ces points à des fonctions contenues dans les bibliothèques et produit, dans le cas d’une liaison statique, une image binaire. Certains systèmes, notamment Linux/Unix et Windows, autorisent des liaisons dynamiques et reportent la phase d’édition de liens jusqu’à l’instant du chargement. Il faut alors construire les objets et les bibliothèques d’une manière légèrement différente.
Le chargeur effectue les liaisons des appels système avec le noyau, tel que l’appel nanosleep par exemple. Enfin, il charge le programme en mémoire. Sous Linux, le chargeur se nomme ld.so.
Pour effectuer le chargement, le système alloue un espace de mémoire libre et il y place le processus. Il libérera cet emplacement une fois le programme terminé.
Les librairies dynamiques sont extrêmement utiles : elles sont partagées généralement par tous les programmes, et une seule copie est nécessaire pour tous ceux-ci. De plus, on peut mettre les bibliothèques à jour sans avoir à recompiler et on encombre moins les disques, car une seule copie de la librairie est utilisée par tous les programmes. Ce sont les fichiers dll de Windows (dynamic load library) et les fichiers so de Linux (shared libraries)."
Partager