François Trahay

Beaucoup de concepts sont les même qu’en Java
Interface d’un module: partie publique accessible d’autres modules
Implémentation d’un module: partie privée
Bibliothèque (en anglais: library) : regroupe un ensemble de modules
Deux fichiers par module. Par exemple, pour le module
mem_alloc:
mem_alloc.h (fichier
d’entête / header)
mem_alloc.c
mem_alloc.h :
#include "mem_alloc.h"mem_alloc.hmem_alloc (depuis le module
main)
mem_alloc.h :
#include "mem_alloc.h"mem_alloc.hmem_allocmem_alloc/* mem_alloc.h */
#include <stdlib.h>
#include <stdint.h>
#define DEFAULT_SIZE 16
typedef int64_t mem_page_t;
struct mem_alloc_t {
/* [...] */
};
/* Initialize the allocator */
void mem_init();
/* Allocate size consecutive bytes */
int mem_allocate(size_t size);
/* Free an allocated buffer */
void mem_free(int addr, size_t size);
Compilation en trois phases:
exécutable
Le préprocesseur transforme le code source pour le compilateur
#define N 12 substitue N par
12 dans le fichier#if <cond> ... #else ... #endif permet la
compilation conditionnelle#ifdef <var> ... #else ... #endif (ou l’inverse:
#ifndef) permet de ne compiler que si var est
défini (avec #define)#include "fichier.h" inclue (récursivement) le fichier
"fichier.h"gcc -E mem_alloc.cCompilation : transformation des instructions C en instructions “binaires”
gcc -c mem_alloc.cmem_alloc.oEdition de liens : regroupement des fichiers objets pour créer un exécutable
gcc -o executable mem_alloc.o module2.o [...] moduleN.o
Les fichiers objets et exécutables sont sous le format ELF (Executable and Linkable Format)
Ensemble de sections regroupant les symboles d’un même type:
.text contient les fonctions de l’objet.data et .bss contiennent les données
initialisées (.data) ou pas (.bss).symtab contient la table des symbolesLors de l’édition de liens ou du chargement en mémoire, les sections de tous les objets sont fusionnés
Une variable déclarée dans une fonction peut être
int var; ou int var2 = 17;staticstatic int var = 0;
Une variable déclarée dans le fichier fic.c en dehors
d’une fonction peut être:
int var; ou int var2 = 17;externextern int var;fic.c
staticstatic int var = 0;#include "mem_alloc.h", puis
utilisation des fonctions-l, par
exemple: -lmemory
libmemory.so ou
libmemory.aIl existe 2 types de bibliothèques
libmemory.a
ar rcs libmemory.a mem_alloc.o mem_plip.o mem_plop.o [...]libmemory.so
gcc -shared -o libmemory.so mem_alloc.o mem_plip.o mem_plop.o [...]
-fPIC:gcc -c mem_alloc.c -fPICOrganisation classique d’un projet:
src/
module1/
module1.cmodule1.hmodule1_plop.cmodule2/
module2.cmodule2.hmodule2_plip.cdoc/
manual.texBesoin d’utiliser des flags:
-Idir indique où chercher des fichiers
.hgcc -c main.c -I../memory/
-Ldir indique à l’éditeur de lien où trouver des
bibliothèquesgcc -o executable main.o -L../memory/ -lmem_alloc
A l’exécution:
LD_LIBRARY_PATH contient les répertoires où
chercher les fichiers .soexport LD_LIBRARY_PATH=.:../memory
executable, j’ai besoin de
mem_alloc.o et main.o”executable, il faut lancer la commande
gcc -o executable mem_alloc.o main.o”Makefile, ensemble de règles
sur deux lignes:cible : dependance1 dependance2 ... dependanceN`
<TAB>commande
make