ch3 - compiler tools
This commit is contained in:
358
ch003-ctools.md
Normal file
358
ch003-ctools.md
Normal file
@@ -0,0 +1,358 @@
|
||||
# Chapitre 3 — Outils et chaîne de compilation
|
||||
|
||||
## 3.1 Compilateurs : rôle et implémentations
|
||||
|
||||
Un compilateur transforme du code C en instructions exécutables par le processeur.
|
||||
|
||||
Le C est un langage compilé.
|
||||
Cela signifie que le programme est transformé avant exécution.
|
||||
|
||||
### Compilateurs courants
|
||||
|
||||
- GCC (GNU Compiler Collection)
|
||||
- Clang (LLVM)
|
||||
- MSVC (Microsoft Visual C)
|
||||
|
||||
Chaque compilateur :
|
||||
- implémente la norme C
|
||||
- peut ajouter des extensions
|
||||
- produit du code pour une architecture donnée
|
||||
|
||||
### Exemple
|
||||
|
||||
```bash
|
||||
gcc main.c -o prog
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.2 Étapes de la chaîne de compilation
|
||||
|
||||
La compilation est une pipeline.
|
||||
|
||||
### Étape 1 — Préprocesseur
|
||||
|
||||
Traite :
|
||||
- #include
|
||||
- #define
|
||||
- #ifdef
|
||||
|
||||
---
|
||||
|
||||
Exemple :
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
```
|
||||
|
||||
Le contenu du fichier est copié dans le code.
|
||||
|
||||
### Étape 2 — Compilation
|
||||
|
||||
C → assembleur
|
||||
|
||||
```bash
|
||||
gcc -S main.c
|
||||
```
|
||||
|
||||
Produit :
|
||||
|
||||
```
|
||||
main.s
|
||||
```
|
||||
|
||||
### Étape 3 — Assemblage
|
||||
|
||||
ASM → objet (.o)
|
||||
L’assembleur transforme le code assembleur en code machine.
|
||||
|
||||
Produit :
|
||||
|
||||
```
|
||||
main.o
|
||||
```
|
||||
|
||||
|
||||
### Étape 4 — Linking
|
||||
|
||||
Objets → binaire final
|
||||
Le linker assemble tous les objets.
|
||||
Il résout les dépendances.
|
||||
|
||||
---
|
||||
|
||||
## 3.3 Assembleur utilisé selon la toolchain
|
||||
|
||||
Le compilateur ne génère pas un assembleur universel.
|
||||
Il dépend de la toolchain.
|
||||
|
||||
- **GCC** :
|
||||
- utilise GAS **(GNU assembler)**
|
||||
- syntaxe par défaut : **AT&T**
|
||||
- **Clang/LLVM** :
|
||||
- utilise un **assembleur intégré LLVM**
|
||||
- peut aussi utiliser GAS
|
||||
- **MSVC** :
|
||||
- utilise son backend interne
|
||||
- eut utiliser **MASM**
|
||||
- **Android (NDK)** :
|
||||
- utilise **Clang + LLVM**
|
||||
|
||||
### Exemple GAS
|
||||
|
||||
```asm
|
||||
movl $5, %eax
|
||||
```
|
||||
|
||||
### Exemple Intel
|
||||
|
||||
```asm
|
||||
mov eax, 5
|
||||
```
|
||||
|
||||
Ces syntaxes ne sont pas compatibles directement.
|
||||
|
||||
---
|
||||
|
||||
## 3.4 Fichiers générés
|
||||
|
||||
Chaque étape produit un fichier.
|
||||
|
||||
### Source
|
||||
|
||||
```
|
||||
main.c
|
||||
```
|
||||
|
||||
### Assembleur
|
||||
|
||||
```
|
||||
main.s
|
||||
```
|
||||
|
||||
### Objet
|
||||
|
||||
```
|
||||
main.o
|
||||
```
|
||||
|
||||
### Exécutable
|
||||
|
||||
```
|
||||
prog
|
||||
```
|
||||
|
||||
### Exemple — compilation séparée
|
||||
|
||||
```bash
|
||||
gcc -c main.c
|
||||
gcc main.o -o prog
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.5 Warnings et erreurs
|
||||
|
||||
Le compilateur analyse aussi le code.
|
||||
|
||||
### Erreur
|
||||
|
||||
Empêche la compilation.
|
||||
|
||||
### Warning
|
||||
|
||||
Indique un problème potentiel.
|
||||
|
||||
### Exemple — variable non initialisée
|
||||
|
||||
```c
|
||||
int main(void)
|
||||
{
|
||||
int x;
|
||||
return x;
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
gcc -Wall -Wextra -Werror main.c
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.6 Options du compilateur
|
||||
|
||||
Les options contrôlent le comportement.
|
||||
|
||||
### Optimistion
|
||||
|
||||
```bash
|
||||
gcc -O0 main.c
|
||||
gcc -O2 main.c
|
||||
gcc -O3 main.c
|
||||
```
|
||||
|
||||
### Debug
|
||||
|
||||
```bash
|
||||
gcc -g main.c
|
||||
```
|
||||
|
||||
### Standard
|
||||
|
||||
```bash
|
||||
gcc -std=c11 main.c
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.7 Informations de debug
|
||||
|
||||
Les informations de debug permettent :
|
||||
|
||||
inspection mémoire
|
||||
suivi d’exécution
|
||||
|
||||
### Exemple
|
||||
|
||||
```bash
|
||||
gdb prog
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.8 Compilation séparée
|
||||
|
||||
Permet de compiler fichier par fichier.
|
||||
|
||||
### Exemple
|
||||
|
||||
```bash
|
||||
gcc -c a.c
|
||||
gcc -c b.c
|
||||
gcc a.o b.o -o prog
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.9 Compilation croisée
|
||||
|
||||
Compiler pour une autre architecture.
|
||||
|
||||
### Exemple
|
||||
|
||||
```bash
|
||||
arm-none-eabi-gcc main.c
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.10 Linker
|
||||
|
||||
Le linker combine les objets.
|
||||
|
||||
Il :
|
||||
- fusionne les sections
|
||||
- résout les symboles
|
||||
- construit le binaire
|
||||
|
||||
---
|
||||
|
||||
## 3.11 Symboles
|
||||
|
||||
Un symbole est un nom utilisé par le linker.
|
||||
|
||||
#### Exemple
|
||||
|
||||
```c
|
||||
void f(void)
|
||||
{
|
||||
}
|
||||
```
|
||||
|
||||
➡ symbole f
|
||||
|
||||
---
|
||||
|
||||
Le linker associe :
|
||||
|
||||
- déclaration
|
||||
- définition
|
||||
|
||||
---
|
||||
|
||||
## 3.12 Formats binaires
|
||||
|
||||
### Le binaire final a un format.
|
||||
|
||||
- ELF (Linux)
|
||||
- PE (Windows)
|
||||
- Mach-O (macOS)
|
||||
|
||||
|
||||
### Contenu :
|
||||
- `.text` → code
|
||||
- `.data` → données
|
||||
- `.bss` → mémoire non initialisée
|
||||
|
||||
### Rôle du loader
|
||||
|
||||
Le système :
|
||||
|
||||
- charge le binaire
|
||||
- mappe les sections
|
||||
- résout les dépendances
|
||||
|
||||
---
|
||||
|
||||
## 3.13 ABI (introduction)
|
||||
|
||||
L’ABI définit :
|
||||
|
||||
- comment appeler une fonction
|
||||
- comment passer les arguments
|
||||
- comment organiser la mémoire
|
||||
|
||||
### Exemple
|
||||
|
||||
Linux x86_64 :
|
||||
- rdi, rsi, rdx
|
||||
|
||||
Windows x86_64 :
|
||||
- rcx, rdx, r8
|
||||
|
||||
---
|
||||
|
||||
Même CPU ≠ même ABI
|
||||
|
||||
---
|
||||
|
||||
## 3.14 Linker script
|
||||
|
||||
Un linker script contrôle la disposition mémoire.
|
||||
|
||||
### Exemple
|
||||
|
||||
```ld
|
||||
SECTIONS
|
||||
{
|
||||
.text 0x1000 : { *(.text) }
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Utilisation
|
||||
- embarqué
|
||||
- systèmes bas niveau
|
||||
|
||||
---
|
||||
|
||||
## 3.15 Résumé
|
||||
|
||||
- le C est compilé en code machine
|
||||
- la compilation est une chaîne
|
||||
- assembleur dépend de la toolchain
|
||||
- linker construit le binaire
|
||||
- format dépend du système
|
||||
- ABI dépend de l’OS
|
||||
|
||||
Reference in New Issue
Block a user