Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Du code source au programme (gcc)

Après cette leçon: Je peux nommer les étapes par lesquelles un compilateur fait passer un programme.

Leçon de 50 min10 commandesLab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

La facturation qui ne se construit plus

Le logiciel de facturation d’une PME ne se construit plus. Le message dit undefined reference to printf. Un développeur relit le code C ligne par ligne pendant une heure.

Le code est juste. Le message vient de la toute dernière étape, qui ne lit jamais le code. Savoir qui parle, et à quelle étape, lui aurait fait gagner cette heure.

À la fin de cette leçon

Remarque

Je peux nommer les étapes par lesquelles un compilateur fait passer un programme.

Mots-clés

MotCe que ça veut direExemple
Piloteun programme qui lance les autres outils dans l’ordregcc
Préprocesseurl’étape qui colle des fichiers et remplace les macros
Macroun nom que le préprocesseur remplace par un texteGREETING
Assembleurle programme qui traduit l’assembleur en code machineas
Fichier objetdu code machine qui n’est pas encore un programme entierhello.o
Éditeur de liensle programme qui assemble fichiers objets et bibliothèquesld

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

gcc fait travailler d’autres programmes

Quand vous tapez gcc hello.c, gcc fait très peu de travail lui-même. C’est un pilote : il lance d’autres programmes, l’un après l’autre. Chacun reçoit le fichier écrit par le précédent.

L’option -### demande à gcc d’afficher ces commandes sans en lancer aucune. Comparez les deux Runs : le second ajoute la dernière étape, que -c supprime.

Aller dans le dossier du compilateur

Commande
cd ~/compiler

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Les programmes lancés avec -c

Commande
gcc -### -c hello.c 2>&1 | grep "^ " | cut -d " " -f 2

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Les programmes lancés sans -c

Commande
gcc -### -o hello hello.c 2>&1 | grep "^ " | cut -d " " -f 2

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le préprocesseur colle et remplace

La première étape ne comprend pas le C. Le préprocesseur suit les lignes qui commencent par #. #include colle le contenu d’un autre fichier. #define déclare une macro, un nom à remplacer par un texte.

gcc -E s’arrête juste après cette étape. Le premier Run montre la macro dans le source. Le second montre la fin du texte prétraité.

Où la macro apparaît

Commande
grep -n "GREETING" hello.c

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La fin du texte prétraité

Commande
gcc -E hello.c | tail -n 11

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Garder le fichier de chaque étape

D’habitude, les fichiers intermédiaires vont dans un dossier temporaire et sont effacés. L’option -save-temps les garde à côté du source.

Une seule construction laisse alors quatre fichiers. La commande file lit le début de chacun et dit de quel genre il est.

Construire une fois et tout garder

Commande
gcc -save-temps -o hello hello.c

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Quel genre de fichier est chacun ?

Commande
file hello.i hello.s hello.o hello

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : ce que file a répondu

FichierÉcrit parCe que file en dit
hello.iLe préprocesseurC source, ASCII text
hello.sLe compilateurassembler source, ASCII text
hello.oL’assembleurELF 64-bit LSB relocatable
helloL’éditeur de liensELF 64-bit LSB pie executable

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un fichier objet laisse des trous

hello.o contient le code machine de square et de main. Mais main appelle printf, qui n’est pas dans ce fichier. Il vit dans la bibliothèque C.

nm -u liste les symboles non définis : les noms que l’éditeur de liens devra trouver ailleurs. Lancez ensuite l’éditeur de liens ld vous-même, sans la bibliothèque C, et lisez sa réponse.

Les symboles qui manquent à hello.o

Commande
nm -u hello.o

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lier sans rien d’autre

Commande
ld hello.o -o casse

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Erreur fréquente

Attention

Beaucoup de gens pensent que toute erreur de construction vient d’une faute dans leur code. Un undefined reference vient de l’éditeur de liens, après une compilation réussie. Le code d’un symbole n’a pas été fourni à la dernière étape. Vérifiez ce qui est lié, pas la ligne de C.

D’où vient printf

Commande
ldd hello

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Pour aller plus loin

Tapez ceci vous-même. Avec sed, faites une copie de hello.c nommée cube.c où square(7) devient cube(7). Aucune fonction cube n’existe.

Construisez avec gcc -c cube.c et notez quelle étape refuse. Ajoutez ensuite la ligne int cube(int n); avant main, puis relancez gcc -c cube.c et gcc cube.c. Expliquez pourquoi les deux erreurs viennent de deux étapes différentes.

À propos de ce labo et de sa source: Lab de compilation et d’architecture : gcc, flex, bison et RISC-V dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.