Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
dev:outils:gcc [2013/01/20 14:36] – ajout notes gcc root | dev:outils:gcc [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | |||
====== GCC ====== | ====== GCC ====== | ||
- | Initialiment | + | Initialement |
* C/C++ | * C/C++ | ||
* Objective C | * Objective C | ||
Ligne 11: | Ligne 13: | ||
Gnu Compiler Collection est l' | Gnu Compiler Collection est l' | ||
* Le frontend gcc qui a pour but d' | * Le frontend gcc qui a pour but d' | ||
- | * Le backend constitué par les bin-utils assemble et lie aux biliothèques | + | * Le backend constitué par les bin-utils assemble et lie aux bibliothèques |
- | La commande gcc est une interface permettant d' | + | La commande gcc est une interface permettant d' |
- | ===== Etapes | + | ===== Étapes |
Le compilateur gcc de GNU passe par les étapes suivante pour compiler un fichier C: | Le compilateur gcc de GNU passe par les étapes suivante pour compiler un fichier C: | ||
- | - preprocesseur, | + | - préprocesseur, |
- compilation, | - compilation, | ||
- liaison. | - liaison. | ||
Ligne 25: | Ligne 27: | ||
==== préprocesseur ==== | ==== préprocesseur ==== | ||
- | Dans le fichier source, une ligne commencant | + | Dans le fichier source, une ligne commençant |
- | Le travail du preprocesseur | + | Le travail du préprocesseur |
- | + | ||
- | exemple hello.c | + | |
+ | <code c> | ||
/* | /* | ||
######################################### | ######################################### | ||
Ligne 48: | Ligne 49: | ||
return 0; | return 0; | ||
} | } | ||
+ | </ | ||
+ | <code bash> | ||
gcc -E hello.c | gcc -E hello.c | ||
+ | </ | ||
+ | <code c> | ||
# 1 " | # 1 " | ||
# 1 "< | # 1 "< | ||
Ligne 69: | Ligne 74: | ||
} __value; | } __value; | ||
} __mbstate_t; | } __mbstate_t; | ||
+ | ... | ||
+ | ... | ||
... | ... | ||
int main(void) | int main(void) | ||
Ligne 77: | Ligne 84: | ||
| | ||
} | } | ||
+ | </ | ||
+ | Pour info, les commandes ci-dessous permettent de comparer les fichiers: | ||
- | A titre d' | ||
<code bash> | <code bash> | ||
cat hello.c | wc -l | cat hello.c | wc -l | ||
Ligne 87: | Ligne 95: | ||
</ | </ | ||
- | Notre fichier source hello.c passe de 17 lignes a 851 apres traitement | + | Notre fichier source hello.c passe de 17 lignes a 851 après |
==== compilateur ==== | ==== compilateur ==== | ||
- | pour demander | + | Pour demander |
<code bash> | <code bash> | ||
gcc -c monfichier.c -o monfichier.o | gcc -c monfichier.c -o monfichier.o | ||
</ | </ | ||
- | (gcc genere | + | (gcc génère |
- | on peut demander | + | |
<code bash> | <code bash> | ||
gcc -S hello.c | gcc -S hello.c | ||
</ | </ | ||
- | et traduire ensuite le code assembleur en code machine | + | Et traduire ensuite le code assembleur en code machine |
<code bash> | <code bash> | ||
as hello.c -o hello.o | as hello.c -o hello.o | ||
</ | </ | ||
- | ===== Bibliothèques, | + | ==== linker |
- | Une fois les fichiers objets créés, il faut les fusioner | + | Une fois les fichiers objets créés, il faut les fusionner |
la commande permettant d' | la commande permettant d' | ||
Ligne 116: | Ligne 124: | ||
</ | </ | ||
- | Sous Linux la plupart des executables | + | Sous Linux la plupart des exécutables |
- | pour voir a quelles bibliothèques un executable | + | |
- | yoann@hermes:/ | + | Pour voir à quelles bibliothèques un exécutable |
+ | <code bash> | ||
+ | $ ldd hello.exe | ||
linux-gate.so.1 => (0x00915000) | linux-gate.so.1 => (0x00915000) | ||
libc.so.6 => / | libc.so.6 => / | ||
/ | / | ||
+ | </ | ||
- | pour forcer le linker a faire une liaison statique: | + | On peut faire le choix d' |
- | gcc -static monficheir.o -o monfichier | + | |
- | Utiliser | + | <code bash> |
- | Si bibliothèque n'est pas dans un dossier standard il faut preciser | + | $ gcc -static monficheir.o -o monfichier |
+ | </ | ||
+ | |||
+ | On obtient un binaire moins modulaire mais qui inclus le code dont il a besoin. S'il repose sur des bibliothèques qui ont été mises à jour, il faudra recompiler le programme pour qu'il intègre les modifications. | ||
+ | |||
+ | ===== Bibliothèques, | ||
+ | |||
+ | Lors de l' | ||
+ | Si la bibliothèque n'est pas dans un dossier standard il faut préciser | ||
+ | |||
+ | <code bash> | ||
gcc -L ~/ | gcc -L ~/ | ||
+ | </ | ||
- | libmalib.so: dynamique (.so = shared object)) | + | < |
- | libmalib.a: statique | + | A propos de la nomenclature du paramètre suivant l' |
+ | </ | ||
- | S'il s'agit d' | + | * libmalib.so: |
- | ceci peut etre fait grace a la variable d' | + | * libmalib.a: bibliothèque contenant des fichiers objets pour liaison statique. |
- | Creer une bibliothèque | + | Pour un programme se reposant sur les liaisons dynamiques |
- | Pour liaison statique | + | |
- | c'est rassembler plusieurs ficheirs objets dans un seul fichier | + | |
- | on crée les fichiers lib/module1.c lib/ | + | |
- | on compile les fichiers sources puis on crée l'archive | + | |
- | ar ruv libmalib.a module*.o | + | ===== Créer une bibliothèque ===== |
+ | |||
+ | ==== Pour liaison statique ==== | ||
+ | |||
+ | C'est rassembler plusieurs fichiers objets dans un seul fichier (une archive) avec **ar** (options ur (ajouter et remplace et v verbeux) | ||
+ | |||
+ | * On crée les fichiers lib/ | ||
+ | * On compile les fichiers sources puis on crée l' | ||
+ | |||
+ | <code bash> | ||
+ | $ ar ruv libmalib.a module*.o | ||
ar: creating libmalib.a | ar: creating libmalib.a | ||
a - module1.o | a - module1.o | ||
a - module2.o | a - module2.o | ||
a - module3.o | a - module3.o | ||
+ | </ | ||
- | dans le repertoire | + | Dans le répertoire |
- | on compile ensuite | + | |
- | gcc hello.c -Llib -lm -lmalib -o hello | + | |
+ | <code bash> | ||
+ | $ gcc hello.c -Llib -lm -lmalib -o hello | ||
+ | </ | ||
- | Pour liaison dynamique | + | ==== Pour liaison dynamique |
- | pour creer une bibliothèque dynamique | + | |
- | gcc -shared module*.o -o libmalib.so | + | |
- | le fichier libmalib.so est créé, il peut etre ensuite liée dynamiquement a l' | + | |
- | gcc hello.o -L./lib -lmalib -lm -o hello.dyn | + | |
- | ldd hello.dyn | + | Pour créer une bibliothèque dynamique, utiliser l' |
+ | |||
+ | < | ||
+ | $ gcc -shared module*.o -o libmalib.so | ||
+ | </ | ||
+ | |||
+ | Le fichier libmalib.so est créé, il peut être ensuite liée dynamiquement à l’exécutable hello: | ||
+ | |||
+ | <code bash> | ||
+ | $ gcc hello.o -L./lib -lmalib -lm -o hello.dyn | ||
+ | </ | ||
+ | |||
+ | Pour vérifier à quelles bibliothèques dynamiques est lié notre exécutable: | ||
+ | |||
+ | <code bash> | ||
+ | $ ldd hello.dyn | ||
linux-gate.so.1 => (0x00fc1000) | linux-gate.so.1 => (0x00fc1000) | ||
libmalib.so => not found | libmalib.so => not found | ||
Ligne 165: | Ligne 206: | ||
libc.so.6 => / | libc.so.6 => / | ||
/ | / | ||
- | yoann@hermes: | + | </code> |
+ | |||
+ | <code bash> | ||
+ | $ ./ | ||
./ | ./ | ||
+ | </ | ||
+ | |||
+ | ===== Références ===== | ||
+ | * https:// | ||