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