---
# System prepended metadata

title: Harmonisation Technologique Système (Cours 1)
tags: [HTS, ' jerome.tchan']

---

---
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