Le module exécutable

Qu'es acò ?

--ooOoo--

          Dans ses grandes lignes la composition d'un programme exécutable est toujours la même aujourd'hui.

En tout premier lieu, qu'est-ce qu'un programme exécutable ?

          C'est un ensemble cohérent d'ordres donnés à une machine pour lui faire faire un travail donné. Ce travail peut être des calculs, des traitements de textes, des ordres donnés à une ou des machines industrielles numériques ou/et analogiques, des surveillances pour la sécurité, des analyses en imageries pour la médecine, etc...

          Ces ordres donnés à la machine doivent être compris par elle. Ils doivent donc être traduits dans son propre code (décimal ou binaire) puis entrés dans sa mémoire pour que son unité centrale puissent les exécuter. C'est le code dit "code-machine".

Donc un programme exécutable est un ensemble d'ordres écrits en langage-machine.

- De quoi est fait ce programme exécutable ?

          Pour construire un exécutable, il faut donc un programme particulier joint à la distribution du système. On l'appelle 'LOADER' car, quand il a terminé, il se charge de monter en mémoire le programme exécutable qu'il vient de construire. Mais le nom de "LINK EDITOR" (éditeur de liens) me paraît plus approprié.

- Comment est construit un programme exécutable ?

          La construction d'un programme principal exécutable consiste donc à effectuer la collecte de toutes les références externes de tous les sous-programmes et fonctions qu'il appelle. Mais la seule collecte ne suffit pas. Il faut établir les liaisons externes aux endroits où elles se trouvent mais il y a aussi des références internes à résoudre.

          La figure ci-contre représente un module intermédiaire c'est à dire un programme, un sous-programme ou une fonction comprenant tout ce qu'il faut pour permettre à l'éditeur de liens de construire un programme définitif donc exécutable. Il y a trois composants majeurs :

  1. le code intermédiaire du module (en marron) : Il est fait d'instructions-machine mais sa référence d'adressage est le début du module, adresse 0 sur la figure. Toutes les adresses du module sont déterminées par rapport à ce zéro là. L'instruction-machine "goto 80" (branch en assembleur), écrite ici en clair pour faciliter la compréhension alors qu'elle est exprimée par une série de chiffres décimaux ou binaires, se trouvant par exemple à l'adresse 50 du module renvoie à l'adresse 80 où se trouve la prochaine instruction-machine à exécuter.
        Lorsque le module sera chargé en mémoire, l'adresse 0 du module correspondra à son adresse réelle d'implantation, disons 'n'. L'adresse relative 80 du "goto" se trouvant à l'adresse 52 devra donc être corrigée en 'n+80' pour qu'elle soit exécutable. On dit que cette adresse est relative ou translatable puisqu'il faut la modifier.
     

  2. la Table d'Adresses Relatives (en vert en bas du module) : elle contient toutes les adresses relatives à corriger et c'est l'éditeur de liens qui est chargé de cette mission de correction.
     

  3. la Table d'Adresses Externes (en vert en haut du module) : Comme cela a été dit, l'autre mission de l'éditeur de lien est de collecter les modules externes pour les charger derrière le module principal. L'instruction-machine "call A(toto)" (un branch normal avec sauvegarde de l'adresse de l'instruction qui suit) se trouvant par exemple à l'adresse 20 du module renvoie à l'adresse du point d'entrée du module 'toto'. Il faut donc que l'éditeur de liens charge d'abord le module 'toto' pour qu'il puisse en connaître l'adresse réelle d'implantation afin de la placer dans l'instruction 'call' à l'adresse relative 22.
         Cette Table d'Adresses Externes contient donc toutes les adresses des sous-programmes ou fonctions appelés par le module.
     
         Il faut remarquer que la collecte des modules externes nécessite une procédure récursive car, à chaque fois que l'éditeur de liens découvre un nouveau sous-programme ou une nouvelle fonction, il lui faudra à nouveau consulter sa table d'adresses externes pour connaître les nouveaux modules à aller chercher. Et ainsi de suite....

         Ce n'est que lorsque cette collecte aura abouti au chargement de TOUS les modules externes, que le programme principal sera complètement construit et pourra être soumis à exécution.

- Conclusion :

La fabrication des modules intermédiaires est la mission des compilateurs.

La fabrication des modules exécutables est la mission des éditeurs de liens.

--ooOoo--