---
# System prepended metadata

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

---

---
titre: Harmonisation Technologique Système (Cours 2)
description: Harmonisation Technologique Système (Cours 2), 12/02/2020
tags: HTS, jerome.tchan
author: Jérôme Tchan
---

# Harmonisation Technologique Système (Cours 2)

## Link dynamique

- Fichiers `.so`
- Gain de place et de RAM par rapport au link statique

`man ld.so`

### Exemple

```asm
call puts@plt
```

puts@plt:
```asm
jmp GOT[N]
push $0
jmp plt0
```

plt0:
```asm
push GOT[0]
jmp GOT[1]
```

GOT:

Index | Valeur   | Description
----- | -------- | --------------------------
0     | ??       | un des arguments passés au resolver dynamique
1     | xxx      | adresse resolver dynamique
N     | puts@plt | Si première exécution, jump sur la suite de `puts@plt`, sinon jump sur `puts`

Trois types de program headers:
- `PT_INTERP`: Chemin vers un interpréteur, au chargement du binaire on load l'interpréteur et on saute à l'entry point de l'interpréteur
- `PT_PHDR`: Program header qui décrit où sont les program headers en mémoire
- `PT_DYNAMIC`: Quelles sont les bibliothèques dynamiques, quelles sont les relocations à faire

`auxv`: chargé sur la stack au démarrage du programme et contient:
- adresse vers l'entry point du programme
- program headers du programme

Linker dynamique:
- On récupère l'`l'auxv`
- On récupère l'entry Phdr
- Avec l'entry Phdr on récupère tous les program headers

Structures correspondantes:
- `PT_DYNAMIC`: `Elf64_Dyn`
- `auxv`: `Elf64_auxv_t`

> Voir `elf.h` pour les structures

Load à VirtAddr 0x0 dans un objet dynamique: "charge où tu veux tkt"
=> autres adresses relatives à l'adresse du premier segment

`link_map` dans `link.h`
`r_debug` dans `link.h`
