bases de gcc : compiler, les 4 phases de compilation et od (octal dump)

Tags:

voir http://www.cmi.univ-mrs.fr/~contensi/coursC/index.php?section=env&page=comp

par défaut (avec gcc source.c) la sortie est nommée a.out on l'execute avec ./a.out
pour nommer l'exe utiliser -o => gcc bonjour.c -o appli_bonjour

4 étapes de compilation

1. passage au pré-processeur - preprocessing

utiliser -E pour voir le bonjour.i ie sans commentaire, avec #includes et traitement des directives de compilation qui commencent par un caractère # (define elif else endif error if ifdef ifndef include line pragma undef) + vérification syntaxe.

-Wall affiche les erreurs de syntaxe (le W est pour warning)

2. Compilation en langage assembleur (du .i au .s avec option -S) - compiling
3. Transformation de l'assembleur en code machine (du .s au .o avec option -c) - assembling

Le code assembleur qui est lisible est transformé en code machine binaire. On peut le rendre lisible en utilisant une commande od -x bonjour.o.

La commande od (pour octal dump) lit le fichier binaire et affiche sur la sortie standard les octets en hexadécimal avec l'option -x (base 16, on compte de 0 à 15, les lettre a, b, c, d, e et f représentent 10, 11, 12, 13, 14, 15).

4. édition des liens (du .o au .out) - linking

bonjour.o ne contient pas le code de la fonction printf (dans une bibliothèque - seul son prototype a été inclu). L'édition des liens va réunir le fichier objet et les fonctions contenues dans les bibliothèques, pour produire le programme complet.

Cours de c

Source: http://emmanuel-delahaye.developpez.com/tutoriels/c/notes-langage-c/?pag...

Chaque système dispose de sa propre API. Mais certains systèmes offrent des API définies selon la norme POSIX, ce qui tend à normaliser au moins une partie des API.
Produire un exe c'est donc: compiler puis linker.

mémoire statique, allouée/tas et automatique/pile

1 - Les objets définis hors des fonctions et les objets définis avec le mot clé static sont placés en mémoire statique.
Leur durée de vie est celle de l'exécution du programme. Ils existent et sont initialisés (à 0 par défaut) avant même le lancement de main().

2 - Les objets définis avec les fonctions malloc(), calloc() et realloc() sont placés en mémoire allouée (appelée heap ou tas sur certaines implémentations).
Leur durée de vie est contrôlée par le programme. Ils existent dès que l'appel de *alloc() retourne une valeur différente de NULL et cessent d'exister dès que free() est appelé avec la valeur retournée par *alloc().

3 - Les objets définis dans un bloc, sans qualificateur 'static', sont placés en mémoire automatique (appelée stack ou pile sur certaines implémentations).
Leur durée de vie est celle du bloc dans lequel ils sont définis.

mode plein écran: stdin stdout et stderr

pratiques et normes : conio (de Borland coté windows) et curse et ncurse coté Unixoides ; Commandes ANSI (VT-100), HTML (Browser)... Voir http://pdcurses.sourceforge.net/ et  termcaps.

rappels sur le codage des rééls (float 32 bits)

ou pourquoi (x - y)(x + y) est plus précis que x2 - y2 (c'est vrai que j'ai constaté que les jeunes dev ne savent pas ce que c'est ?!?).
Coté entier: little et big indians ont maintenant un équivalent en fr: "gros-boutiste" et "petit-boutiste" et aussi "grand-boutien" et "petit-boutien" - voir par ex sur wikipédia.