Système d’Exploitation 1 - Chapitre 2 PDF
Document Details
Uploaded by Deleted User
École supérieure en informatique de Sidi-Bel-Abbès
Dr. M. Baba Ahmed
Tags
Summary
Ce document est un chapitre sur les systèmes d'exploitation, se focalisant sur la liaison et le chargement de programmes. L'auteur Dr. M. Baba Ahmed aborde des notions telles que : l'assemblage, la compilation, les modules objets, éditeurs de liens, et les chargeurs pour le système d'exploitation. Il est destiné à des étudiants de première année en cycle second en informatique.
Full Transcript
Système d’Exploitation 1 Chapitre 2 : Liaison et chargement de programmes 1 ère Année Second Cycle Dr. M. Baba Ahmed 1 Plan chapitre 2 1. Introduction : Assemblage, compilation et tables de symboles 2. Les modules o...
Système d’Exploitation 1 Chapitre 2 : Liaison et chargement de programmes 1 ère Année Second Cycle Dr. M. Baba Ahmed 1 Plan chapitre 2 1. Introduction : Assemblage, compilation et tables de symboles 2. Les modules objets Modules objets Translatables Modules objets exécutables Modules objets partageables (ou bibliothèques partagées) 3. Éditeurs de liens Éditeurs de liens statiques Éditeurs de liens dynamiques et bibliothèques partagées 4. Exemples de modules objet Le module objet ELF (Executable and linkable Format) Le module objet PE (Portable Executable) de Windows 5. Chargeurs 2 Assemblage Assemblage ou langage assembleur (un langage de programmation de bas niveau) Le langage machine est le code binaire directement exécutable par un processeur Le langage assembleur est une représentation textuelle du langage machine, rendant la programmation à bas niveau plus accessible aux humains. Chaque type de processeur a son propre ensemble d'instructions d'assembleur, car l'architecture matérielle varie d'un processeur à l'autre. L’assembleur convertit le code assembleur en un code machine. 3 Compilation La compilation est le processus par lequel un programme source écrit dans un langage de programmation de haut niveau C++, Java, Python…, est transformé en un programme exécutable qui peut être exécuté par un processeur Un fichier objet est un fichier généré lors de la compilation d'un programme source. Il contient le code machine du programme ainsi que des informations sur les références externes. Il sert d'intermédiaire entre le code source lisible par les humains et l'exécutable final qui peut être exécuté par une machine. Un compilateur peut traduire un code source directement en langage machine 4 Compilation Le fichier objet comporte : o Le code machine produit à partir de l’assembleur o La table des symboles Symbole o Un symbole est un nom de fonction ou de variable. o Chaque symbole est associé à une adresse mémoire spécifique (lors de l’exécution) Rappel : deux types de fichier sont utilisés par un compilateur C: Les fichiers.h (variables, const, prototypes) et les fichiers.c (définitions, implémentation) 5 Le processus de compilation Pré-traitement : le préprocesseur examine le code source a la recherche de directives (commençant par le symbole # dans le langage C++) Analyse lexicale (découpe le code en unités), analyse syntaxique (vérification de la syntaxe), analyse sémantique (sens) Optimisation du code : réduire la taille du programme final (la simplification d’expression) Génération de code assembleur : transformation du code source en code assembleur Assemblage : transformation du code assembleur en code langage machine Liaison (linking) si le programme utilise des fonctions ou des bibliothèques (un programme très simple qui ne nécessite pas de dépendances externes) Fichier exécutable 6 Le préprocesseur (les directives) Des instructions, utilisées pour communiquer avec le compilateur ou le préprocesseur #include utilisée pour inclure le contenu d'un fichier d'en-tête (header file) dans un programme Exemple : qui fournit des fonctions d’entrés sorties #define utilisée pour définir des macros (des identificateurs qui représentent une valeur constante, fonctions) (utilisé pour remplacer les macros avec leurs valeurs dans le code) const x,x (évaluer/remplacer pendant l’éxecution) #ifdef, #ifndef, #endif utilisées pour vérifier si un symbole est défini, permettant de contrôler quelles parties du code sont compilées en fonction de conditions prédéfinies #if, #elif, #else permettent de choisir quel bloc de code sera compilé en fonction d'expressions conditionnelles 7 Le préprocesseur (les directives) Exemple : If est évalué lors de l’exécution d’un code et la condition sera décidé au moment de l’exécution #if est évalué lors de la compilation et la condition sera décidé au moment de la compilation #include #define VERSION 3 int main() { #if VERSION > 1 printf("La version est supérieure à 1\n"); #else printf("La version est inférieure ou égale à 1\n"); #endif return 0} 8 Le préprocesseur (les directives) Exemple : If est évalué lors de l’exécution d’un code et la condition sera décidé au moment de l’exécution #if est évalué lors de la compilation et la condition sera décidé au moment de la compilation #include int main() { Int n; Printf("nombre"\n); Scanf("%d" ,&n); If n>0 {printf(" positif "\n); Else {printf("negatif" \n); return 0} 9 Le préprocesseur Permet d’inclure le contenu d’autre fichiers directement dans le code source à l’aide de la directive #include Définit des macros à l’aide la directive #define, lors de la compilation ces macros sont remplacées par leur contenu, exemple #define PI 3.14 Float x = 2*3.14*R # define square (x) Int b = square (a) Float x = 2*PI*R = ((x)*(x)) //square(a)=((a)*(a)) Suppression de commentaires Conserve des parties du code en fonction de la validité des conditions spécifiées avec #if, #ifdef, #ifndef, #elif, #else, #endif 10 Le préprocesseur Exemple : #include Code de stdio.h #define TAILLE 100 ……………… int main() int main() { { int variable = 5; int variable = 5; variable *= 100; variable *= TAILLE; printf("Variable vaut : %d\n", printf("Variable vaut : %d\n", variable); variable); variable += 100; printf("Variable vaut : %d\n", variable += TAILLE; variable); printf("Variable vaut : %d\n", return 0; variable); } return 0;} 11 Le processus de compilation 12 La table de symbole Noms des variables et des fonctions Gestion de la table des symboles : o Une structure de données contenant un enregistrement pour chaque identificateur, muni de champs pour ses attributs (adresse, son type ….). Pour les fonctions, la table des symboles garde le nombre et les types de ses arguments) 13 La table de symbole Les symboles importés sont des fonctions ou des variables qui sont utilisées dans un fichier source, mais dont la définition se trouve dans un autre fichier source ou dans une bibliothèque externe. Les symboles exportés sont des fonctions ou des variables qui sont définies dans un fichier source et qui sont disponibles pour être utilisées dans d'autres fichiers source. 14 L’éditeur de lien Un compilateur proprement dit ne produit pas de fichier exécutable finale, cette tâche étant confiée à l'éditeur de liens (Linker). L'éditeur de liens est le programme qui lie (établis des connexions) les fichiers objet entre eux pour produire un fichier exécutable. Il inclut des bibliothèques (code déjà compilé écrit en langage machine) : fonctions d'entrées- sorties, fonctions mathématiques. (définitions complètes des fonctions) Remarque: les opérations de pré-compilation, compilation, assemblage et d’édition des liens sont généralement regroupés dans un seul processus, qu’on appel souvent « processus de compilation » 15 La chaine de production et d’exécution de programme 16 L’éditeur de lien La construction d'un programme à partir d'un ensemble de modules. La communication entre module peut se faire par: o Variable globale : Une variable appartenant à un module et accessible depuis un ou plusieurs autres modules. o Appel de procédure : une procédure ou une fonction appartenant à un module et accessible depuis un ou plusieurs autres modules. On appelle lien d'objet relais, qui permet à un module d'accéder à un objet appartenant à un autre module. 17 L’éditeur de lien Opérations réalisées : Assemblage des fichiers objets dans le fichier exécutable. Vérification de la définition des symboles utilisés à l’aide des tables des symboles des fichiers objets Entrée : fichiers.o Sortie : fichier exécutable.exe 18 Les modules objets Modules objets translatables produits par un compilateur ou un assembleur, Modules objet exécutables produits par l’éditeur de liens, Modules objet partagés appartenant à une bibliothèque dynamique qui est produite par un compilateur ou un logiciel spécifique. Ces modules seront liés dynamiquement au programme lors de son exécution. 19 Module objet translatable La compilation ou l'assemblage d'un programme source permet de produire des modules objet translatables ou relogeables (dénommé : module objet). Les principaux composants d’un module objet translatable : 1. En-tête (nom module, format, informations sur l’architecture matérielle, taille fichier objet …) 2. Table des références externes (Symboles à importées). 3. Table des définitions globales (Symboles à exportées). 4. Programme (Code + données) 5. Table des informations de translation. 20 Module objet exécutable A partir des modules objets et de(s) bibliothèque(s) système (permettent aux programmes d’interagir avec le matériel) et éventuellement des bibliothèques utilisateurs (pour développeurs), l'éditeur de liens statique génère un module exécutable (dénommé : fichier exécutable). Le fichier(module) exécutable contient une copie de chacun des modules objet translatables (relogeables) ainsi que les copies des différentes fonctions (ou procédures) des bibliothèques système ou utilisateur qui sont appelées dans les différents modules. 21 Module objet exécutable La translation d'un module objet consiste à modifier son contenu (les adresses) pour qu'il puisse s'exécuter à un endroit différent de celui pour lequel il était prévu initialement. La translation est réalisée : Lors du chargement du fichier exécutable en mémoire centrale par le chargeur si la mémoire virtuelle n’est pas utilisée. Pendant l’exécution par le MMU (memory management unit) si la mémoire virtuelle est utilisée. 22 Module objet exécutable absolu Dans les modules exécutables absolus tels que de MS/DOS, les adresses sont absolues. Le fichier est chargé en mémoire à une adresse fixe, sans aucune modification. Un fichier exécutable absolu s’exécute toujours à la même adresse mémoire : Si la zone mémoire considérée est occupée, le fichier ne peut pas être chargé. Ces fichiers sont généralement utilisés sur les petites machines et les systèmes embarqués. 23 Bibliothèque de programme Une bibliothèque regroupe en général des fonctions ou procédures. On peut avoir, par exemple: Une bibliothèque de fonctions mathématiques, Une bibliothèque des fonctions graphiques, Des bibliothèques spécifiques aux utilisateurs. Des bibliothèques systèmes. 24 Principaux composants d’un fichier exécutable En-tête : informations sur la structure et les caractéristiques du fichier exécutable, telles que l'architecture du processeur cible, les bibliothèques nécessaires, les permissions, etc Code machine (Machine Code) : contient les instructions du programme qui seront directement exécutées par le processeur. Données (Data) : Cela peut inclure des chaînes de caractères, des tableaux, etc. Table de symboles (Symbol Table) : Elle contient des informations sur les symboles utilisés dans le programme, comme les noms de fonctions, de variables, etc. BSS (Block Started by Symbol) : il s'agit d'une section spéciale pour les données non initialisées. ces variables seront automatiquement initialisées à zéro ou à une valeur par défaut par le SE ou le programme d'exécution. 25 Principaux composants d’un fichier exécutable Remarque : La structure exacte d'un fichier exécutable dépend du format (structure et l’organisation des données dans le fichier) de fichier spécifique, et de l'architecture matérielle un SE peut avoir aussi ses propres exigences 26 Editeur de lien statique (définition) Un processus qui vise à lier les différents fichiers objets (contenant le code source compilé) et les bibliothèques statiques Il a pour rôle de prendre les différents modules de code objet générés par le compilateur et de les combiner pour former un exécutable autonome qui ne dépend pas d'autres bibliothèques externes lors de l'exécution Les fichiers objets, ainsi que les bibliothèques statiques (qui sont des bibliothèques précompilées contenant du code réutilisable), sont passées à l'éditeur de liens statique. Cet éditeur va résoudre les références entre les différentes parties du code et créer un fichier exécutable complet 27 Editeur de lien statique (fonctionnement) Collecte des fichiers objets : rassembler tous les fichiers objets générés par le compilateur à partir du code source (file.o) Résolution des symboles : Le linker examine les symboles utilisés dans les fichiers objets et les compare avec les symboles définis. Il vérifie que toutes les références à des fonctions et des variables sont correctement résolues. Si un symbole n'est pas trouvé, le linker génère une erreur. Inclusion des bibliothèques statiques : Si le programme utilise des bibliothèques statiques, le linker inclut directement le code de ces bibliothèques dans le fichier exécutable. Cela signifie que le fichier exécutable contient toutes les fonctions nécessaires pour fonctionner, sans dépendre d'une bibliothèque externe 28 Editeur de lien statique (fonctionnement) Readressage (Relocation) : Le linker peut avoir besoin de réadresser certaines parties du code pour s'assurer que les adresses sont correctes lorsque le programme est chargé en mémoire. Génération de l'exécutable : Le linker combine tous les fichiers objets et les bibliothèques statiques pour créer et générer un fichier exécutable autonome Remarque : L’éditeur de liens peut utiliser une ou plusieurs bibliothèques systèmes ou utilisateurs. L’édition de liens est réalisée en deux étapes que l’on appelle Passes. 29 Editeur de lien statique (passe 1 ) Définir pour chaque module son adresse début par rapport au fichier exécutable. Une table des modules contenant : le nom du module (main, f1, f2) , la taille du module et l’adresse de chaque module objet. Exemple : int main() { f1(); f2(); return 0; } 30 Editeur de lien statique (passe 1 ) Construire une table globale des symboles contenant tous les identificateurs externes/internes des différents modules objet : o Variables et fonctions globales ou exportées o Variables ou fonctions définies dans un autre module : importées. La table contient : l’identificateur et l’adresse relative par rapport au début du fichier, type, taille Cette table est construite à partir des tables de symboles des différents modules objet 31 Editeur de lien statique (passe 1 ) Lorsque le code source est compilé, des adresses relatives sont utilisées pour faire référence à des fonctions/variables qui se trouvent dans d'autres parties du code. Or ces adresses ne sont pas fixes, et le code peut être chargé à différentes adresses en mémoire lors de l'exécution : Adressage virtuel : Les SE modernes utilisent souvent un adressage virtuel, où l'adresse que voit le programme est différente de l'adresse physique réelle dans la mémoire. Utilisation de bibliothèques partagées : Si le programme utilise des bibliothèques dynamiques, les adresses relatives peuvent changer en fonction de la façon dont ces bibliothèques sont chargées en mémoire au moment de l'exécution. Optimisations du compilateur : Le compilateur peut effectuer des optimisations qui modifient les emplacements des fonctions et des variables dans le fichier objet. 32 Editeur de lien statique (passe 1 ) Adressage virtuel : Les SE modernes utilisent souvent un adressage virtuel, où l'adresse que voit le programme est différente de l'adresse physique réelle dans la mémoire. Utilisation de bibliothèques partagées : Si le programme utilise des bibliothèques dynamiques, les adresses relatives peuvent changer en fonction de la façon dont ces bibliothèques sont chargées en mémoire au moment de l'exécution. Optimisations du compilateur : Le compilateur peut effectuer des optimisations qui modifient les emplacements des fonctions et des variables dans le fichier objet. 33 Editeur de lien statique (passe 1 ) A la fin de la première passe, tout identificateur référencé dans un ou plusieurs modules objet ou défini comme externe dans un module doit se trouver dans la table des symboles. Si un identificateur se trouvant dans cette table n’a pas d’adresse o L’identificateur n’a pas été correctement défini (c’est une erreur) o Le fichier exécutable ne sera pas créé. o Cela indique un problème dans la façon dont les modules source ont été écrits, déclarés ou liés ensemble. Si la passe 1 se déroule sans problème une passe 2 est lancée 34 Editeur de lien statique (passe 2 ) Résolution des références (symboles) o Remplacer chacune des références, se trouvant dans la table de translation, par son adresse qui se trouve dans la table globale des symboles créer dans la passe 1 Tables utilisées : o La table de translation o La table globale des symboles. 35 Editeur de lien statique (passe 2 ) Construire une table globale des translations (identifiant, adresse) Dans le contexte d'un éditeur de liens statique, une table de translation (chargeur l’utilise comme guide pour les réajustement) Son rôle est d'ajuster les adresses mémoire des symboles dans les différents modules du programme pour qu'ils correspondent correctement lors de l'exécution 36 Editeur de lien statique (inconvénient ) Chaque programme généré doit contenir des copies exactement des mêmes fonctions communes de la bibliothèque système. En termes d'utilisation de la mémoire physique et de l'espace disque, il est beaucoup plus efficace de charger les bibliothèques système en mémoire une seule fois. Solution : éditeur de lien dynamique 37 Editeurs de liens dynamiques Rappel : Modules objets translatables produits par un compilateur ou un assembleur, Modules objet exécutables produits par l’éditeur de liens, Modules objet partagés appartenant à une bibliothèque dynamique qui est produite par un compilateur ou un logiciel spécifique. Ces modules seront liés dynamiquement au programme lors de son exécution. 38 Editeurs de liens dynamiques Principe : o Les bibliothèques sont liées au programme au moment de l’exécution o Un module partagé ne sera pas inclus dans le fichier exécutable. o Gain de temps et gain d’espace dans le fichier exécutable. Permet le partage des modules entre plusieurs programmes o Gain d’espace en mémoire centrale (RAM). 39 Editeurs de liens dynamiques (étapes) Lors de l'exécution d'un programme, le SE (et plus spécifiquement, le chargeur) est chargé de lier les bibliothèques dynamiques avec l'exécutable. L'éditeur de liens ajoute une section spéciale à l'exécutable appelée la « Table de liaison dynamique » qui contient des informations sur les bibliothèques dynamiques que le programme utilise et les adresses où elles peuvent être trouvées. Le chargeur, charge l’exécutable en mémoire et examine les adresses dans le code exécutable et les ajuste pour refléter l'emplacement actuel du programme en mémoire. Le chargeur examine aussi la table de liaison dynamique pour identifier les bibliothèques dynamiques nécessaires 40 Editeurs de liens dynamiques (étapes) Le chargeur recherche et localise les bibliothèques dynamiques mentionnées dans la table de liaison dynamique Le chargeur charge la bibliothèque dynamique en mémoire. Une fois que les bibliothèques sont chargées, le chargeur met à jour les références dans le programme pour pointer vers les adresses mémoire réelles des fonctions et des variables dans les bibliothèques dynamiques. Cela se fait à l'aide d'une technique appelée « réadressage dynamique » ou « reliaison dynamique » Une fois que tous les symboles ont été résolus le programme peut s'exécuter normalement 41 Editeurs de liens dynamiques vs statiques Editeur de lien statique Editeur de lien dynamique La liaison avec la bibliothèque se fait pendant la La liaison avec la bibliothèque se fait pendant compilation l'exécution. Taille de fichier généralement plus grande, car Taille de fichier plus petite, car les bibliothèques toutes les bibliothèques requises sont incluses sont liées dynamiquement au moment de dans l'exécutable. l'exécution. Moins flexible, toute mise à jour ou modification Plus flexible, les bibliothèques peuvent être mises des bibliothèques nécessite une recompilation et à jour ou remplacées sans recompiler le une nouvelle liaison de l'ensemble du programme. programme. Démarrage plus rapide du programme et Démarrage du programme légèrement plus lent exécution directe, car toutes les bibliothèques en raison du processus de liaison supplémentaire. 42 Editeurs de liens dynamiques vs statiques Les bibliothèques statiques : utilisées par un éditeur de liens statique qui sont de la forme : o.a: Unix/Linux o.lib: Windows o Exemple : libc.a, libm.a dans le répertoire /usr/lib Les bibliothèques dynamiques partagées: utilisées par un éditeur de liens dynamique qui sont de la forme : o.so: Unix /Linux (Shared Object) o.dll: Windows (Dynamic Link Libraries) 43 Le format des modules objets Le "format" d'un fichier objet fait référence à la structure et à l'organisation spécifiques du fichier objet, il définit comment ces informations sont organisées et stockées. Les éléments clés du format d’un fichier objet sont : En-tête : type de fichier objet, la taille du module …. Sections : (section code machine, les données, les symboles) Code Machine, données Symboles : des noms pour référencer des fonctions/ variables….. Références aux bibliothèques : Si le fichier objet dépend d'autres bibliothèques 44 Le format des modules objets ELF (Executable and Linkable Format) : un format de fichier objet standard sur la plupart des systèmes d'exploitation à noyau Unix et Linux. Il est utilisé pour les exécutables, les bibliothèques partagées, les fichiers objets, etc. COFF (Common Object File Format) : Ce format était autrefois couramment utilisé sur les systèmes à noyau Unix et Windows. Bien qu'il soit moins populaire aujourd'hui, il a été à la base de nombreux formats de fichiers exécutables et objets. PE (Portable Executable) : C'est le format de fichier objet standard sur les systèmes Windows. Il est utilisé pour les exécutables, les DLL (Dynamic Link Libraries), et (COFF pour les fichiers objets) Mach-O (Mach Object) : Utilisé principalement sur les systèmes d'exploitation Apple, notamment macOS et iOS 45 ELF (Executable and Linkable Format) Le format utilisé actuellement par les systèmes Unix/linux. ELF remplace le format COFF qui était le format d’Unix Permet la liaison dynamique (édition de liens dynamique) (il existe des formats qui ne prennent pas en charge les liaisons dynamiques) Un module ELF peut être: o Un fichier objet translatable o Un fichier exécutable o Une bibliothèque partageable Un fichier au format ELF est composé de plusieurs sections 46 Principales sections d’un fichier objet ELF En-tête ELF header Code ou instructions.text Constantes : données en lecture seule.rodata (read only data) Données initialisées.data Données non initialisées.bss (block start symbol) Table des symboles.symtab (symbol table) Instructions qui indiquent au (linker) où et.rel (relocation) comment ajuster les adresses de certaines parties du code lorsqu'il lie plusieurs fichiers objets ensemble pour créer un exécutable Chaines de caractères.strtab (string table) Tables des en-têtes des sections Section header table 47 Principales sections d’un fichier exécutable ELF En-tête ELF header Table des en-têtes de programmes Program headers table Programme initialisation de l’exécution (variables,.init fonctions) Constantes : données en lecture seule.rodata Code ou instructions.text Données initialisées.data Données non initialisées.bss (block start symbol) Table des symboles.symtab Instructions sur les ajustements qui doivent être.rel faits aux adresses mémoire lors de l'exécution pour prendre en compte les liaisons dynamiques Chaines de caractères.strtab Tables des en-têtes des sections Section header table 48 En-tête d’un fichier ELF Il contient les informations sur la structure du module objet. L’en-tête se trouve au début du fichier à l’octet 0. Architecture 32 bits ou 64 bits Numéro de version du format ELF Système d’exploitation Type du module objet (fichier translatable, fichier exécutable, objet partagé), Adresse mémoire où le programme commence à s'exécuter après son chargement (si fichier exécutable) Taille de l'en-tête ELF en octets. 49 Table des en-têtes de sections ELF La table des en-têtes de sections d'un fichier permet de retrouver toutes les sections du fichier, et contient : Le nom de la section Type de la section :.data,.bss ….. Adresse de la section (par rapport au début du fichier) Taille de la section (en octets) Taille des entrées : pour les sections qui contiennent une série d'éléments (comme les tables) 50 Table des symboles.symtab/.strtab ELF Strtab (table de chaines de caractères) La section.strtab contient une table de chaînes de caractères qui stocke les noms des symboles, d'autres informations textuelles. Symtab (table de symbole) La section.symtab contient une table de symboles qui associe des noms à des adresses mémoire, tel que les variables/fonctions Les entrées de la section symtab font référence aux noms de symboles en utilisant des indices qui correspondent à des chaînes de caractères dans la strtab, cela permet d'économiser de l'espace, car au lieu de stocker des noms complets pour chaque symbole seul des indices vers les chaînes appropriées sont stockés 51 Les tables PLT et GOT Lorsqu’un programme qui utilise des bibliothèques partagées doit être exécuté, le chargeur dynamique est chargé de résoudre les références d'adresses vers les fonctions de ces bibliothèques. Cela signifie qu'il va associer les appels de fonctions dans le programme à des adresses spécifiques dans les bibliothèques partagées chargées en mémoire. Afin d’optimiser les performances de cette opération deux tables sont utilisées PLT et GOT. 52 Les tables PLT et GOT La PLT (Procedure Linkage Table) et la GOT (Global Offset Table) sont deux structures utilisées dans le processus de résolution dynamique des appels de fonctions dans les programmes exécutables et les bibliothèques partagées La PLT contient des entrées, ou chaque entrée correspond à une fonction dans une bibliothèque partagée que le programme pourrait appeler. Ces entrées sont des petites routines de code qui contiennent des instructions pour appeler la fonction dans la bibliothèque partagée. Une fois que l'adresse réelle de la fonction est résolue, elle est stockée dans la GOT, cela évite d'avoir à refaire la résolution dynamique pour les appels ultérieurs à cette fonction. 53 Les tables PLT et GOT Ainsi, lorsqu'une fonction est appelée à nouveau, elle utilise l'adresse stockée dans la GOT. La PLT gère principalement la résolution initiale des fonctions appelées dynamiquement. La GOT gère le stockage et l'accès efficace aux adresses de fonctions et de variables globales. Les adresses aux variables sont stockées dans la GOT lors du chargement du programme dans la mémoire centrale 54 Portable Executable (PE) Le format Portable Executable (PE) de Windows contient plusieurs sections et en-têtes qui décrivent la structure et le contenu d'un fichier exécutable ou d'une bibliothèque dynamique Le format PE supporte l'édition de liens statique et dynamique En-tête DOS MZ : qui permet à l'exécutable d'être compatible avec MS-DOS (Microsoft). Une fois que l'en-tête DOS MZ est identifié, le SE Windows sait où trouver l'en-tête PE et les autres informations nécessaires pour exécuter le fichier PE. En-tête PE : C'est l'en-tête principal du fichier PE. Il contient des informations sur le fichier, telles que le type de fichier (exécutable, DLL, etc.), le nombre de sections, etc. 55 Portable Executable (PE) Sections : Le fichier PE est divisé en sections. Les sections peuvent inclure le code exécutable, les données initialisées, les données non initialisées, etc. Table d'importation : contient des informations sur les fonctions et les bibliothèques dynamiques utilisées par le programme. Elle indique quelles fonctions sont importées depuis d'autres DLL. Table d'exportation : contient une liste des fonctions qu'elle expose et qui peuvent être utilisées par d'autres programmes. …….etc 56 Chargeurs Les chargeurs sont responsables du chargement des programmes exécutables en mémoire pour les exécuter Chargeur d’amorçage (Boot Loader) charger un système d'exploitation dans la mémoire principale (RAM) à partir d'un périphérique de stockage une fois que le SE est opérationnel, d’autre chargeurs interviennent lorsque des programmes sont exécutés par l'utilisateur. Chargeur de programme utilisé pour charger des programmes exécutables en mémoire pour les exécuter, et réajuster les adresses de l’exécutable avant son exécution, et résoudre les références à des bibliothèques partagées, si un éditeur de liens dynamique est utilisé. 57 Chargeurs L’image du programme qui sera implantée en mémoire centrale par le chargeur pour que le programme puisse enfin être exécuté. Cette image mémoire est donc construite à partir de l’exécutable lors du chargement en mémoire. L’image contient une pile d’exécution : o Une zone de la mémoire utilisée par un programme en cours d'exécution pour gérer l'exécution des fonctions et stocker temporairement des données (exemple fonction récursive) o Permet de maintenir un suivi des opérations en cours 58