--- title: HTS - D1 description: tags: HTS, moemoea.fierin author: Moemoea Fiérin prof: Gabbeh temps: 3h --- # Préambule - manque un exercice = zéro - validation rapide # Comment est-ce qu'on compile du C ## **étape 1: Préprocesseur** - fichier .c -> on appelle le préprocesseur - le processeur s'occupe des pragmas des macros - le + important pour un compilateur = renvoyer les erreurs de manière valide - on passe .c vers .i ## **étape 2: Compilation** - compile le programme - .i vers .s - .s != .S - .S on peut mettre des directives au preprocesseur - nom du compilateur: cc1 ## **étape 3: Assembleur** - .s vers .o ## **étape 4: Linker** - .o -> executable - ELF - les segments comment on met le binaire en memoire - pour les construire il faut avoir tous ce qu'on veut mettre dedans pour pouvoir calculerla taille, les permissions, ect... - c'est ici que les relocations sont faite - dans quel cas j'ai besoin des relocs: - les fonctions externes/les fonctions ailleurs en dehors du .o - les variables globales - les sections d'un ELF: - segments cmt on met en rames + permissions sur le segment - sections pour mettre des trucs dans le binaire et pouvoir les trier - =>les petits nom on sait que c'est du code - le link va prendre toutes les sections qui ont le meme nom et va les mettre bout a bout - nom de sections classique: - .rodata les strings litterales - vtables : c'est pour l'heritage et le polymorphisme pour savoir quelle fonction on appelle - .bss: permet avoir une section qui n'a pas de data associe mais juste une taille (ca prend pas de place) => sur le disque ca prend les .data et dans la memoire on compte les .bss en plus. bss = La data globale non initialiser - section qui ne contribue pas a l'exec finale: - les symboles de débug - les tables de strings ==strtab== - le nom des symboles (est dans une table de string) on va avoir une table de symbole. ==symtab== :::success # Mots clés ## vtable Whenever a class defines a virtual function (or method), most compilers add a hidden member variable to the class that points to an array of pointers to (virtual) functions called the virtual method table. These pointers are used at runtime to invoke the appropriate function implementations, because at compile time it may not yet be known if the base function is to be called or a derived one implemented by a class that inherits from the base class. https://en.wikipedia.org/wiki/Virtual_method_table ## segment ## section ## segment BSS ## segment rodata ::: # ELF - .eh_frame: appelle les destructeurs lorsqu'une exception est lancé (exception handler) - deux strtab une qui correspond a la symtab et une pour stocker les noms des sections - link = si une section est relier a celle-la. - permet de mettre des liens entre deux section lorsqu'il y'a des relocs ## Header ELF - utilisé readelf - information de validation peu interessant sauf elf_64 ou elf_32 - type de fichier elf - ET_EXEC - ET_REL relocation info - ET_CORE: core dump des sigAbort - ET_DYN: info sur le linkavec les autres - offset du debuet et taille des headers - offset dy ebut et taille des sections ## relocs - addresse absolue != addresse relative -> au moment ou on va rentrer la valeur on va la rentrer par rapport a l'addresse memoire - selon l'architecture les relocs seront differentes - sur strak (archi presque morte) on a un format d'inst de taille fixe. J'ai besoin de charger des immadiats a certain moment a=128000 Je peux pas charger une add de 32bits d'un coup donc on se retrouve avec deux instruction une pour la partie basse une pour la partie haute de l'addresse ### Les segments - c'est le linker statique qui s'en sert - on peut s'en servir pour debug - segments LOAD (prend a l'offset machin sur la taille X et met le a cette addresse la) - segments TLS - SUR GNU_STACK -> on a les flags de permissions # But Ecrire un linker # Github - hello: zero relocs faut craft les programmes header - deuxieme: une relocs dans le rodata -