Qu'est-ce que ELF ?

Abréviation de Executable and Linkable Format. Format de fichier utilisé pour les fichiers objets, exécutables et bibliothèques partagées sous Linux et les autres OS de type UNIX, ainsi que dans l'embarqué.

Nom japonais: ELF

« ELF » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Éditeurs de liens, chargeurs et exécutables.

Domaine: Éditeurs de liens, chargeurs et exécutables

Le contenu d'un fichier ELF

Un fichier ELF (Executable and Linkable Format) commence par un en-tête ELF débutant par les octets magiques 0x7F suivis des lettres E, L et F. L'en-tête indique si le fichier est en 32 ou 64 bits, son ordre des octets, le processeur cible, le type de fichier et l'adresse du point d'entrée où commence l'exécution. Le même format couvre les fichiers objets relocalisables produits par le compilateur, les exécutables, les bibliothèques partagées et les core dumps. Après l'en-tête viennent une table des en-têtes de programme, le contenu lui-même et une table des en-têtes de section décrivant chaque section.

Sections et segments

ELF offre deux vues des mêmes octets. L'éditeur de liens travaille avec des sections à grain fin, comme .text pour le code, .rodata pour les constantes, .data pour les variables initialisées et .bss pour les variables initialisées à zéro, qui n'occupe aucune place dans le fichier et est remplie de zéros au chargement. Le chargeur travaille avec les segments listés dans les en-têtes de programme, qui regroupent les sections par permissions : .text et .rodata vont généralement dans un segment lecture-exécution, .data et .bss dans un segment lecture-écriture. Ce regroupement par permissions simplifie la mise en place de la protection mémoire au niveau des pages.

Comment ELF prend en charge l'édition de liens et le chargement

Les fichiers objets contiennent des tables des symboles et des entrées de relocalisation qui indiquent à l'éditeur de liens quelles adresses corriger lorsque code et données sont combinés. Les exécutables liés dynamiquement désignent un interpréteur, le chargeur dynamique, dans un en-tête de programme, et incluent une section dynamique listant les bibliothèques partagées requises ; les appels vers ces bibliothèques passent généralement par une table de liaison des procédures (PLT) et une table globale des décalages (GOT), afin que les adresses puissent être résolues à l'exécution. Les informations de débogage sont stockées dans des sections supplémentaires que les outils peuvent supprimer (strip). Les chaînes d'outils embarquées produisent souvent un ELF, puis le convertissent en binaire brut ou en fichier hex pour la programmation de la flash.

ELF, PE et Mach-O

Linux, les BSD et de nombreux systèmes embarqués utilisent ELF, Windows utilise le format Portable Executable (PE) pour les fichiers .exe et .dll, et macOS et iOS utilisent Mach-O. Les idées sous-jacentes (régions de code et de données, symboles, relocalisations et informations d'édition de liens dynamique) sont similaires, mais les formats diffèrent, tout comme les interfaces d'appels système et les bibliothèques attendues par les programmes. C'est pourquoi un programme compilé ne s'exécute pas tel quel sur un autre système d'exploitation, même sur le même processeur.

S'entraîner : questions sur ELF

Quelle affirmation concernant les fichiers au format ELF, courant sous Linux notamment, est correcte ?

  1. AC'est un format réservé aux exécutables, inutilisable pour les fichiers objets
  2. BIl sert aussi bien aux fichiers objets qu'aux exécutables et aux bibliothèques partagées, et se compose d'un en-tête, de sections, etc.
  3. CC'est un format de stockage d'images
Afficher la réponse et l'explication

Réponse : B. Il sert aussi bien aux fichiers objets qu'aux exécutables et aux bibliothèques partagées, et se compose d'un en-tête, de sections, etc.

ELF (Executable and Linkable Format) est le format de fichier de programme utilisé par Linux et de nombreux OS de type UNIX ainsi que par les systèmes embarqués. L'en-tête ELF initial indique le CPU cible, le caractère 64 bits ou non, l'adresse de début d'exécution, etc., suivi des sections comme .text et .data, et des en-têtes de programme décrivant les unités que le chargeur place en mémoire. Windows utilise le format PE et macOS le format Mach-O.

Quelle est la différence correcte entre « section » et « segment » dans un fichier ELF ?

  1. ASection est le terme Windows et segment le terme Linux ; le contenu est le même
  2. BLa section est l'unité fine manipulée par l'éditeur de liens, et le segment l'unité de chargement en mémoire par le chargeur, regroupant des sections de mêmes droits
  3. CLes segments n'existent que sur disque et ne sont pas chargés en mémoire
Afficher la réponse et l'explication

Réponse : B. La section est l'unité fine manipulée par l'éditeur de liens, et le segment l'unité de chargement en mémoire par le chargeur, regroupant des sections de mêmes droits

ELF offre deux vues. L'éditeur de liens effectue la combinaison et la relocalisation par sections fines : .text, .rodata, .data, .bss, etc. Le chargeur projette en mémoire par segments décrits dans les en-têtes de programme, en regroupant par exemple .text et .rodata dans un segment lecture-exécution, et .data et .bss dans un segment lecture-écriture. Regrouper par droits facilite la configuration de la protection par page.

Questions fréquentes

Que signifie ELF ?

ELF signifie Executable and Linkable Format, le format de fichier standard des fichiers objets, des exécutables et des bibliothèques partagées sous Linux et sur de nombreux autres systèmes de type UNIX et embarqués.

Quelle est la différence entre sections et segments dans ELF ?

Les sections sont des unités à grain fin, comme .text et .data, que l'éditeur de liens combine et relocalise. Les segments, décrits par les en-têtes de programme, regroupent les sections de mêmes permissions en unités que le chargeur projette en mémoire.

Un exécutable ELF peut-il fonctionner sous Windows ?

Pas nativement. Windows attend le format PE et ses propres interfaces système ; un programme ELF nécessite donc une couche de compatibilité, une machine virtuelle sous Linux ou une recompilation pour Windows.

« ELF » dans les explications

Questions mentionnant « ELF » (3)

  1. Quelle affirmation concernant les fichiers au format ELF, courant sous Linux notamment, est correcte ?
  2. Quelle est la différence correcte entre « section » et « segment » dans un fichier ELF ?
  3. Quelle combinaison des formats d'exécutables utilisés par les principaux OS est correcte ?

Termes associés

Chargeur (loader) Relocalisation Éditeur de liens (linker) Édition de liens dynamique ASLR Bibliothèque partagée Bibliothèque statique Code indépendant de la position Décoration de noms (name mangling) Éditeur de liens dynamique

Retour au glossaire