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.h
mem_alloc
(depuis le module
main
)
mem_alloc.h
:
#include "mem_alloc.h"
mem_alloc.h
mem_alloc
mem_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.c
Compilation : transformation des instructions C en instructions “binaires”
gcc -c mem_alloc.c
mem_alloc.o
Edition 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;
static
static 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;
extern
extern int var;
fic.c
static
static int var = 0;
#include "mem_alloc.h"
, puis
utilisation des fonctions-l
, par
exemple: -lmemory
libmemory.so
ou
libmemory.a
Il 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 -fPIC
Organisation classique d’un projet:
src/
module1/
module1.c
module1.h
module1_plop.c
module2/
module2.c
module2.h
module2_plip.c
doc/
manual.tex
Besoin d’utiliser des flags
:
-Idir
indique où chercher des fichiers
.h
gcc -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 .so
export 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