Linux Embarqué
Licence Systèmes Informatique Embarqué- 2024_2025
TP2 : Compilation avec GCC sous Linux
A. Présentation de GCC
GCC (GNU Compiler Collection) est un ensemble de compilateurs permettant de compiler plusieurs
langages, notamment C (gcc) et C++ (g++). La compilation se fait en deux étapes principales :
a) Compilation : Analyse du code source, vérification des erreurs, et génération d’un fichier objet (.o).
b) Édition de liens : Regroupement des fichiers objets et des bibliothèques pour produire un exécutable.
Le compilateur C et l'éditeur de liens sont accessibles à travers la même commande : gcc. Il faut donc indiquer
à la commande générale gcc si l'on souhaite compiler un fichier source ou construire le programme
exécutable.
B. Compilation d’un programme C avec GCC
Pour compiler un fichier source en un fichier objet, la commande ressemblera à :
gcc -o nom_du_fichier_objet -c nom_du_fichier_source_C
C. Edition de liens avec GCC (construire l'exécutable)
Pour construire le programme exécutable, il faut indiquer à gcc quels morceaux doivent être utilisés. L'option
-o permet d'indiquer le nom du programme exécutable à construire. De manière générale la commande
ressemblera à :
$gcc -o nom_du_programme nom_du_fichier_objet1 nom_du_fichier_objet1
D. Manipulation 1: Compilation
1) Avant de pouvoir compiler un programme en C avec gcc, assurez-vous que votre système possède
les outils nécessaires. Sur Linux (Ubuntu/Debian), utilisez les commandes suivantes :
$sudo apt-get update
Après la mise à jour, installez le paquet build-essential, qui inclut GCC, G++, et d’autres outils de
compilation : $sudo apt install build-essential
2) Pour vérifier si GCC est installé correctement sur votre système Linux et pour connaître sa version,
utilisez la commande suivante : $gcc --version
3) Ouvrez le répertoire : $cd TP2
4) Compilez main.c et créez main.o, le fichier objet : $gcc -o main.o -c main.c
Compilez hello.c et créez hello.o, le fichier objet : $gcc -o hello.o -c hello.c
5) Vous pouvez le vérifier avec la commande ls
6) Ici a.out est un exécutable qui contient du code machine (des instructions exécutées par un
microprocesseur sur une plateforme cible).
a) Afficher les détails du fichier .out : $ls -l a.out
b) Vérifier le type du fichier : $file a.out
c) Vérifier les bibliothèques utilisées : $ ldd a.out
d) Désassembler pour voir les bibliothèques appelées : $objdump -d a.out
e) Réduire la taille du fichier en supprimant les symboles : $ strip a.out
7) Construisez le programme exécutable programme avec les fichiers objets hello.o et main.o :
$gcc -o programme main.o hello.o
8) Vérifier avec la commande ls
9) Exécutez votre programme : $ ./progamme
1/2
E. Manipulation 2 : Utilisation de make et Makefile
Pour des projets plus complexes, il est souvent utile d'utiliser un Makefile pour automatiser le
processus de compilation. Voici un exemple simple de Makefile :
CC = gcc
CFLAGS = -Wall -g
all: nom_du_programme
nom_du_programme: fichier1.o fichier2.o
$(CC) $(CFLAGS) -o nom_du_programme fichier1.o fichier2.o
fichier1.o: fichier1.c
$(CC) $(CFLAGS) -c fichier1.c
fichier2.o: fichier2.c
$(CC) $(CFLAGS) -c fichier2.c
clean:
rm -f *.o nom_du_programme
CC : le compilateur à utiliser.
CFLAGS : les options de compilation.
all : la cible par défaut.
clean : une cible pour nettoyer les fichiers objets et l'exécutable.
1) Créez un fichier Makefile permettant de compiler main.c et hello.c en un exécutable programme.
2) Testez la compilation avec la commande : $ make -f Makefile
3) Exécutez le programme en utilisant : $ ./programme
4) Vérifiez la sortie attendue.
Annexes :
#include <stdio.h> #ifndef H_GL_HELLO #include <stdio.h>
#include <stdlib.h> #define H_GL_HELLO #include <stdlib.h>
#include "hello.h"
void Hello(void) void Hello(void); int main(void)
{ {
printf("Hello World \n"); #endif Hello();
} return
EXIT_SUCCESS;
}
2 /2