Notez à partir de la sortie ci-dessus du fichier prétraité que depuis que notre programme a demandé le stdio.h en-tête être inclus dans notre source qui, à son tour, a demandé tout un tas d’autres fichiers d’en-tête.
Compilation
L’étape suivante consiste à prendre le fichier prétraité en entrée, à le compiler et à produire une sortie compilée intermédiaire. Le fichier de sortie de cette étape produit un code d’assemblage dépendant de la machine.
En utilisant l’indicateur « -S » avec gcc, nous pouvons convertir le code source C prétraité en langage d’assemblage sans créer de fichier objet:
$ gcc -S HelloWorld.i -o HelloWorld.s
Bien que je ne sois pas beaucoup dans la programmation au niveau de l’assemblage, un rapide coup d’œil conclut que cette sortie au niveau de l’assemblage se présente sous une forme quelconque d’instructions que l’assembleur peut comprendre et convertir en langage de niveau machine.
Assembly
Comme nous le savons tous, les machines ne peuvent comprendre que le langage binaire, nous avons donc maintenant besoin d’un ASSEMBLEUR qui convertit le code d’assemblage en « HelloWorld.fichier c » en code binaire.
L’ASSEMBLEUR a été l’un des premiers outils logiciels développés après l’invention de l’ordinateur numérique.
S’il y a des appels à des fonctions externes dans le code d’assemblage, l’assembleur laisse les adresses des fonctions externes non définies, à remplir ultérieurement par l’éditeur de liens.
L’assembleur peut être appelé comme indiqué ci-dessous. En utilisant l’indicateur « -c » dans gcc, nous pouvons convertir le code d’assemblage en code de niveau machine:
$ gcc -c HelloWorld.c -o HelloWorld.o
La seule chose que nous pouvons expliquer en regardant le HelloWorld.o le fichier concerne la chaîne ELF de la première ligne. ELF signifie format exécutable et liable.
Un fichier objet et un fichier exécutable sont disponibles dans plusieurs formats tels que ELF (Executable and Linking Format) et COFF (Common Object-File Format). Par exemple, ELF est utilisé sur les systèmes Linux, tandis que COFF est utilisé sur les systèmes Windows.
Il s’agit d’un format relativement nouveau pour les fichiers objets et exécutables de niveau machine produits par gcc. Avant cela, un format connu sous le nom de .out était utilisé. On dit qu’ELF est un format plus sophistiqué que a.out (Nous pourrions approfondir le format ELF dans un autre article futur).
Si vous compilez votre code sans spécifier le nom du fichier de sortie, le fichier de sortie produit a le nom ‘a.out’ mais le format a maintenant changé en ELF. C’est juste que le nom du fichier exécutable par défaut reste le même.
Liaison
C’est la phase finale dans laquelle toutes les liaisons des appels de fonction avec leurs définitions sont effectuées. L’éditeur de liens sait où toutes ces fonctions sont implémentées (l’assembleur a laissé l’adresse de toutes les fonctions externes à appeler). Jusqu’à ce stade, GCC ne connaît pas la fonction comme printf().L’assembleur aurait laissé l’adresse des fonctions à appeler et l’éditeur de liens effectue le processus final de remplissage de ces adresses avec les définitions réelles. L’éditeur de liens effectue également quelques tâches supplémentaires pour nous. Il combine notre programme avec certaines routines standard nécessaires à l’exécution de notre programme. La taille finale de l’exécutable est donc bien supérieure au fichier d’entrée!
L’ensemble du processus de liaison est géré par gcc et appelé comme suit:
$ gcc -o Output HelloWorld.c
La commande ci-dessus exécute le fichier « HelloWorld.c » et produit le fichier exécutable final « Sortie ».
Comme vous pouvez le voir, le fichier ‘Output’ est par défaut un fichier exécutable avec des autorisations – rwxrwxr-x, cela signifie simplement qu’il dispose d’une autorisation exécutable pour tous les utilisateurs (propriétaire, groupe et autres). Si vous exécutez ce fichier exécutable en tapant simplement ‘./Output ‘ vous obtenez la sortie finale de notre programme!
Nous savons maintenant comment un programme C est converti en exécutable. Nous plongerons un peu plus en profondeur dans la programmation C dans les prochains articles. D’ici là, Bon Apprentissage! 🙂