---
titre: Harmonisation Technologique Système (Cours 1)
description: Harmonisation Technologique Système (Cours 1), 10/02/2020
tags: HTS, jerome.tchan
author: Jérôme Tchan
---
# Harmonisation Technologique Système (Cours 1)
## Révisions
### Comment on compile un fichier C?
On part d'un fichier C
- Préprocesseur (gestion des macros)
=> On passe a un `.i`
- Compilateur (`cc1`)
=> Puis un `.s` (vs `.S`: on peut inclure des directives de préprocesseur dans le `.S`)
- Assembleur (`as`)
=> `.o`
- Linker (`ld`) => relocations, construire les segments
*segment: comment on met le binaire en mémoire (quelle addresse, quelle taille, etc.)*
=> executable
Deux cas pour reloc:
- Variables globales
- Fonctions externes (en dehors du `.o`)
Sections (`.text`, `.data` par ex.): généralement éloignées
Les stacks exécutables c'est pas bien (mais le C le fait)
---
Sections (`readelf -S [fichier]`):
- `.text`: le code
- `.data`: variables globales
- `.rodata`: string littérales, vtables
- `.bss`: contient la taille des données non init / init a 0
- `.symtab`: table des symboles
- `.strtab`: table des strings
- `.eh_frame`: exception handler, destruction des variables locales
- `.rela.text`: table de reloc de `.text`
*vtables: table de pointeurs sur fonction vers les fonctions virtuelles => héritage / polymorphisme en C++*
Deux formats d'ELF: 32 et 64
Structure d'un ELF:
- Nom
- Types:
- PROGBITS: il y a des bouts du programme dans la section
- NULL
- RELA
- NOBITS
- SYMTAB
- Adresse
- Offset
- Taille
- EntSize
- Flags: infos pour le linker (voir légende de `readelf`)
- Link: section liée à la section courante
- Info
- Align
On utilise Link / Info pour savoir quelle STRTAB utiliser
Symbole weak:
- peut être remplacé par son homologue non weak si conflit de noms
- on peut s'en servir pour faire une implémentation générique (weak) et une implémentation spécialisée (non weak)
ELF Header types:
- REL (relocatable): `.o`
- Dynamic: `.so`
- Executable
- Core dumps (état mémoire du programme quand ca a abort)
Table des symboles (`readelf -s [fichier]`):
- Ndx: index de la section
- Bind: global (externe) ou local (statique)
- Value: adresse
- Type
- Size
- Name
- Vis
Segments:
- Type
- LOAD
- NOTE
- TLS: thread local storage (variables par thread)
- GNU_STACK: "mets pas la stack en executable stp mici"
- GNU_RELRO
- Offset
- Virtual Address
- Physical Address
- File Size
- Memory Size (taille dans la mémoire)
- Flags
- Align
PIE = position independent executable