



Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Ce document est un atelier destiné aux étudiants de l'ISET Radès, couvrant les principales étapes de la chaîne de production de programmes et la structure générique d'un fichier Makefile dans le contexte du développement d'un système d'exploitation Linux embarqué. Il comprend des explications sur les fichiers sources, les outils de production, les compilateurs, les éditeurs de liens, et la compilation séparée. Des TAF (tâches à faire) sont également incluses pour une meilleure compréhension des concepts abordés.
Typology: Assignments
1 / 6
This page cannot be seen from the preview
Don't miss anything!




Ce laboratoire a pour objectifs de :
Connaissances de base sur GNU/Linux.
Le système GNU/Linux est écrit en langage C. Le code source de ce système est organisé en une arborescence de répertoire et de fichiers. On en dénombre quelques dizaines de milliers de fichiers c dans l’archive du noyau (plus que 27000). Il est clair qu’on ne travaille pas avec ce grand nombre de fichiers de la même façon qu’on travaillerait avec un programme simple (quelques fichiers sources). Pour la production d’un OS Linux embarqué, le développeur se doit de maitriser la chaine de production de programmes, et notamment l’utilisation des fichiers Makefile. Pour exécuter un programme, on passe par les étapes suivantes :
La commande gcc ( G nu C C ollection) est une commande Linux qui permet de produire un programme (binaire) exécutable. La commande accepte un ou plusieurs fichiers en code source (ou au format objet) C/C++ et supporte pas mal d'options. Par défaut le programme binaire exécutable s'appelle a.out à moins que l'option – o ne soit utilisée. Syntaxe. $ gcc [–options] fichier(s) Principales options
- Wall : Afficher tous les messages d'avertissement. - o fichier : Le binaire exécutable sera appelé fichier au lieu de a.out. - c fich.c … : Compiler uniquement (ne pas générer l'exécutable). Si la compilation aboutit, le fichier généré est un fichier objet portant le même nom que le fichier source mais se termine par **.o
Compilation sans options : On peut aussi créer nos propres exécutables : $ gcc hello.c $ gcc hello.c ‐o hello ‐ Pour exécuter : - Pour exécuter : $ ./a.out $ ./hello
$ gcc f1.c Compilation et édition de liens et production d’un fichier exécutable a.out $ gcc f1.c ‐o prog.x Compilation et édition de liens et production d’un fichier exécutable prog.x $ gcc ‐c f1.c Compilation et production d’un fichier objet f1.o $ gcc ‐c f1.c - o prog.x compilation et production d’un fichier objet prog.x $ gcc f1.o Edition de liens et production d’un fichier exécutable a.out $ gcc f1.o ‐o prog.x Edition de liens et production d’un fichier exécutable prog.x
#include<stdio.h> main() { printf(“Bonjour \n Ceci est mon premier programme C sous GNU/Linux\n” ); }
Remarque : Utilisation des arguments dans la fonction main. Comme toute fonction C, la fonction main peut avoir des arguments, le programme «argument.c» suivant montre un exemple d’utilisation de ces arguments.
1. Compilateur : Traduit les modules sources écrits en langage de haut niveau (C, Pascal,…) en modules objets qui contiennent du langage machine, mais dans lesquels les calculs d’adresses ne sont pas résolus. a. Analyse le programme au niveau syntaxique et sémantique. b. Traduit le langage de haut niveau en langage machine. c. Alloue des adresses aux variables. Pour effectuer uniquement la compilation, on utilise la commande gcc avec l’option ‐c : gcc ‐c Cette commande produit un fichier objet portant le même nom que le fichier source et ayant comme extension .o 2. Editeur de liens (linker) : Rassembler les modules traduits séparément par les traducteurs, les relier et produire un module chargeable (ou relogeable - relocatable ) : a. Construit une table qui indique le nom, la taille et la longueur de tous les modules objet, b. Affecte une adresse de chargement à chaque module objet, c. Effectue la translation en modifiant les instructions qui contiennent une référence mémoire, d. Résout les références externes en insérant l'adresse des procédures à l'endroit où elles sont appelées. Pour faire l’édition de liens on utilise la commande gcc et lui passe comme argument les fichiers objets. Exemple : gcc f1.o f2 .o 3. Chargeur (loader) : Le processeur va chercher en mémoire les informations dont il a besoin, c'est à dire le programme et les données. Le rôle du chargeur est donc d'aller chercher sur un disque les fichiers exécutables (le programme) et les données pour les implanter en mémoire. Le chargeur est automatiquement appelé lors de la demande d’exécution d’un programme Figure 1 : Place des outils de production
Intérêt de la compilation séparée Un programme complexe doit être écrit sous la forme de plusieurs fichiers sources. Cette approche présente plusieurs avantages, dont : 1 ‐ Maintenance plus facile. 2 ‐ Modules réutilisables. Par exemple si l'exécutable f est construit à partir de f1.c et f2.c et si on modifie f1.c, on ne refera que les actions impliquant uniquement f1.c, c'est à dire : $ gcc ‐c f1.c Par la suite, on utilise la commande d’édition de lien $ gcc f1.o f2.o ‐o f Figure 2 - Production d'un fichier exécutable f à partir des fichie rs sources f1.c .et f2.c
#include <stdio.h> #include <stdio.h> int main () int somme (int a, int b) { { int i, j, s ; return (a+b); printf("\n Hello"); } printf("\n donner i ... "); scanf ("%d", &i); printf("\n donner j ... "); scanf ("%d", &j); s = somme (i,j); printf("\n somme = %d", s); printf("\n bye !\n"); return 0; }