Programmation Linux Embarqué avec Makefile - ISET Radès, Assignments of Information Technology

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

2019/2020

Uploaded on 12/23/2020

ar-ij
ar-ij 🇹🇳

3 documents

1 / 6

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Module : Atelier Linux Embarqué
ISET Radès. A.U : 2019/2020
1
Pr. Habib SMEI [email protected]
L
La
ab
b
1
1
:
:
C
Ch
ha
aî
în
ne
e
d
de
e
p
pr
ro
od
du
uc
ct
ti
io
on
n
d
de
e
p
pr
ro
og
gr
ra
am
mm
me
es
s
1. Objectifs
Ce laboratoire a pour objectifs de :
- comprendre les principales étapes de la chaîne de production de programmes.
- comprendre la structure générique d’un fichier Makefile
2. Prérequis
Connaissances de base sur GNU/Linux.
3. Introduction
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 :
- Ecriture d'un ou plusieurs fichiers sources qui seront enregistrés sur disque,
- Utilisation, éventuellement complètement transparente, d'OUTILS DE PRODUCTION pour
obtenir un fichier exécutable. Ce fichier, comme les fichiers sources, est enregistré sur disque.
- Pour exécuter ce fichier, on le charge en mémoire. Ceci est fait en "tapant" le nom de ce fichier
exécutable, qui est alors chargé du disque vers la mémoire par le système d'exploitation.
Pour le fichier exécutable, on parle également de fichier binaire. On utilise ce terme pour indiquer
que ce fichier contient des instructions et des données représentées suivant un format et un codage
compréhensibles par le processeur de la machine.
Pour compiler un programme C on utilise la commande cc ou gcc. Par défaut l’exécutable sera le
fichier a.out :
La commande gcc :
La commande gcc (Gnu C Collection) 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
E fich.c : Générer le gnrer le code prprocess (option E).
S fich.c : Générer le programme en langage symbolique (ne pas générer l'objet).
pf3
pf4
pf5

Partial preview of the text

Download Programmation Linux Embarqué avec Makefile - ISET Radès and more Assignments Information Technology in PDF only on Docsity!

L Laabb 11 :: CChhaaîînnee ddee pprroodduuccttiioonn ddee pprrooggrraammmmeess

1. Objectifs

Ce laboratoire a pour objectifs de :

  • comprendre les principales étapes de la chaîne de production de programmes.
  • comprendre la structure générique d’un fichier Makefile

2. Prérequis

Connaissances de base sur GNU/Linux.

3. Introduction

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 :

  • Ecriture d'un ou plusieurs fichiers sources qui seront enregistrés sur disque,
  • Utilisation, éventuellement complètement transparente, d' OUTILS DE PRODUCTION pour obtenir un fichier exécutable. Ce fichier, comme les fichiers sources, est enregistré sur disque.
  • Pour exécuter ce fichier, on le charge en mémoire. Ceci est fait en "tapant" le nom de ce fichier exécutable, qui est alors chargé du disque vers la mémoire par le système d'exploitation. Pour le fichier exécutable, on parle également de fichier binaire. On utilise ce terme pour indiquer que ce fichier contient des instructions et des données représentées suivant un format et un codage compréhensibles par le processeur de la machine. Pour compiler un programme C on utilise la commande cc ou gcc. Par défaut l’exécutable sera le fichier a.out :

La commande gcc :

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

  • E fich.c** : Générer le gé né rer le code pré processé (option – E). - S fich.c : Générer le programme en langage symbolique (ne pas générer l'objet).

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

Exemples :

$ 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

TAF 1

Soit le programme « hello.c » (Un programme en langage C doit obligatoirement avoir

l’extension ‘.c’)

#include<stdio.h> main() { printf(“Bonjour \n Ceci est mon premier programme C sous GNU/Linux\n” ); }

1. Compiler et exécuter ce programme avec comme nom objet hello

2. Ajouter le chemin de votre répertoire de travail à la variable PATH.

3. Tester cet ajout

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

TAF 3 :

Soit les fichiers suivants :

Le fichier main.c Le fichier somme.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; }

  1. Faire la compilation séparée des différents fichiers sources.
  2. Quels sont les fichiers obtenus?
  3. Faire l’édition des liens
  4. Quel est le fichier obtenu?
  5. Taper la commande : $ gcc - Wall main.c somme.c - o resultat Quelle est la signification du message affiché?