ELF
Section : Manuel de l'administrateur Linux (
5)
Mise à jour de la version anglaise : 28 décembre 2007
Index
Menu principal
NOM
elf - Format des fichiers au Format de Liaison et d'Exécution (ELF)
SYNOPSIS
#include <elf.h>
DESCRIPTION
Le fichier d'entête
<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 entête ELF, suivi d'une table d'entête de programme ou d'une
table des entêtes de sections, ou des deux.
L'entê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'entête de programme et des
entêtes de sections sont définis dans l'entête ELF.
Ces deux tables décrivent le reste des particularités du fichier.
Le fichier d'entête décrit, sous la forme de structures C, les entê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'entê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 champ
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'entête de programme.
Si ce fichier ne contient pas de table d'entête de programme,
ce champ contient zéro.
- e_shoff
-
Ce champ contient le décalage en octets de la table des entêtes de
sections.
Si ce fichier ne contient pas de table des entê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'entête ELF en octets.
- e_phentsize
-
Ce champ contient la taille en octets d'une entrée de la table
d'entê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'entê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'entête de programme,
e_phnum
contiendra la valeur zéro.
- e_shentsize
-
Ce champ contient la taille en octets d'un entête de section.
Un entête de section est une entrée de la table des entê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 entêtes de
sections.
Ainsi, la taille en octets de la table des entêtes de sections
pourra être obtenue en multipliant
e_shentsize
par
e_shnum
S'il n'y a pas de table des entêtes de sections, le champ
e_shnum
contiendra zéro.
- e_shstrndx
-
Ce champ contient l'indice dans la table des entê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
entêtes des sections.
Autrement dit, la table des entêtes de sections
ne
contient
pas
d'entrée pour les indices réservés.
La table d'entê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'entê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 entête de programme grâce
aux champs
e_phentsize
et
e_phnum
de l'entête ELF. Selon l'architecture, l'entê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'entête d'un programme 32 bits et
l'entê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'entê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'entê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'entê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'entê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.
PT_GNU_STACK
Extension GNU utilisée par le noyau Linux pour contrôler l'état de la pile
via les attributs positionnés dans le membre
p_flags.
- 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 un masque de bits des attributs 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 entê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'entê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 entê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.
- HN_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 entêtes de sections ne contient pas d'entrée pour
les indices réservés.
L'entê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 entê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 entê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 entête de section est inactif.
Il n'a donc pas de section associée.
Les valeurs des autres champs de l'entê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_Rel
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 entê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.
- .gnu.version
-
Cette section contient la table des symboles de version,
un tableau d'éléments
ElfN_Half.
Cette section est de type
SHT_GNU_versym.
Le type d'attribut utilisé est
SHF_ALLOC .
- .gnu.version_d
-
Cette section contient les définitons des symboles de version,
une table de structures
ElfN_Verdef.
Cette section est de type
SHT_GNU_verdef.
Le type d'attribut utilisé est
SHF_ALLOC.
- .gnu.version_r
-
Cette section contient les éléments nécessaires de symboles de version,
une table de structures
ElfN_Verneed.
Cette section est de type
SHT_GNU_versym.
Le type d'attribut utilisé est
SHF_ALLOC.
- .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 OpenBSD 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.
- .note.GNU-stack
-
Cette section est utilisée dans les fichiers objet Linux pour
déclarer les attributs de la pile.
Cette section est de type
SHT_PROGBITS.
Le seul attribut utilisé est
SHF_EXECINSTR.
Il indique à l'éditeur de liens GNU que le fichier objet a besoin
d'une pile exécutable.
- .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 :
-
ELF32_ST_BIND(info)
ou
ELF64_ST_BIND(info)
permet d'extraire une liaison d'une valeur
st_info.
-
ELF32_ST_TYPE(info)
ou
ELF64_ST_TYPE(info)
permet d'extraire un type d'une valeur
st_info.
-
ELF32_ST_INFO(liaison, type)
ou
ELF64_ST_INFO(liaison, type)
convertit un type et une liaison en une valeur
st_info.
- st_other
-
Ce champ définit la visibilité des symboles.
-
-
-
STV_DEFAULT
Régles par défaut de visibilité des symboles.
- STV_INTERNAL
-
Processor specific hidden class.
- STV_HIDDEN
-
Le symbole n'est pas disponible dans d'autres modules.
- STV_PROTECTED
-
Non prioritaire, non exporté.
Voici les macros pour extraire le type de visibilité :
ELF32_ST_VISIBILITY(autre)
ou
ELF64_ST_VISIBILITY(autre)
- 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 entê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.
NOTES
Le format ELF en lui-même est initialement apparu dans System V.
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
le 14 décembre 2005
et révisée le 8 janvier 2008.
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.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 9 janvier 2008