elf

Autres langues

Langue: fr

Version: 31 juillet 1999 (mandriva - 01/05/08)

Section: 5 (Format de fichier)

31 juillet 1999

NOM

elf - Format des fichiers au Format de Liaison et d'Exécution (ELF)

SYNOPSIS

Fd #include <elf.h>

DESCRIPTION

Le fichier d'en-tête Aq Pa elf.h définit le format des fichiers binaires exécutables ELF. Ces fichiers peuvent être des fichiers exécutables normaux, des fichiers objets repositionnables, des fichiers core et des bibliothèques partagées.

Un fichier exécutable utilisant le format de fichier ELF est constitué d'un en-tête ELF, suivi d'une table d'en-tête de programme ou d'une table des en-têtes de sections, ou des deux. L'en-tête ELF est toujours situé à un décalage de zéro par rapport au début du fichier. Les décalages dans le fichier des tables d'en-tête de programme et des en-têtes de sections sont définis dans l'en-tête ELF. Ces deux tables décrivent le reste des particularités du fichier.

Le fichier d'en-tête décrit, sous la forme de structures C, les en-têtes mentionnés précédemment et inclut également des structures pour les sections dynamiques, les sections de repositionnement et les tables de symboles.

Les types suivants sont utilisés pour les architectures N-bit (avec N=32 ou 64 ; ElfN signifie Elf32 ou Elf64 ; uintN_t signifie uint32_t ou uint64_t) :

 ElfN_Addr       adresse (non signée) du programme, uintN_t
 ElfN_Off        décalage (non signé) dans le fichier, uintN_t
 ElfN_Section    indice (non signé) de section, uint16_t
 ElfN_Versym     informations (non signées) sur les versions
                 des symboles, uint16_t
 Elf_Byte        caractère (char) non signé
 ElfN_Half       uint16_t
 ElfN_Sword      int32_t
 ElfN_Word       uint32_t
 ElfN_Sxword     int64_t
 ElfN_Xword      uint64_t
 

(Note : la terminologie *BSD est quelque peu différente. Elf64_Half est deux fois plus grand que Elf32_Half et Elf64Quarter est utilisé pour uint16_t. Afin d'éviter toute confusion, ces types seront remplacés par des types plus explicites dans la suite de ce document.)

Toutes les structures de données définies par le format de fichier suivent la taille « naturelle » et les principes d'alignement de la classe correspondante. Si nécessaire, les structures de données contiennent un remplissage explicite pour assurer l'alignement sur 4 octets des objets de 4 octets, pour forcer les tailles des structures à être des multiples de 4, et cætera.

L'en-tête ELF est décrit par le type Elf32_Ehdr ou par le type Elf64_Ehdr :

 #define EI_NIDENT 16
 
 typedef struct {
         unsigned char  e_ident[EI_NIDENT];
         uint16_t       e_type;
         uint16_t       e_machine;
         uint32_t       e_version;
         ElfN_Addr      e_entry;
         ElfN_Off       e_phoff;
         ElfN_Off       e_shoff;
         uint32_t       e_flags;
         uint16_t       e_ehsize;
         uint16_t       e_phentsize;
         uint16_t       e_phnum;
         uint16_t       e_shentsize;
         uint16_t       e_shnum;
         uint16_t       e_shstrndx;
 } ElfN_Ehdr;
 

Les champs ont les significations suivantes :

e_ident
Ce tableau d'octets indique comment interpréter le fichier, indépendemment du processeur ou du reste du contenu du fichier. Dans ce tableau, chacun des éléments est nommé par une macro commençant par le préfixe EI_ et peut contenir des valeurs commençant par le préfixe ELF
 Les macros suivantes sont définies :
EI_MAG0
Le premier octet du nombre magique. Sa valeur doit être ELFMAG0 (0 : 0x7f).
EI_MAG1
Le deuxième octet du nombre magique. Sa valeur doit être ELFMAG1 (1 : « E »).
EI_MAG2
Le troisième octet du nombre magique. Sa valeur doit être ELFMAG2 (2 : « L »).
EI_MAG3
Le quatrième octet du nombre magique. Sa valeur doit être ELFMAG3 (3 : « F »).
EI_CLASS
Le cinquième octet indique l'architecture pour ce binaire :
ELFCLASSNONE
Cette classe est invalide.
ELFCLASS32
Cette valeur indique une architecture 32 bits. Il permet d'utiliser des machines avec des espaces d'adressage virtuels et des fichiers d'une taille allant jusqu'à 4 giga-octets.
ELFCLASS64
Cette valeur indique une architecture 64 bits.
EI_DATA
Le sixième octet indique le codage utilisé pour les données spécifiques au processeur de ce fichier. Actuellement, les codages suivants sont permis :
ELFDATANONE
Format de données inconnu.
ELFDATA2LSB
Complément à deux, petit boutien.
ELFDATA2MSB
Complément à deux, gros boutien.
EI_VERSION
Le numéro de version de la spécification du format ELF :
EV_NONE
Version invalide.
EV_CURRENT
Version actuelle.
EI_OSABI
Cet octet identifie le système d'exploitation et l'interface binaire des applications (ABI) auxquels cet objet est destiné. Certains des champs d'autres structures ELF contiennent des valeurs et des drapeaux dont la signification dépend de la plate-forme ; l'interprétation de ces champs dépend de la valeur de cet octet. Par exemple :
ELFOSABI_NONE
Identique à ELFOSABI_SYSV.
ELFOSABI_SYSV
ABI d'UNIX System V.
ELFOSABI_HPUX
ABI de HP-UX.
ELFOSABI_NETBSD
ABI de NetBSD.
ELFOSABI_LINUX
ABI de Linux.
ELFOSABI_SOLARIS
ABI de Solaris.
ELFOSABI_IRIX
ABI d'IRIX.
ELFOSABI_FREEBSD
ABI de FreeBSD.
ELFOSABI_TRU64
ABI de l'UNIX TRU64.
ELFOSABI_ARM
ABI de l'architecture ARM.
ELFOSABI_STANDALONE
ABI autonome (intégrée).
EI_ABIVERSION
Cet octet identifie la version de l'interface binaire des applications (ABI) à laquelle cet objet est destiné. Ce champ permet de différencier des versions incompatibles d'une même ABI. L'interprétation de ce numéro de version dépend de l'ABI indiquée par le champs EI_OSABI. Les applications respectant cette spécification utilisent la valeur 0.
EI_PAD
Début du remplissage. Ces octets sont réservés et positionnés à zéro. Les programmes qui les lisent ne doivent pas en tenir compte. La valeur de EI_PAD sera modifiée dans le futur si l'on décide de donner une signification à des octets actuellement inutilisés.
EI_BRAND
Début de l'identification de l'architecture.
EI_NIDENT
Taille du tableau e_ident.
e_type
Ce champ de la structure identifie le type de fichier objet :
ET_NONE
Un type inconnu.
ET_REL
Un fichier repositionnable.
ET_EXEC
Un fichier exécutable.
ET_DYN
Un objet partagé.
ET_CORE
Un fichier core
e_machine
Ce champ indique l'architecture nécessaire à un fichier individuel. Par exemple :
EM_NONE
Une machine inconnue.
EM_M32
Un WE 32100 d'AT&T.
EM_SPARC
Un SPARC de Sun Microsystems.
EM_386
Un 80386 d'Intel.
EM_68K
Un 68000 de Motorola.
EM_88K
Un 88000 de Motorola.
EM_860
Un 80860 d'Intel.
EM_MIPS
Un RS3000 de MIPS (uniquement gros boutien).
EM_PARISC
Un HP/PA.
EM_SPARC32PLUS
Un SPARC avec jeu d'instructions amélioré.
EM_PPC
Un PowerPC.
EM_PPC64
Un PowerPC 64 bits.
EM_S390
Un S/390 d'IBM.
EM_ARM
Un ARM.
EM_SH
Un SuperH de Renesas.
EM_SPARCV9
Un SPARC v9 64 bits.
EM_IA_64
Un Itanium d'Intel.
EM_X86_64
Un x86-64 d'AMD.
EM_VAX
Un Vax de DEC.
e_version
Ce champ indique la version du fichier :
EV_NONE
Version invalide.
EV_CURRENT
Version actuelle.
e_entry
Ce champ indique l'adresse virtuelle à laquelle le système transfère initialement le contrôle, démarrant ainsi le processus. Si ce fichier ne possède pas de point d'entrée, ce champ contient zéro.
e_phoff
Ce champ contient le décalage en octets de la table contenant l'en-tête de programme. Si ce fichier ne contient pas de table d'en-tête de programme, ce champ contient zéro.
e_shoff
Ce champ contient le décalage en octets de la table des en-têtes de sections. Si ce fichier ne contient pas de table des en-têtes des sections, ce champ contient zéro.
e_flags
Ce champ contient des drapeaux spécifiques au processeur. Le nom de ces drapeaux prend la forme : EF_ machine _ drapeau
 À l'heure actuelle, aucun drapeau n'a été défini.
e_ehsize
Ce champ contient la taille de l'en-tête ELF en octets.
e_phentsize
Ce champ contient la taille en octets d'une entrée de la table d'en-tête de programme ; toutes les entrées ont la même taille.
e_phnum
Ce champ contient le nombre d'entrées de la table d'en-tête de programme. Ainsi, la taille en octets de la table pourra être obtenue en multipliant e_phentsize par e_phnum
 Si le fichier ne contient pas d'en-tête de programme, e_phnum contiendra la valeur zéro.
e_shentsize
Ce champ contient la taille en octets d'un en-tête de section. Un en-tête de section est une entrée de la table des en-têtes de sections ; toutes les entrées ont la même taille.
e_shnum
Ce champ contient le nombre d'entrées de la table des en-têtes de sections. Ainsi, la taille en octets de la table des en-têtes de sections pourra être obtenue en multipliant e_shentsize par e_shnum
 S'il n'y a pas de table des en-têtes de sections, le champ e_shnum contiendra zéro.
e_shstrndx
Ce champ contient l'indice dans la table des en-têtes de sections de l'entrée associée à la table des chaînes de noms des sections. Si le fichier ne contient pas de table des chaînes de noms des sections, ce champ contiendra la valeur SHN_UNDEF
SHN_UNDEF
Cette valeur indique une référence de section non définie, manquante, non pertinente ou, d'une façon ou d'une autre, sans signification. Par exemple, un symbole défini par rapport à une section de numéro SHN_UNDEF est un symbole indéfini.
SHN_LORESERVE
Cette valeur indique la borne inférieure de la plage d'indices réservés.
SHN_LOPROC
Cette valeur et les valeurs suivantes jusqu'à SHN_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHN_HIPROC
Cette valeur et les valeurs précédentes depuis SHN_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHN_ABS
Cette valeur indique que les références correspondantes sont des valeurs absolues. Par exemple, les symboles définis par rapport à une section SHN_ABS ont des valeurs absolues et ne sont pas affectées par le repositionnement.
SHN_COMMON
Les symboles définis par rapport à cette section sont des symboles communs, comme par exemple des COMMON Fortran ou des variables externes C non allouées.
SHN_HIRESERVE
Cette valeur indique la borne supérieure de la plage d'indices réservés entre SHN_LORESERVE et SHN_HIRESERVE inclus ; ces valeurs ne sont pas des références de la table des en-têtes des sections. Autrement dit, la table des en-têtes de sections ne contient pas d'entrée pour les indices réservés.

La table d'en-tête de programme d'un exécutable ou d'un objet partagé est un tableau de structures, chacune d'entre-elles décrivant un segment ou d'autres informations dont le système a besoin pour préparer l'exécution du programme. Un segment de fichier objet contient une ou plusieurs sections
 L'en-tête de programme n'a de sens que pour les fichiers objets partagés ou des fichiers exécutables. Un fichier indique la taille de son en-tête de programme grâce aux champs e_phentsize et e_phnum de l'en-tête ELF. Selon l'architecture, l'en-tête de programme ELF est représenté par un type Elf32_Phdr ou un type Elf64_Phdr :

 typedef struct {
         uint32_t        p_type;
         Elf32_Off       p_offset;
         Elf32_Addr      p_vaddr;
         Elf32_Addr      p_paddr;
         uint32_t        p_filesz;
         uint32_t        p_memsz;
         uint32_t        p_flags;
         uint32_t        p_align;
 } Elf32_Phdr;
 
 typedef struct {
         uint32_t        p_type;
         uint32_t        p_flags;
         Elf64_Off       p_offset;
         Elf64_Addr      p_vaddr;
         Elf64_Addr      p_paddr;
         uint64_t        p_filesz;
         uint64_t        p_memsz;
         uint64_t        p_align;
 } Elf64_Phdr;
 

La principale différence entre l'en-tête d'un programme 32 bits et l'en-tête d'un programme 64 bits est l'emplacement du champ p_flags dans la structure complète.

p_type
Ce champ de la structure Phdr indique le type de segment décrit par cet élément de tableau ou comment interpréter ses informations.
PT_NULL
Cet élément du tableau est inutilisé et les valeurs des autres champs sont sans signification. Cela permet à l'en-tête de programme de contenir des entrées non prises en compte.
PT_LOAD
Cet élément du tableau indique un segment chargeable, décrit par p_filesz et p_memsz Les octets du fichier sont projetés au début du segment mémoire. Si la taille mémoire du segment (p_memsz ) est plus grande que la taille du fichier (p_filesz ) les octets supplémentaires sont définis comme contenant la valeur 0 et placés à la suite de la zone initialisée du segment. La taille du fichier ne peut être supérieure à la taille de la mémoire. Dans la table d'en-tête de programme, les entrées de segments chargeables sont indiquées par ordre croissant, classées selon le champ p_vaddr
PT_DYNAMIC
L'élément de tableau contient des informations de liaison dynamique.
PT_INTERP
L'élément de tableau contient l'emplacement et la taille du nom de chemin utilisé pour invoquer l'interpréteur. Ce nom de chemin est terminé par un octet nul. Ce type de segment n'a de sens que pour des fichiers exécutables (bien qu'il puisse être présent dans des objets partagés). Il ne peut être présent qu'une seule fois dans un fichier. S'il est présent, il doit précéder toutes les entrées de segments chargeables.
PT_NOTE
L'élément de tableau contient l'emplacement et la taille d'informations auxiliaires.
PT_SHLIB
Ce type de segment est réservé, mais sa sémantique n'est pas définie. Les programmes contenant un tel élément de tableau ne sont pas conformes à l'interface binaire (ABI).
PT_PHDR
L'élément de tableau, s'il est présent, contiendra l'emplacement et la taille de la table d'en-tête de programme elle-même, à la fois dans le fichier et dans l'image mémoire du programme. Ce type de segment ne peut être présent qu'une seule fois dans un fichier. Qui plus est, il ne peut être présent que si l'en-tête de programme fait partie de l'image mémoire du programme. S'il est présent, il doit précéder toutes les entrées de segments chargeables.
PT_LOPROC
Cette valeur et les valeurs suivantes jusqu'à PT_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
PT_HIPROC
Cette valeur et les valeurs précédentes depuis PT_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
p_offset
Ce champ contient le décalage du premier octet du segment par rapport au début du fichier.
p_vaddr
Ce champ contient l'adresse virtuelle en mémoire du premier octet du segment.
p_paddr
Ce champ est réservé pour l'adresse physique du segment, pour les systèmes pour lesquels l'adresse physique est pertinente. Sous BSD , ce champ n'est pas utilisé et doit avoir pour valeur zéro.
p_filesz
Ce champ contient la taille en octets de l'image fichier de ce segment. Il peut être égal à zéro.
p_memsz
Ce champ contient la taille en octets de l'image mémoire de ce segment. Il peut être égal à zéro.
p_flags
Ce champ contient les drapeaux relatifs à ce segment :
PF_X
Un segment exécutable.
PF_W
Un segment accessible en écriture.
PF_R
Un segment accessible en lecture.

Les drapeaux PF_X et PF_R sont habituellement associés à un segment de texte. Les drapeaux PF_X PF_W et PF_R sont habituellement associés à un segment de données.

p_align
Ce champ contient la valeur selon laquelle les segments sont alignés en mémoire et dans le fichier. Pour des segments de processus chargeables, les valeurs p_vaddr et p_offset doivent être congrues, modulo la taille de la page. Des valeurs de zéro ou de un indiquent qu'aucun alignement n'est nécessaire. Sinon, p_align doit être un nombre positif puissance entière de deux et p_vaddr doit être égal à p_offset modulo p_align

La table des en-têtes de sections d'un fichier permet de retrouver toutes les sections du fichier. C'est un tableau de structures Elf32_Shdr ou Elf64_Shdr. Le champ e_shoff de l'en-tête ELF donne son décalage en octets depuis le début du fichier. e_shnum contient son nombre d'entrées. e_shentsize contient la taille en octets de chaque entrée.

Un indice de la table des en-têtes de sections est un indice de ce tableau. Certains de ces indices sont réservés. Un fichier objet ne contiendra pas les sections correspondant à ces indices :

SHN_UNDEF
Cette valeur indique une référence de section non définie, manquante, non pertinente ou, d'une manière ou d'une autre, sans signification.
SHN_LORESERVE
Cette valeur correspondant à la borne inférieure de la plage des indices réservés.
SHN_LOPROC
Cette valeur et les valeurs suivantes jusqu'à SHN_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHN_HIPROC
Cette valeur et les valeurs précédentes depuis SHN_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHN_ABS
Cette valeur indique que la référence correspondante est une valeur absolue. Par exemple, un symbole défini par rapport à une section numéro SHN_ABS a une valeur absolue et n'est pas affecté par un repositionnement.
SHN_COMMON
Les symboles définis par rapport à cette section sont des symboles communs, comme par exemple des COMMON Fortran ou des variables externes C non allouées.
SHN_HIRESERVE
Cette valeur indique la borne supérieure de la plage des indices réservés. Le système réserve les indices compris entre SHN_LORESERVE et SHN_HIRESERVE inclus. La table des en-têtes de sections ne contient pas d'entrée pour les indices réservés.

L'en-tête de section a la structure suivante :

 typedef struct {
         uint32_t        sh_name;
         uint32_t        sh_type;
         uint32_t        sh_flags;
         Elf32_Addr      sh_addr;
         Elf32_Off       sh_offset;
         uint32_t        sh_size;
         uint32_t        sh_link;
         uint32_t        sh_info;
         uint32_t        sh_addralign;
         uint32_t        sh_entsize;
 } Elf32_Shdr;
 
 typedef struct {
         uint32_t        sh_name;
         uint32_t        sh_type;
         uint64_t        sh_flags;
         Elf64_Addr      sh_addr;
         Elf64_Off       sh_offset;
         uint64_t        sh_size;
         uint32_t        sh_link;
         uint32_t        sh_info;
         uint64_t        sh_addralign;
         uint64_t        sh_entsize;
 } Elf64_Shdr;
 

Il n'y a pas de réelle différence entre les en-têtes de sections en 32 bits et en 64 bits.

sh_name
Ce champ indique le nom de la section. Sa valeur est un indice de la table des chaînes des en-têtes de sections, contenant l'emplacement d'une chaîne terminée par un octet nul.
sh_type
Ce champ définit le contenu et la sémantique de la section.
SHT_NULL
Cette valeur indique que cet en-tête de section est inactif. Il n'a donc pas de section associée. Les valeurs des autres champs de l'en-tête de cette section ne sont pas définies.
SHT_PROGBITS
Cette section contient des informations définies par le programme, dont le format et le sens sont uniquement déterminés par celui-ci.
SHT_SYMTAB
Cette section contient une table de symboles. En général, cette table contient des symboles pour l'édition de liens, bien qu'elle puisse aussi être utilisée pour la liaison dynamique. Comme il s'agit d'une table de symboles complète, elle peut contenir de nombreux symboles inutiles à la liaison dynamique. Un fichier objet peut aussi contenir une section SHT_DYNSYM
SHT_STRTAB
Cette section contient une table de chaînes. Un fichier objet peut contenir plusieurs sections de ce type.
SHT_RELA
Cette section contient des entrées de repositionnement contenant des additifs explicites, par exemple du type Elf32_Rela pour les fichiers objets appartenant à la classe des 32 bits. Un objet peut contenir plusieurs sections de ce type.
SHT_HASH
Cette section contient une table de hachage pour les symboles. Un objet participant à une liaison dynamique doit en contenir une. Un fichier objet ne peut contenir qu'une seule table de ce type.
SHT_DYNAMIC
Cette section contient les informations de liaison dynamique. Un fichier objet ne peut contenir qu'une seule section de ce type.
SHT_NOTE
Cette section contient des informations servant à marquer le fichier d'une façon ou d'une autre.
SHT_NOBITS
Une section de ce type ressemble à SHT_PROGBITS mais n'occupe pas de place dans le fichier. Bien que cette section ne contienne aucun octet, le champ sh_offset contient son décalage théorique dans le fichier.
SHT_REL
Cette section contient des entrées de repositionnement sans additif explicite, par exemple du type Elf32_Rel pour les fichiers objets appartenant à la classe des 32 bits. Un objet peut contenir plusieurs sections de ce type.
SHT_SHLIB
Cette section est réservée et sa sémantique n'est pas définie.
SHT_DYNSYM
Cette section contient un jeu de symboles minimal de liaison dynamique. Un fichier objet peut aussi contenir une section SHT_SYMTAB
SHT_LOPROC
Cette valeur et les valeurs suivantes jusqu'à SHT_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHT_HIPROC
Cette valeur et les valeurs précédentes depuis SHT_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
SHT_LOUSER
Cette valeur indique la borne inférieure de la plage des indices réservés aux programmes applicatifs.
SHT_HIUSER
Cette valeur indique la borne supérieure de la plage des indices réservés aux programmes applicatifs. Les types des sections entre SHT_LOUSER et SHT_HIUSER peuvent être utilisés par l'application, sans que cela entre en conflit avec les actuels ou futurs types de sections définis par le système.
sh_flags
Les sections contiennent des drapeaux binaires décrivant divers attributs. Si, dans sh_flags le bit correspondant à un drapeau est positionné, l'attribut est activé pour cette section. Sinon, l'attribut est désactivé ou ne s'applique pas. Les attributs non définis sont mis à zéro.
SHF_WRITE
Cette section contient des données sur lesquelles il devrait être possible d'écrire durant l'exécution du processus.
SHF_ALLOC
Cette section est présente en mémoire durant l'exécution du processus. Certaines sections de contrôle ne sont pas présentes dans l'image mémoire d'un fichier objet. Cet attribut est désactivé pour ces sections.
SHF_EXECINSTR
Cette section contient des instructions machine exécutables.
SHF_MASKPROC
Tous les bits contenus dans ce masque sont réservés à des sémantiques spécifiques au processeur.
sh_addr
Si cette section apparaît dans l'image mémoire d'un processus, ce champ contient l'adresse à laquelle le premier octet de la section doit se trouver. Sinon, ce champ contient zéro.
sh_offset
La valeur de ce champ indique le décalage du premier octet de la section par rapport au début du fichier. Une section de type SHT_NOBITS n'occupe pas de place dans le fichier et son champ sh_offset indique son placement théorique dans le fichier.
sh_size
Ce champ contient la taille de la section en octets. À moins que cette section ne soit de type SHT_NOBITS elle occupe sh_size octets dans le fichier. Une section de type SHT_NOBITS peut avoir une taille non nulle, mais elle n'occupera cependant aucune place dans le fichier.
sh_link
Ce champ contient un lien vers un indice de la table des en-têtes de sections, dont l'interprétation dépend du type de section.
sh_info
Ce champ contient des informations complémentaires, dont l'interprétation dépend du type de section.
sh_addralign
Certaines sections ont des contraintes d'alignement. Si une section contient un mot double, le système doit s'assurer que la section tout entière est alignée sur les mots doubles. Autrement dit, la valeur de sh_addr doit être congrue à zéro, modulo la valeur de sh_addralign
 Seules des valeurs de zéro ou des nombres positifs puissances entières de deux sont autorisés. Une valeur de zéro ou de un indique qu'aucune contrainte d'alignement ne s'applique à la section.
sh_entsize
Certaines sections contiennent une table contenant un nombre d'entrées fixe, comme par exemple les tables de symboles. Pour de telles sections, ce champ donne la taille en octets de chaque entrée. Ce champ contient zéro si cette section ne contient pas une table de ce type.

Diverses sections contiennent des informations de contrôle et sur le programme :

.bss
Cette section contient des données non initialisées qui font partie de l'image mémoire du programme. Par définition, le système initialise ces données avec des zéros lorsque le programme démarre. Cette section est du type SHT_NOBITS
 Ses attributs sont SHF_ALLOC et SHF_WRITE
.comment
Cette section contient des informations de suivi des versions. Cette section est du type SHT_PROGBITS
 Aucun attribut n'est utilisé.
.ctors
Cette section contient des pointeurs initialisés vers des constructeurs C++. Cette section est du type SHT_PROGBITS
 Ses attributs sont SHF_ALLOC et SHF_WRITE
.data
Cette section contient des données faisant partie de l'image mémoire du programme. Elle est du type SHT_PROGBITS
 Ses attributs sont SHF_ALLOC et SHF_WRITE
.data1
Cette section contient des données faisant partie de l'image mémoire du programme. Elle est du type SHT_PROGBITS
 Ses attributs sont SHF_ALLOC et SHF_WRITE
.debug
Cette section contient des données de débogage symbolique. Son contenu n'est pas spécifié. Elle est du type SHT_PROGBITS
 Aucun attribut n'est utilisé.
.dtors
Cette section contient des pointeurs initialisés vers des destructeurs C++. Elle est du type SHT_PROGBITS
 Ses attributs sont SHF_ALLOC et SHF_WRITE
.dynamic
Cette section contient des informations de liaison dynamique. Les attributs de cette section comprennent le bit SHF_ALLOC
 Le positionnement ou non du bit SHF_WRITE dépend du processeur. Cette section est du type SHT_DYNAMIC
.dynstr
Cette section contient les chaînes nécessaires à la liaison dynamique, le plus souvent les chaînes représentant les noms associés aux entrées de la table des symboles. Cette section est du type SHT_STRTAB
 L'attribut utilisé est SHF_ALLOC
.dynsym
Cette section contient la table des symboles de liaison dynamique. Cette section est du type SHT_DYNSYM
 L'attribut utilisé est SHF_ALLOC
.fini
Cette section contient des instructions exécutables qui font partie du code de fin du processus. Lorsqu'un programme se termine normalement, le système organise l'exécution du code de cette section. Elle est du type SHT_PROGBITS
 Les attributs utilisés sont SHF_ALLOC et SHF_EXECINSTR
.got
Cette section contient la table globale des décalages. Elle est du type SHT_PROGBITS
 Les attributs sont spécifiques au processeur.
.hash
Cette section contient la table de hachage des symboles. Elle est du type SHT_HASH
 L'attribut utilisé est SHF_ALLOC
.init
Cette section contient des instructions exécutables qui font partie du code d'initialisation du processus. Lorsqu'un programme démarre, le système organise l'exécution du code de cette section avant d'appeler le point d'entrée principal du programme. Cette section est du type SHT_PROGBITS
 Les attributs utilisés sont SHF_ALLOC et SHF_EXECINSTR
.interp
Cette section contient le chemin d'un interpréteur de programmes. Si le fichier comporte un segment chargeable contenant cette section, les attributs de la section contiendront le bit SHF_ALLOC
 Sinon, ce bit sera désactivé. Cette section est du type SHT_PROGBITS
.line
Cette section contient des informations sur les numéros de lignes, qui seront utilisées pour le débogage symbolique. Ces informations établissent la correspondance entre le code source du programme et le code machine. Le contenu de cette section n'est pas spécifié. Cette section est du type SHT_PROGBITS
 Aucun attribut n'est utilisé.
.note
Cette section contient des informations respectant un format spécifique. Elle est de type SHT_NOTE
 Aucun attribut n'est utilisé. Les exécutables natifs Ox contiennent en général une section .note.openbsd.ident leur permettant de s'identifier, afin de court-circuiter, lors du chargement du fichier, toutes les vérifications de compatibilité de l'émulation binaire ELF.
.plt
Cette section contient une table de liaison des procédures. Elle est du type SHT_PROGBITS
 Ses attributs sont spécifiques au processeur.
.relNOM
Cette section contient des informations de repositionnement, comme décrit ci-dessous. Si ce fichier comporte un segment chargeable comprenant du repositionnement, les attributs de la section contiendront le bit SHF_ALLOC
 Sinon, ce bit sera désactivé. Par convention, le NOM est fourni par la section à laquelle le repositionnement s'applique. Ainsi, une section de repositionnement pour du .text s'appellera normalement .rel.text
 Cette section est du type SHT_REL
.relaNOM
Cette section contient des informations de repositionnement, comme décrit ci-dessous. Si ce fichier comporte un segment chargeable comprenant du repositionnement, les attributs de la section contiendront le bit SHF_ALLOC
 Sinon, ce bit sera désactivé. Par convention, le NOM est fourni par la section à laquelle le repositionnement s'applique. Ainsi, une section de repositionnement pour du .text s'appellera normalement .rela.text
 Cette section est du type SHT_RELA
.rodata
Cette section contient des données en lecture seule, qui feront classiquement partie d'un segment non accessible en écriture dans l'image du processus. Cette section est du type SHT_PROGBITS
 L'attribut utilisé est SHF_ALLOC
.rodata1
Cette section contient des données en lecture seule, qui feront classiquement partie d'un segment non accessible en écriture dans l'image du processus. Cette section est du type SHT_PROGBITS
 L'attribut utilisé est SHF_ALLOC
.shstrtab
Cette section contient des noms des sections. Elle est du type SHT_STRTAB
 Aucun attribut n'est utilisé.
.strtab
Cette section contient des chaînes, le plus souvent ces chaînes représentent les noms associés aux entrées de la table des symboles. Si ce fichier comporte un segment chargeable comprenant la table des chaînes de symboles, les attributs de la section contiendront le bit SHF_ALLOC
 Sinon, ce bit sera désactivé. Cette section est du type SHT_STRTAB
.symtab
Cette section contient une table des symboles. Si ce fichier comporte un segment chargeable contenant la table des symboles, les attributs de la section contiendront le bit SHF_ALLOC
 Sinon, ce bit sera désactivé. Cette section est du type SHT_SYMTAB
.text
Cette section contient le texte autrement dit les instructions exécutables, d'un programme. Cette section est du type SHT_PROGBITS
 Les attributs utilisés sont SHF_ALLOC et SHF_EXECINSTR

Les sections de tables de chaînes contiennent des séquences de caractères terminées par un octet nul, communément appelées chaînes. Le fichier objet utilise ces chaînes pour représenter les noms des symboles et des sections. Le premier octet, qui est l'indice zéro, est défini comme contenant un octet nul. De même, le dernier octet de la table de chaînes est défini comme contenant un octet nul, ce qui assure que toutes les chaînes se termineront bien par un caractère nul.

La table des symboles d'un fichier objet contient les informations permettant de localiser et de repositionner les définitions et références symboliques d'un programme. Un indice dans une table de symbole est un indice de ce tableau.

 typedef struct {
         uint32_t        st_name;
         Elf32_Addr      st_value;
         uint32_t        st_size;
         unsigned char   st_info;
         unsigned char   st_other;
         uint16_t        st_shndx;
 } Elf32_Sym;
 
 typedef struct {
         uint32_t        st_name;
         unsigned char   st_info;
         unsigned char   st_other;
         uint16_t        st_shndx;
         Elf64_Addr      st_value;
         uint64_t        st_size;
 } Elf64_Sym;
 

Les versions 32 bits et 64 bits comportent les mêmes champs, mais dans un ordre différent.

st_name
Ce champ contient un indice de la table des chaînes de symboles d'un fichier objet. Cette table contient la représentation sous la forme de chaînes de caractères des noms des symboles. Si la valeur de ce champ est non nulle, il représente l'indice de la table des chaînes qui donne son nom au symbole. Sinon, le symbole n'a pas de nom.
st_value
Ce champ donne la valeur associée au symbole.
st_size
Des tailles sont associées à nombre de symboles. Ce champ contient zéro si le symbole n'a pas de taille ou si sa taille est inconnue.
st_info
Ce champ indique le type de symbole et ses attributs de liaison :
STT_NOTYPE
Le type de ce symbole n'est pas défini.
STT_OBJECT
Ce symbole est associé à un objet donné.
STT_FUNC
Ce symbole est associé à une fonction ou un autre code exécutable.
STT_SECTION
Ce symbole est associé à une section. Les entrées de ce type de la table des symboles existent principalement pour le repositionnement et ont normalement des liaisons STB_LOCAL
STT_FILE
Par convention, le nom de ce symbole donne le nom du fichier source associé au fichier objet. Un symbole de ce type a des liaisons STB_LOCAL son indice de section est SHN_ABS et, s'il est présent, il précède les autres symboles STB_LOCAL du fichier.
STT_LOPROC
Cette valeur et les valeurs suivantes jusqu'à STT_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
STT_HIPROC
Cette valeur et les valeurs précédentes depuis STT_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
STB_LOCAL
Les symboles locaux ne sont pas visibles en dehors du fichier objet contenant leur définition. Des symboles locaux de même nom peuvent exister dans plusieurs fichiers sans interférer les uns avec les autres.
STB_GLOBAL
Les symboles globaux sont visibles de tous les fichiers objets réunis ensembles. La définition par un fichier d'un symbole global satisfera une référence non définie d'un autre fichier à ce même symbole.
STB_WEAK
Les symboles faibles ressemblent à des symboles globaux, mais la définition des symboles globaux prend le pas sur celle des symboles faibles.
STB_LOPROC
Cette valeur et les valeurs suivantes jusqu'à STB_HIPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.
STB_HIPROC
Cette valeur et les valeurs précédentes depuis STB_LOPROC (incluse) sont réservées à des sémantiques spécifiques au processeur.

Il existe des macros permettant de coder et de décoder les champs de type et de liaison :

Fn ELF32_ST_BIND info ou Fn ELF64_ST_BIND info permet d'extraire une liaison d'une valeur st_info.

Fn ELF32_ST_TYPE info ou Fn ELF64_ST_TYPE info permet d'extraire un type d'une valeur st_info.

Fn ELF32_ST_INFO liaison type ou Fn ELF64_ST_INFO liaison type convertit un type et une liaison en une valeur st_info.

st_other
Ce champ contient actuellement zéro et n'a pas de sens défini.
st_shndx
Chaque entrée de la table des symboles est définie en relation à une section. Ce champ contient l'indice correspondant de la table des en-têtes de sections.

Le repositionnement est le processus consistant à relier des références symboliques à des définitions symboliques. Les fichiers repositionnables doivent contenir des informations décrivant comment modifier le contenu de leurs sections, ce qui permet aux fichiers objets partagés et exécutables de contenir les bonnes informations pour l'image mémoire d'un programme. Les entrées de repositionnement sont ces données.

Structures de repositionnement ne nécessitant pas d'additif :

 typedef struct {
         Elf32_Addr     r_offset;
         uint32_t       r_info;
 } Elf32_Rel;
 
 typedef struct {
         Elf64_Addr     r_offset;
         uint64_t       r_info;
 } Elf64_Rel;
 

Structures de repositionnement nécessitant un additif :

 typedef struct {
         Elf32_Addr      r_offset;
         uint32_t        r_info;
         int32_t         r_addend;
 } Elf32_Rela;
 
 typedef struct {
         Elf64_Addr      r_offset;
         uint64_t        r_info;
         int64_t         r_addend;
 } Elf64_Rela;
 
r_offset
Ce champ donne l'emplacement où appliquer l'action de repositionnement. Pour un fichier repositionnable, sa valeur est le décalage en octets depuis le début de la section jusqu'à l'unité de stockage affectée par le repositionnement. Pour un fichier exécutable ou un objet partagé, sa valeur est l'adresse virtuelle de l'unité de stockage affectée par le repositionnement.
r_info
Ce champ donne à la fois l'indice de la table des symboles par rapport auquel on doit effectuer le repositionnement et le type de repositionnement à appliquer. Les types de repositionnement dépendent du processeur. Lorsque le texte mentionne le type de repositionnement ou l'indice de la table des symboles d'une entrée de repositionnement, cela signifie le résultat de l'application de ELF_[32|64]_R_TYPE ou ELF[32|64]_R_SYM respectivement, au champ r_info de cette entrée.
r_addend
Ce champ indique un additif constant utilisé pour calculer la valeur à enregistrer dans le champ repositionnable.

La section .dynamic contient une série de structures renfermant les informations nécessaires à la liaison dynamique. Le champ d_tag contrôle l'interprétation de d_un.

 typedef struct {
         Elf32_Sword     d_tag;
         union {
            Elf32_Word   d_val;
            Elf32_Addr   d_ptr;
         } d_un;
 } Elf32_Dyn;
 extern Elf32_Dyn _DYNAMIC[];
 
 typedef struct {
         Elf64_Sxword    d_tag;
         union {
            Elf64_Xword  d_val;
            Elf64_Addr   d_ptr;
         } d_un;
 } Elf64_Dyn;
 extern Elf64_Dyn _DYNAMIC[];
 
d_tag
Ce champ peut avoir les valeurs suivantes :
DT_NULL
Marque la fin de la section dynamique.
DT_NEEDED
Décalage du nom d'une bibliothèque requise dans la table des chaînes.
DT_PLTRELSZ
Taille en octets des repositionnements de la table de liaison des procédures (PLT).
DT_PLTGOT
Adresse de la table de liaison des procédures (PLT), de la table globale des décalages (GOT), ou des deux.
DT_HASH
Adresse de la table de hachages des symboles.
DT_STRTAB
Adresse de la table des chaînes.
DT_SYMTAB
Adresse de la table des symboles.
DT_RELA
Adresse de la table des repositionnements avec additifs (Rela).
DT_RELASZ
Taille en octets de la table des repositionnements avec additifs.
DT_RELAENT
Taille en octets d'une entrée de la table des repositionnements avec additifs.
DT_STRSZ
Taille en octets de la table des chaînes.
DT_SYMENT
Taille en octets d'une entrée de la table des symboles.
DT_INIT
Adresse de la fonction d'initialisation.
DT_FINI
Adresse de la fonction de fin.
DT_SONAME
Décalage du nom de l'objet partagé dans la table des chaînes.
DT_RPATH
Décalage du chemin de recherche des bibliothèques dans la table des chaînes (obsolète).
DT_SYMBOLIC
Signale à l'éditeur de lien de rechercher les symboles dans cet objet partagé avant de les rechercher dans l'exécutable.
DT_REL
Adresse de la table des repositionnements sans additif (Rel).
DT_RELSZ
Taille en octets de la table des repositionnements sans additif.
DT_RELENT
Taille en octets d'une entrée de la table des repositionnements sans additif.
DT_PLTREL
Type de repositionnements auxquels la table de liaison des procédure (PLT) fait référence (avec ou sans additif).
DT_DEBUG
Non défini, utilisé pour le débogage.
DT_TEXTREL
L'absence de cette valeur indique qu'aucun repositionnement ne doit être appliqué à un segment en lecture seule.
DT_JMPREL
Adresses des entrées de repositionnement réservées à la table de liaison des procédures (PLT).
DT_BIND_NOW
Demande à l'éditeur de liens dynamiques de traiter tous les repositionnements avant de transférer le contrôle à l'exécutable.
DT_RUNPATH
Décalage du chemin de recherche des bibliothèques dans la table des chaînes.
DT_LOPROC
Début des sémantiques spécifiques au processeur.
DT_HIPROC
Fin des sémantiques spécifiques au processeur.
d_val
Ce champ représente des valeurs entières ayant diverses interprétations.
d_ptr
Ce champ représente des adresses virtuelles du programme. Lors de l'interprétation de ces adresses, l'adresse réelle doit être calculée à partir de la valeur du fichier original et de l'adresse de base en mémoire. Les fichiers ne contiennent pas d'entrée de repositionnement pour corriger ces adresses.
_DYNAMIC
Tableau contenant toutes les structures dynamiques de la section « .dynamic ». Il est automatiquement rempli par l'éditeur de liens.

HISTORIQUE

La gestion du format ELF par Ox est tout d'abord apparue dans Ox 1.2 , bien qu'il n'ait pas été utilisé comme format de fichier binaire natif par toutes les plates-formes compatibles. Le format ELF en lui-même est initialement apparu dans l'Unix System V d'AT&T. Le format ELF est un standard reconnu.

VOIR AUSSI

as(1), gdb(1), ld(1), objdump(1), execve(2), core(5)
Hewlett-Packard "Elf-64 Object File Format"
"Santa Cruz Operation" "System V Application Binary Interface"
"Unix System Laboratories" "Object Files" "Executable and Linking Format (ELF)"

TRADUCTION

Ce document est une traduction réalisée par An Jean-Philippe Guérard Aq fevrier CHEZ tigreraye POINT org le 14 décembre 2005 et révisée le 19 novembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 5 elf ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.