Provided by:
manpages-fr_3.27fr1.4-1_all 
NOM
elf - Format des fichiers executables ELF (<< Executable and Linking
Format >>)
SYNOPSIS
#include <elf.h>
DESCRIPTION
Le fichier d'en-tete <elf.h> definit le format des fichiers binaires
executables ELF. Ces fichiers peuvent etre soit des fichiers
executables normaux, des fichiers objets repositionnables, des fichiers
core ou des bibliotheques partagees.
Un fichier executable utilisant le format de fichier ELF est constitue
d'un en-tete ELF, suivi d'une table d'en-tete de programme ou d'une
table des en-tetes de sections, ou des deux. L'en-tete ELF est toujours
situe a un deplacement de zero par rapport au debut du fichier. Les
deplacements dans le fichier des tables d'en-tete de programme et des
en-tetes de sections sont definis dans l'en-tete ELF. Ces deux tables
decrivent le reste des particularites du fichier.
Ce fichier d'en-tete decrit, sous la forme de structures C, les
en-tetes mentionnes precedemment et inclut egalement des structures
pour les sections dynamiques, les sections de repositionnement et les
tables de symboles.
Les types suivants sont utilises pour les architectures N-bit (avec
N=32,64 ; ElfN signifie Elf32 ou Elf64 ; uintN_t signifie uint32_t ou
uint64_t) :
ElfN_Addr adresse (non signee) du programme, uintN_t
ElfN_Off deplacement (non signe) dans le fichier, uintN_t
ElfN_Section indice (non signe) de section, uint16_t
ElfN_Versym informations (non signees) sur les versions
des symboles, uint16_t
Elf_Byte caractere (char) non signe
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 differente. Elf64_Half est
deux fois plus grand que Elf32_Half et Elf64Quarter est utilise pour
uint16_t. Afin d'eviter toute confusion, ces types seront remplaces par
des types plus explicites dans la suite de ce document).
Toutes les structures de donnees definies par le format de fichier
suivent la taille << naturelle >> et les principes d'alignement de la
classe correspondante. Si necessaire, les structures de donnees
contiennent un remplissage explicite pour assurer l'alignement sur
4 octets des objets de 4 octets, et pour forcer les tailles des
structures a etre des multiples de 4, etc.
L'en-tete ELF est decrit 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 interpreter le fichier,
independemment du processeur ou du reste du contenu du
fichier. Dans ce tableau, chacun des elements s'appelle une
macro qui commence par le prefixe EI_ et peut contenir des
valeurs commencant par le prefixe ELF. Les macros suivantes
sont definies :
EI_MAG0 Premier octet du nombre magique. Il doit etre
rempli par ELFMAG0 (0: 0x7f).
EI_MAG1 Deuxieme octet du nombre magique. Il doit etre
rempli par ELFMAG1 (1: << E >>).
EI_MAG2 Troisieme octet du nombre magique. Il doit etre
rempli par ELFMAG2 (2: << L >>).
EI_MAG3 Quatrieme octet du nombre magique. Il doit etre
rempli par ELFMAG3 (3: << F >>).
EI_CLASS Le cinquieme octet indique l'architecture pour
ce binaire :
ELFCLASSNONE Cette classe n'est pas valable.
ELFCLASS32 Ceci definit une architecture
32 bits. Elle permet d'utiliser
des machines avec des espaces
d'adressage virtuels et des
fichiers d'une taille allant
jusqu'a 4 giga-octets.
ELFCLASS64 Ceci definit une architecture
64 bits.
EI_DATA Le sixieme octet indique le codage utilise pour
les donnees de ce fichier specifiques au
processeur. Actuellement, les codages suivants
sont permis :
ELFDATANONE Format de donnees inconnu.
ELFDATA2LSB Complement a deux, petit
boutiste.
ELFDATA2MSB Complement a deux, gros boutiste.
EI_VERSION Numero de version de la specification du format
ELF :
EV_NONE Version non valable.
EV_CURRENT Version actuelle.
EI_OSABI Cet octet identifie le systeme d'exploitation
et l'interface binaire des applications (ABI)
auxquels cet objet est destine. Certains des
champs d'autres structures ELF contiennent des
valeurs et des drapeaux dont la signification
depend de la plate-forme ; l'interpretation de
ces champs depend de la valeur de cet octet.
Par exemple :
ELFOSABI_NONE Identique a ELFOSABI_SYSV
ELFOSABI_SYSV ABI UNIX System V.
ELFOSABI_HPUX ABI HP-UX.
ELFOSABI_NETBSD ABI NetBSD.
ELFOSABI_LINUX ABI Linux.
ELFOSABI_SOLARIS ABI Solaris.
ELFOSABI_IRIX ABI IRIX.
ELFOSABI_FREEBSD ABI FreeBSD.
ELFOSABI_TRU64 ABI UNIX TRU64.
ELFOSABI_ARM ABI de l'architecture ARM.
ELFOSABI_STANDALONE ABI autonome (embarque).
EI_ABIVERSION
Cet octet identifie la version de l'interface
binaire des applications (ABI) a laquelle cet
objet est destine. Ce champ permet de
differencier des versions incompatibles d'une
meme ABI. L'interpretation de ce numero de
version depend de l'ABI indiquee par le champ
EI_OSABI. Les applications respectant cette
specification utilisent la valeur 0.
EI_PAD Debut de remplissage. Ces octets sont reserves
et positionnes a zero. Les programmes qui les
lisent ne doivent pas en tenir compte. La
valeur de EI_PAD sera modifiee dans le futur si
l'on decide de donner une signification a des
octets actuellement inutilises.
EI_NIDENT Taille du tableau e_ident.
e_type Ce membre de la structure identifie le type de fichier
objet :
ET_NONE Type inconnu.
ET_REL Fichier repositionnable.
ET_EXEC Fichier executable.
ET_DYN Objet partage.
ET_CORE Fichier core.
e_machine Ce membre indique l'architecture necessaire a un fichier
particulier. Par exemple :
EM_NONE Machine inconnue.
EM_M32 AT&T WE 32100.
EM_SPARC Sun Microsystems SPARC.
EM_386 Intel 80386.
EM_68K Motorola 68000.
EM_88K Motorola 88000.
EM_860 Intel 80860.
EM_MIPS MIPS RS3000 (uniquement gros-boutiste).
EM_PARISC HP/PA.
EM_SPARC32PLUS
SPARC avec jeu d'instructions etendu.
EM_PPC PowerPC.
EM_PPC64 PowerPC 64 bits.
EM_S390 IBM S/390
EM_ARM Machines de technologie RISC avancees
EM_SH Renesas SuperH
EM_SPARCV9 SPARC v9 64 bits.
EM_IA_64 Intel Itanium
EM_X86_64 AMD x86-64
EM_VAX DEC Vax.
e_version Ce membre indique la version du fichier :
EV_NONE Version non valable.
EV_CURRENT Version actuelle.
e_entry Ce membre indique l'adresse virtuelle a laquelle le systeme
transfere initialement le controle, demarrant ainsi le
processus. Si ce fichier ne comporte pas de point d'entree,
ce champ contient zero.
e_phoff Ce membre contient le deplacement en octets de la table
contenant l'en-tete de programme. Si ce fichier ne comporte
pas de table d'en-tete de programme, ce champ contient
zero.
e_shoff Ce membre contient le deplacement en octets de la table des
en-tetes de sections. Si ce fichier ne comporte pas de
table des en-tetes des sections, ce champ contient zero.
e_flags Ce membre contient des drapeaux specifiques au processeur.
Le nom de ces drapeaux est de la forme EF_machine_drapeau.
A l'heure actuelle, aucun drapeau n'a ete defini.
e_ehsize Ce membre contient la taille de l'en-tete ELF en octets.
e_phentsize Ce membre contient la taille en octets d'une entree de la
table d'en-tete de programme ; toutes les entrees sont de
meme taille.
e_phnum Ce membre contient le nombre d'entrees de la table
d'en-tete de programme. Ainsi, la taille en octets de la
table pourra etre obtenue en multipliant e_phentsize par
e_phnum. Si un fichier ne comporte pas d'en-tete de
programme, e_phnum contiendra la valeur zero.
Si le nombre d'entrees de la table d'en-tete de programme
est superieur ou egal a PN_XNUM (0xffff), ce membre
contient PN_XNUM (0xffff) et le nombre reel d'entrees dans
la table d'en-tete de programme est stocke dans le membre
sh_info de l'entree initiale de la table des en-tetes de
sections. Dans le cas contraire, le membre sh_info de
l'entree initiale de la table des en-tetes de sections
contient la valeur zero.
PN_XNUM Est defini comme 0xffff, le plus grand nombre que
e_phnum peut valoir, qui specifie ou le nombre
actuel d'en-tetes de programme est assigne.
e_shentsize Ce membre contient la taille en octets d'un en-tete de
section. Un en-tete de section est une entree de la table
des en-tetes de sections ; toutes les entrees sont de meme
taille.
e_shnum Ce membre contient le nombre d'entrees de la table des
en-tetes de sections. Ainsi, la taille en octets de la
table des en-tetes de sections pourra etre obtenue en
multipliant e_shentsize par e_shnum. Si un fichier ne
comporte pas de table des en-tetes de sections, le champ
e_shnum contiendra zero.
Si le nombre d'entrees de la table des en-tetes de sections
est superieur ou egal a SHN_LORESERVE (0xff00), e_shnum
contient la valeur zero et le nombre reel d'entrees dans la
table des en-tetes de sections est stocke dans le membre
sh_size de l'entree initiale de la table des en-tetes de
sections. Dans le cas contraire, le membre sh_size de
l'entree initiale de la table des en-tetes de sections
contient la valeur zero.
e_shstrndx Ce membre contient l'indice dans la table des en-tetes de
sections de l'entree associee a la table des chaines de
noms des sections. Si le fichier ne comporte pas de table
des chaines de noms des sections, ce champ contiendra la
valeur SHN_UNDEF.
Si l'indice de la section de la table des chaines de noms
des sections est superieur ou egal a SHN_LORESERVE
(0xff00), ce membre contient la valeur SHN_XINDEX (0xffff)
et l'indice reel de la section de la table des chaines de
noms des sections est stocke dans le membre sh_link de
l'entree initiale de la table des en-tetes de sections.
Dans le cas contraire, le membre sh_link de l'entree
initiale de la table des en-tetes de sections contient la
valeur zero.
SHN_UNDEF Cette valeur indique une reference de section
non definie, manquante, non pertinente ou,
d'une facon ou d'une autre, sans
signification. Par exemple, un symbole
<< defined >> se rapportant a la section de
numero SHN_UNDEF est un symbole indefini.
SHN_LORESERVE Cette valeur indique la borne inferieure de
la plage des indices reserves.
SHN_LOPROC Les valeurs superieures ou egales a
SHN_HIPROC sont reservees a des semantiques
specifiques au processeur.
SHN_HIPROC Les valeurs inferieures ou egales a
SHN_LOPROC sont reservees a des semantiques
specifiques au processeur.
SHN_ABS Cette valeur indique que les references
correspondantes sont des valeurs absolues.
Par exemple, les symboles definis par rapport
a une section SHN_ABS ont des valeurs
absolues et ne sont pas affectees par le
repositionnement.
SHN_COMMON Les symboles definis par rapport a cette
section sont des symboles communs, comme par
exemple des COMMON Fortran ou des variables
externes C non allouees.
SHN_HIRESERVE Cette valeur indique la borne superieure de
la plage des indices reserves entre
SHN_LORESERVE et SHN_HIRESERVE, inclus ; ces
valeurs ne sont pas des references de la
table des en-tetes des sections. Autrement
dit, la table des en-tetes de sections ne
contient pas d'entree pour les indices
reserves.
La table d'en-tete de programme d'un executable ou d'un fichier objet
partage est un tableau de structures, chacune d'entre-elles decrivant
un segment ou d'autres informations dont le systeme a besoin pour
preparer l'execution du programme. Un segment de fichier objet contient
une ou plusieurs sections. L'en-tete de programme n'a de sens que pour
les fichiers objets partages ou les fichiers executables. Un fichier
indique la taille de son propre en-tete de programme a l'aide des
membres e_phentsize et e_phnum de l'en-tete ELF. Selon l'architecture,
l'en-tete de programme ELF est represente 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 difference entre l'en-tete d'un programme 32 bits et
l'en-tete d'un programme 64 bits repose sur emplacement du champ
p_flags au sein de la structure complete.
p_type Ce membre de la structure Phdr indique le type de segment
decrit par cet element de tableau ou comment interpreter
ses informations.
PT_NULL Cet element du tableau est inutilise et les
valeurs des autres membres ne sont pas definis.
Cela permet a l'en-tete de programme de
contenir des entrees qui ne sont pas prises en
compte.
PT_LOAD Cet element du tableau indique un segment
chargeable, decrit par p_filesz et p_memsz. Les
octets du fichier sont projetes au debut du
segment memoire. Si la taille memoire du
segment p_memsz est plus grande que la taille
du fichier p_filesz, les octets
<< supplementaires >> sont definis comme
contenant la valeur 0 et places a la suite de
la zone initialisee du segment. La taille du
fichier ne peut etre superieure a la taille de
la memoire. Dans la table d'en-tete de
programme, les entrees de segments chargeables
sont indiquees par ordre croissant, classees
selon le membre p_vaddr.
PT_DYNAMIC L'element de tableau contient des informations
de liaison dynamique.
PT_INTERP L'element de tableau contient l'emplacement et
la taille du nom de chemin, termine par un
caractere << null >>, utilise pour invoquer
l'interpreteur. Ce type de segment n'a de sens
que pour des fichiers executables (bien qu'il
puisse etre present dans des objets partages).
Il ne peut etre present qu'une seule fois dans
un fichier. S'il est present, il doit preceder
chaque entree de segment chargeable.
PT_NOTE L'element de tableau contient l'emplacement et
la taille d'informations auxiliaires.
PT_SHLIB Ce type de segment est reserve, mais sa
semantique n'est pas definie. Les programmes
contenant un tel element de tableau ne sont pas
conformes a l'interface binaire (ABI).
PT_PHDR L'element de tableau, s'il est present,
contiendra l'emplacement et la taille de la
table d'en-tete de programme elle-meme, a la
fois dans le fichier et dans l'image memoire du
programme. Ce type de segment ne peut etre
present qu'une seule fois dans un fichier. Qui
plus est, il ne peut etre present que si
l'en-tete de programme fait partie de l'image
memoire du programme. S'il est present, il doit
preceder chaque entree de segment chargeable.
PT_LOPROC Les valeurs superieures ou egales a PT_HIPROC
sont reservees a des semantiques specifiques au
processeur.
PT_HIPROC Les valeurs inferieures ou egales a PT_LOPROC
sont reservees a la semantique propre au
processeur. L'extension GNU PT_GNU_STACK qui
est utilisee par le noyau de Linux pour
controler l'etat de la pile via l'indicateur
positionne dans le membre p_flags member.
p_offset Ce membre contient le deplacement du premier octet du
segment par rapport au debut du fichier.
p_vaddr Ce membre contient l'adresse virtuelle a laquelle se trouve
en memoire le premier octet du segment.
p_paddr Su les systemes pour lesquels l'adresse physique est
pertinente, ce membre est reserve pour l'adresse physique
du segment. Sous BSD, ce champ n'est pas utilise et doit
avoir la valeur zero.
p_filesz Ce membre contient la taille en octets dans l'image fichier
de ce segment. Il peut etre egal a zero.
p_memsz Ce membre contient la taille en octets de l'image memoire
de ce segment. Il peut etre egal a zero.
p_flags Ce membre contient un masque de bits d'options relatives a
ce segment :
PF_X Segment executable.
PF_W Segment accessible en ecriture.
PF_R Segment accessible en lecture.
Un segment de texte est souvent affecte des drapeaux PF_X
et PF_R. Un segment de donnees est souvent affecte des
drapeaux PF_X, PF_W et PF_R.
p_align Ce membre contient la valeur selon laquelle les segments
sont alignes en memoire et dans le fichier. Pour des
segments de processus chargeables, les valeurs p_vaddr et
p_offset doivent etre congrues, modulo la taille de la
page. Des valeurs de zero ou de un indiquent qu'aucun
alignement n'est necessaire. Sinon, p_align doit etre un
nombre positif, puissance entiere de deux et p_vaddr doit
etre egal a p_offset modulo p_align.
La table des en-tetes 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-tete ELF donne son
deplacement en octets depuis le debut du fichier. e_shnum contient le
nombre d'entrees que contient la table des en-tetes de sections.
e_shentsize contient la taille en octets de chaque entree.
Un indice de la table des en-tetes de sections est un indice de ce
tableau. Certains de ces indices de table des en-tetes de sections sont
reserves : l'entree initiale et toutes les entrees comprises entre
SHN_LORESERVE et SHN_HIRESERVE. L'entree initiale est utilisee par des
extensions ELF pour e_phnum, e_shnum et e_strndx ; dans les autres cas,
chaque champ de l'entree initiale est mis a zero. Un fichier objet ne
contient pas de section correspondant a ces indices speciaux :
SHN_UNDEF Cette valeur indique une reference de section non
definie, manquante, non pertinente ou, d'une
maniere ou d'une autre, sans signification.
SHN_LORESERVE Cette valeur indique la borne inferieure de la
plage des indices reserves.
SHN_LOPROC Les valeurs superieures ou egales a SHN_HIPROC
sont reservees a des semantiques specifiques au
processeur.
SHN_HIPROC Les valeurs inferieures ou egales a SHN_LOPROC
sont reservees a des semantiques specifiques au
processeur.
SHN_ABS Cette valeur definit la valeur absolue de la
reference correspondante. Par exemple, un symbole
defini par rapport a la section numero SHN_ABS a
une valeur absolue et n'est pas affecte par un
repositionnement.
SHN_COMMON Les symboles definis par rapport a cette section
sont des symboles communs, comme par exemple des
COMMON Fortran ou des variables externes C non
allouees.
SHN_HIRESERVE Cette valeur indique la borne superieure de la
plage des indices reserves. Le systeme reserve les
indices compris entre SHN_LORESERVE et
SHN_HIRESERVE, inclus. La table des en-tetes de
sections ne contient pas d'entree pour les indices
reserves.
L'en-tete 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 reelle difference entre les en-tetes des sections 32
bits et 64 bits.
sh_name Ce membre indique le nom de la section. Sa valeur est un
indice de la table des chaines des en-tetes de sections,
contenant l'emplacement d'une chaine terminee par un
caractere nul.
sh_type Ce membre definit le contenu et la semantique de la section.
SHT_NULL Cette valeur indique que cet en-tete de
section est inactif. Il n'est donc associe a
aucune section. Les valeurs des autres champs
de l'en-tete de section ne sont pas definies.
SHT_PROGBITS Cette section contient des informations
definies par le programme, dont le format et
le sens ne sont determines que par celui-ci.
SHT_SYMTAB Cette section contient une table de symboles.
Typiquement, SHT_SYMTAB contient des symboles
pour l'edition de liens, bien qu'elle puisse
aussi etre utilisee pour la liaison dynamique.
Comme il s'agit d'une table de symboles
complete, elle peut contenir de nombreux
symboles inutiles a la liaison dynamique. Un
fichier objet peut aussi contenir une section
SHT_DYNSYM.
SHT_STRTAB Cette section contient une table de chaines.
Un fichier objet peut contenir plusieurs
sections de ce type.
SHT_RELA Cette section contient des entrees de
repositionnement ayant des additifs
explicites, par exemple les entrees du type
Elf32_Rela pour les fichiers objets 32 bits.
Un objet peut avoir plusieurs sections de ce
type.
SHT_HASH Cette section contient une table de hachage
pour les symboles. Un objet participant a une
liaison dynamique doit en contenir une. Un
fichier objet ne peut contenir qu'une seule
table de hachage.
SHT_DYNAMIC Cette section contient les informations de
liaison dynamique. Un fichier objet ne peut
contenir qu'une seule section dynamique.
SHT_NOTE Cette section contient des informations
servant a marquer le fichier d'une facon ou
d'une autre.
SHT_NOBITS Une section de ce type ressemble a
SHT_PROGBITS mais n'occupe pas d'espace dans
le fichier. Bien que cette section ne
contienne aucun octet, le membre sh_offset
contient son deplacement theorique dans le
fichier.
SHT_REL Cette section contient des entrees de
repositionnement sans additif explicite, par
exemple du type Elf32_Rel pour les fichiers
objets de la classe de 32 bits. Un objet peut
contenir plusieurs sections de
repositionnement.
SHT_SHLIB Cette section est reservee et sa semantique
n'est pas definie.
SHT_DYNSYM Cette section contient un jeu minimum de
symboles de liaison dynamique. Un fichier
objet peut aussi contenir une section
SHT_SYMTAB.
SHT_LOPROC Cette valeur et les valeurs suivantes jusqu'a
SHT_HIPROC incluse sont reservees a des
semantiques specifiques au processeur.
SHT_HIPROC Cette valeur et les valeurs precedentes depuis
SHT_LOPROC incluse sont reservees a des
semantiques specifiques au processeur.
SHT_LOUSER Cette valeur indique la borne inferieure de la
plage des indices reserves aux programmes
applicatifs.
SHT_HIUSER Cette valeur indique la borne superieure de la
plage des indices reserves aux programmes
applicatifs. Les types des sections entre
SHT_LOUSER et SHT_HIUSER peuvent etre utilises
par l'application, sans que cela n'entre en
conflit avec les types de section actuels ou
futurs definis par le systeme.
sh_flags Les sections contiennent des indicateurs sous forme d'un bit
decrivant divers attributs. Si, dans sh_flags, le bit
correspondant a un indicateur est positionne, l'attribut est
<< active >> pour cette section. Sinon, l'attribut est
<< desactive >> ou ne s'applique pas. Les attributs non
definis sont mis a zero.
SHF_WRITE Cette section contient des donnees qu'il
devrait etre possible d'ecrire durant
l'execution du processus.
SHF_ALLOC Cette section est presente en memoire durant
l'execution du processus. Certaines sections
de controle ne sont pas presentes dans l'image
memoire d'un fichier objet. Cet attribut est
desactive pour ces sections.
SHF_EXECINSTR Cette section contient des instructions
machine executables.
SHF_MASKPROC Tous les bits contenus dans ce masque sont
reserves a des semantiques specifiques au
processeur.
sh_addr Si cette section apparait dans l'image memoire d'un
processus, ce membre contient l'adresse a laquelle le premier
octet de la section doit se trouver. Sinon, ce membre
contient zero.
sh_offset La valeur de ce membre indique le deplacement du premier
octet de la section par rapport au debut du fichier. Une
section de type SHT_NOBITS, n'occupe pas de place dans le
fichier et son champ sh_offset indique son emplacement
theorique dans le fichier.
sh_size Ce membre contient la taille en octets de la section. A 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 membre contient un lien vers un indice de la table des
en-tetes de sections, son interpretation depend du type de
section.
sh_info Ce membre contient des informations complementaires, son
l'interpretation depend du type de section.
sh_addralign
Certaines sections ont des contraintes d'alignement
d'adresse. Si une section contient un mot double, le systeme
doit s'assurer que la section tout entiere est alignee sur
les mots doubles. Autrement dit, la valeur de sh_addr doit
etre congrue a zero, modulo la valeur de sh_addralign. Seules
zero ou des puissances entieres positives de deux sont
autorises. Une valeur de zero ou de un indique qu'aucune
contrainte d'alignement ne s'applique a la section.
sh_entsize
Certaines sections contiennent une table contenant un nombre
d'entrees fixe, comme par exemple les tables de symboles.
Pour de telles sections, ce champ donne la taille en octets
de chaque entree. Ce membre contient zero si cette section ne
contient pas une table de ce type.
Diverses sections contiennent des informations de controle et sur le
programme :
.bss Cette section contient des donnees non initialisees qui font
partie de l'image memoire du programme. Par definition, le
systeme initialise ces donnees avec des zeros lorsque le
programme demarre. Cette section est du type SHT_NOBITS. Les
types de 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 utilise.
.ctors Cette section contient des pointeurs initialises vers des
constructeurs C++. Cette section est du type SHT_PROGBITS.
Les types de ses attributs sont SHF_ALLOC et SHF_WRITE.
.data Cette section contient des donnees faisant partie de l'image
memoire du programme. Elle est du type SHT_PROGBITS. Les
types de ses attributs sont SHF_ALLOC et SHF_WRITE.
.data1 Cette section contient des donnees faisant partie de l'image
memoire du programme. Elle est du type SHT_PROGBITS. Les
types de ses attributs sont SHF_ALLOC et SHF_WRITE.
.debug Cette section contient des donnees de debogage symbolique.
Son contenu n'est pas precise. Elle est du type SHT_PROGBITS.
Aucun type d'attribut n'est utilise.
.dtors Cette section contient des pointeurs initialises vers des
destructeurs C++. Elle est du type SHT_PROGBITS. Les types de
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 du bit SHF_WRITE est specifique au
processeur. Cette section est du type SHT_DYNAMIC. Voir
ci-dessus pour les attributs.
.dynstr Cette section contient les chaines necessaires a la liaison
dynamique, le plus souvent les chaines representant les noms
associes aux entrees de la table des symboles. Cette section
est du type SHT_STRTAB. Le type d'attribut utilise est
SHF_ALLOC.
.dynsym Cette section contient la table des symboles de liaison
dynamique. Cette section est du type SHT_DYNSYM. Le type
d'attribut utilise est SHF_ALLOC.
.fini Cette section contient des instructions executables qui font
partie du code de fin du processus. Lorsqu'un programme se
termine normalement, le systeme organise l'execution du code
de cette section. Elle est du type SHT_PROGBITS. Les
attributs utilises sont SHF_ALLOC et SHF_EXECINSTR.
.gnu.version
Cette section contient la table des symboles de version,
tableau d'elements ElfN_Half. Cette section est du type
SHT_GNU_versym. Le type d'attribut utilise est SHF_ALLOC.
.gnu.version_d
Cette section contient les definitions de version de
symboles, une table de structures ElfN_Verdef. Cette section
est du type SHT_GNU_verdef. Le type d"attribut utilise est
SHF_ALLOC.
.gnu.version_r
Cette section contient la version de symbole des elements
necessaires, une table de structures ElfN_Verneed. Cette
section est type SHT_GNU_versym. Le type d'attribut utilise
est SHF_ALLOC.
.got Cette section contient la table globale des deplacements.
Elle est du type SHT_PROGBITS. Les attributs sont specifiques
au processeur.
.hash Cette section contient la table de hachage des symboles. Elle
est du type SHT_HASH. L'attribut utilise est SHF_ALLOC.
.init Cette section contient des instructions executables qui font
partie du code d'initialisation du processus. Lorsqu'un
programme demarre, le systeme organise l'execution du code de
cette section avant d'appeler le point d'entree principal du
programme. Cette section est du type SHT_PROGBITS. Les
attributs utilises sont SHF_ALLOC et SHF_EXECINSTR.
.interp Cette section contient le chemin vers un interpreteur 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 desactive.
Cette section est du type SHT_PROGBITS.
.line Cette section contient des informations sur les numeros de
lignes, qui seront utilisees pour le debogage symbolique. Ces
informations etablissent la correspondance entre le code
source du programme et le code machine. Le contenu de cette
section n'est pas specifie. Cette section est du type
SHT_PROGBITS. Aucun attribut n'est utilise.
.note Cette section contient des informations dans le format
<< Note Section >>. Elle est de type SHT_NOTE. Aucun attribut
n'est utilise. Les executables natifs OpenBSD contiennent en
general une section .note.openbsd.ident leur permettant de
s'identifier, afin que le noyau court-circuite, lors du
chargement du fichier, toutes les verifications de
compatibilite de l'emulation binaire ELF.
.note.GNU-stack
Cette section est utilisee dans les fichiers objets de Linux
pour declarer les attributs de la pile. Cette section est du
type SHT_PROGBITS. Le seul attribut utilise est
SHF_EXECINSTR. Ceci indique a l'editeur de liens GNU que le
fichier objet requiere une pile executable.
.plt Cette section contient une table de liaison des procedures.
Elle est du type SHT_PROGBITS. Ses attributs sont specifiques
au processeur.
.relNOM Cette section contient des informations de repositionnement,
comme decrit 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
desactive. Par convention, le << NOM >> est fourni par la
section a 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 decrit 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
desactive. Par convention, le << NOM >> est fourni par la
section a 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 donnees en lecture seule, qui
feront classiquement partie d'un segment non accessible en
ecriture dans l'image du processus. Cette section est du type
SHT_PROGBITS. L'attribut utilise est SHF_ALLOC.
.rodata1 Cette section contient des donnees en lecture seule, qui
feront classiquement partie d'un segment non accessible en
ecriture dans l'image du processus. Cette section est du type
SHT_PROGBITS. L'attribut utilise est SHF_ALLOC.
.shstrtab Cette section contient les noms des sections. Elle est du
type SHT_STRTAB. Aucun type d'attribut.
.strtab Cette section contient des chaines, le plus souvent ces
chaines representent les noms associes aux entrees de la
table des symboles. Si ce fichier comporte un segment
chargeable comprenant la table des chaines de symboles, les
attributs de la section contiendront le bit SHF_ALLOC. Sinon,
ce bit sera desactive. 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 desactive. Cette section est du
type SHT_SYMTAB.
.text Cette section contient le << texte >>, autrement dit les
instructions executables, d'un programme. Cette section est
du type SHT_PROGBITS. Les attributs utilises sont SHF_ALLOC
et SHF_EXECINSTR.
Les sections de tables de chaines contiennent des sequences de
caracteres terminees par un zero binaire (<< null >>), communement
appelees chaines. Le fichier objet utilise ces chaines pour representer
les noms des symboles et des sections. Le premier octet, qui est
l'indice zero, est defini comme contenant un null. De meme, le dernier
octet de la table de chaines est defini comme contenant un null, ce qui
assure que toutes les chaines se termineront bien par un null.
La table des symboles d'un fichier objet contient les informations
permettant de localiser et de repositionner les definitions et
references 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 memes membres, seul leur
ordre differe.
st_name Ce membre contient un indice de la table des chaines de
symboles d'un fichier objet. Cette table contient la
representation sous la forme de chaines de caracteres des
noms des symboles. Si la valeur de ce champ est non nulle, il
represente l'indice de la table des chaines qui donne son nom
au symbole. Sinon, le symbole n'a pas de nom.
st_value Ce membre donne la valeur associee au symbole.
st_size De nombreux symboles sont associes a des tailles. Ce champ
contient zero si le symbole n'a pas de taille ou si sa taille
est inconnue.
st_info Ce membre indique le type de symbole et ses attributs de
liaison :
STT_NOTYPE Le type de ce symbole n'est pas defini.
STT_OBJECT Ce symbole est associe a un objet de donnees.
STT_FUNC Ce symbole est associe a une fonction ou un autre
code executable.
STT_SECTION Ce symbole est associe a une section. Les entrees
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 associe au fichier objet. Un
symbole de ce type a des liaisons STB_LOCAL, son
indice de section est SHN_ABS, et, s'il est
present, il precede les autres symboles STB_LOCAL
du fichier.
STT_LOPROC Cette valeur et les valeurs suivantes jusqu'a
STT_HIPROC (valeur comprise) sont reservees a des
semantiques specifiques au processeur.
STT_HIPROC Cette valeur et les valeurs precedentes depuis
STT_LOPROC incluse sont reservees a des
semantiques specifiques au processeur.
STB_LOCAL Les symboles locaux ne sont pas visibles en
dehors du fichier objet contenant leur
definition. Des symboles locaux de meme nom
peuvent exister dans plusieurs fichiers sans
interferer entre eux.
STB_GLOBAL Les symboles globaux sont visibles de tous les
fichiers objets devant etre reunis. La definition
par un fichier d'un symbole global satisfera une
reference non definie d'un autre fichier a ce
meme symbole.
STB_WEAK Les symboles faibles ressemblent a des symboles
globaux, mais leur definition a une priorite plus
faible.
STB_LOPROC Cette valeur et les valeurs suivantes jusqu'a
STB_HIPROC (valeur comprise) sont reservees a des
semantiques specifiques au processeur.
STB_HIPROC Cette valeur et les valeurs precedentes depuis
STB_LOPROC incluse sont reservees a des
semantiques specifiques au processeur.
Il existe des macros permettant de coder et de
decoder les champs de type et de liaison :
ELF32_ST_BIND(info) ou ELF64_ST_BIND(info)
extrait une liaison d'une valeur st_info.
ELF32_ST_TYPE(info) ou ELF64_ST_TYPE(info)
extraire un type d'une valeur st_info.
ELF32_ST_INFO(liaison, type) ou
ELF64_ST_INFO(liaison, type)
convertir une liaison et un type en une valeur
st_info.
st_other Ce membre definit la visibilite du symbole.
STV_DEFAULT Regles par defaut de visibilite du symbole.
STV_INTERNAL Classe cache specifique au processeur.
STV_HIDDEN Le symbole n"est pas disponible dans d'autres
modules.
STV_PROTECTED Non preemptible, non exporte.
Il existe des macros permettant d'extraire le type de
visibilite :
ELF32_ST_VISIBILITY(autre) ou ELF64_ST_VISIBILITY(autre)
st_shndx Chaque entree de la table des symboles est << definie >> en
relation avec une section. Ce membre contient l'indice
correspondant de la table des en-tetes de sections.
Le repositionnement est le processus consistant a relier des references
symboliques a des definitions symboliques. Les fichiers
repositionnables doivent contenir des informations decrivant comment
modifier le contenu de leurs sections, ce qui permet aux fichiers
objets partages et executables de detenir les bonnes informations
concernant l'image memoire d'un programme. Les entrees de
repositionnement sont ces donnees.
Structures de repositionnement pour lesquelles un additif est
necessaire :
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 pour lesquelles un additif est
necessaire :
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 membre donne l'emplacement ou appliquer l'action de
repositionnement. Pour un fichier repositionnable, sa
valeur est le deplacement en octets depuis le debut de la
section jusqu'a l'unite de stockage affectee par le
repositionnement. Pour un fichier executable ou un objet
partage, sa valeur est l'adresse virtuelle de l'unite de
stockage affectee par le repositionnement.
r_info Ce membre donne a la fois l'indice de la table des symboles
par rapport auquel on doit effectuer le repositionnement et
le type de repositionnement a appliquer. Les types de
repositionnement dependent du processeur. Lorsque le texte
mentionne le type de repositionnement ou l'indice de la
table des symboles d'une entree de repositionnement, il
s'agit du resultat de l'application de ELF_[32|64]_R_TYPE
ou ELF[32|64]_R_SYM, respectivement, au champ r_info de
cette entree.
r_addend Ce membre indique un additif constant pour le calcul de la
valeur a stocker dans le champ repositionnable.
La section .dynamic comporte une serie de structures qui contiennent
les informations relatives a l'edition de liens dynamique. Le membre
d_tag controle l'interpretation 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 membre peut prendre l'une des trois valeurs suivantes :
DT_NULL Indique la fin de la section dynamique
DT_NEEDED Decalage dans la table des chaines vers le nom
d'une bibliotheque necessaire
DT_PLTRELSZ Taille en octets des relocations PLT
DT_PLTGOT Adresse de plt et/ou de GOT
DT_HASH Adresse de la table de hachage des symboles
DT_STRTAB Adresse de la table des chaines
DT_SYMTAB Adresse de la table des symboles
DT_RELA Adresse de la table des relocations Rela
DT_RELASZ Taille, en octets, de la table Rela
DT_RELAENT Taille, en octets, d'une entree de la table Rela
DT_STRSZ Taille, en octets, de la table des chaines
DT_SYMENT Taille, en octets, d'une entree de la table des
symboles
DT_INIT Adresse de la fonction d'initialisation
DT_FINI Adresse de la fonction de terminaison
DT_SONAME Deplacement dans la table des chaines vers le nom
de l'objet partage
DT_RPATH Deplacement dans la table des chaines pour le
chemin de recherche de la bibliotheque (deprecie)
DT_SYMBOLIC Demander a l'editeur de liens de rechercher les
symboles dans cet objet partage avant
l'executable
DT_REL Adresse de la table des relocations Rel
DT_RELSZ Taille en octets de la table Rel
DT_RELENT Taille en octets d'une entree de la table Rel
DT_PLTREL Type de relocation auquel se refere PLT (Rela ou
Rel)
DT_DEBUG Utilisation non definie pour le debogage
DT_TEXTREL Son absence indique qu'aucune relocation ne
devrait s'appliquer a un segment non accessible
en ecriture
DT_JMPREL Adresse des entrees de relocation, uniquement
pour la PLT
DT_BIND_NOW Informer l'editeur de liens dynamique de traiter
toutes les relocations avant de transferer le
controle a l'executable
DT_RUNPATH Decalage dans la table des chaines pour le chemin
de recherche de la bibliotheque
DT_LOPROC Debut des semantiques specifiques au processeur
DT_HIPROC Fin de la semantique propre au processeur
d_val Ce membre represente des valeurs entieres ayant des
interpretations diverses.
d_ptr Ce membre represente les adresses virtuelles du programme.
Lors de l'interpretation de ces adresses, l'adresse reelle
doit etre calculee en se basant sur la valeur originale du
fichier et sur l'adresse de base de la memoire. Les fichiers
ne contiennent pas d'entrees de repositionnement pour fixer
ces adresses.
_DYNAMIC Tableau contenant toutes les structures de la section
.dynamic. Ceci est automatiquement rempli par l'editeur de
liens.
NOTES
ELF est apparu d'abord dans le System V. Le format ELF est un standard
adopte.
Les extensions pour e_phnum, e_shnum et e_strndx sont des extensions
Linux. Sun, BSD et AMD64 les gerent aussi. Pour plus d'informations,
veuillez lire la section VOIR AUSSI.
VOIR AUSSI
as(1), gdb(1), ld(1), objdump(1), execve(2), core(5)
Hewlett-Packard, Format de fichiers Elf-64 (Elf-64 Object File Format).
Santa Cruz Operation, Interface binaire des applications System V
(System V Application Binary Interface).
Unix System Laboratories, "Object Files", Format des fichiers
ex'ecutables ELF (Executable and Linking Format)
Sun Microsystems, Guide de l''editeur de liens et des biblioth`eques
(Linker and Libraries Guide).
Version preliminaire de l'ABI AMD64 (System V Application Binary
Interface AMD64 Architecture Processor Supplement).
COLOPHON
Cette page fait partie de la publication 3.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Jean-Philippe Guerard (2005), Alain Portal
<URL:http://manpagesfr.free.fr/> (2006). Jean-Luc Coulon et l'equipe
francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.