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 [2015/09/18 15:32] – yoann | dev:outils:gcc [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> | + | {{tag> |
| ====== GCC ====== | ====== GCC ====== | ||
| - | Initialiment | + | Initialement |
| * C/C++ | * C/C++ | ||
| * Objective C | * Objective C | ||
| Ligne 13: | 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 27: | 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> |
| - | <file> | + | |
| /* | /* | ||
| ######################################### | ######################################### | ||
| Ligne 50: | Ligne 49: | ||
| return 0; | return 0; | ||
| } | } | ||
| - | </file> | + | </code> |
| <code bash> | <code bash> | ||
| Ligne 56: | Ligne 55: | ||
| </ | </ | ||
| - | <file> | + | <code c> |
| # 1 " | # 1 " | ||
| # 1 "< | # 1 "< | ||
| Ligne 75: | Ligne 74: | ||
| } __value; | } __value; | ||
| } __mbstate_t; | } __mbstate_t; | ||
| + | ... | ||
| + | ... | ||
| ... | ... | ||
| int main(void) | int main(void) | ||
| Ligne 83: | Ligne 84: | ||
| | | ||
| } | } | ||
| - | </file> | + | </code> |
| + | |||
| + | 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 93: | 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 122: | 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 171: | Ligne 206: | ||
| libc.so.6 => / | libc.so.6 => / | ||
| / | / | ||
| - | yoann@hermes: | + | </code> |
| + | |||
| + | <code bash> | ||
| + | $ ./ | ||
| ./ | ./ | ||
| + | </ | ||
| + | |||
| + | ===== Références ===== | ||
| + | * https:// | ||