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