Date création : 30-03-2008 14:07:23
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section5 - Formats de fichiers]
ELF
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- VOIR AUSSI
- HISTORIQUE
- AUTEURS
- TRADUCTION
31 juillet 1999
NOM
elf
- Format des fichiers exécutables ELF (« Executable and Linking Format »)
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 soit des fichiers exécutables
normaux, des fichiers objets repositionnables, des fichiers
core
ou
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éplacement de zéro par rapport au début du fichier. Les déplacements 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.
Ce 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éplacement (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
``natural''
(« 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, et pour forcer les tailles des structures à être des multiples
de 4, etc.
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 s'appelle une macro qui commence 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
-
Premier octet du nombre magique. Il doit être rempli par
ELFMAG0
(0:
0x7f).
- EI_MAG1
-
Deuxième octet du nombre magique. Il doit être rempli par
ELFMAG1
(1:
« E »).
- EI_MAG2
-
Troisième octet du nombre magique. Il doit être rempli par
ELFMAG2
(2: « L »).
- EI_MAG3
-
Quatrième octet du nombre magique. Il doit être rempli par
ELFMAG3
(3: « F »).
- EI_CLASS
-
LE cinquième octet indique l'architecture pour ce binaire :
- ELFCLASSNONE
-
Cette classe n'est pas valable.
- ELFCLASS32
-
Ceci définit une architecture 32 bits. Elle permet d'utiliser des machines
avec des espaces d'adressage virtuels et des fichiers d'une taille allant
jusqu'à 4 giga-octets.
- ELFCLASS64
-
Ceci définit une architecture 64 bits.
- EI_DATA
-
Le sixième octet indique le codage utilisé pour les données de ce fichier
spécifiques au processeur. Actuellement, les codages suivants sont permis :
- ELFDATANONE
-
Format de données inconnu.
- ELFDATA2LSB
-
Complément à deux, petit boutiste.
- ELFDATA2MSB
-
Complément à deux, gros boutiste.
- EI_VERSION
-
Numéro de version de la spécification du format ELF :
- EV_NONE
-
Version non valable.
- 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 UNIX Système 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 (embarqué).
- 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 de 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 membre de la structure identifie le type de fichier objet :
- ET_NONE
-
Type inconnu.
- ET_REL
-
Fichier repositionnable.
- ET_EXEC
-
Fichier exécutable.
- ET_DYN
-
Objet partagé.
- ET_CORE
-
Fichier core.
- e_machine
-
Ce membre indique l'architecture nécessaire à 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 étendu.
- EM_PPC
-
PowerPC.
- EM_PPC64
-
PowerPC 64-bit.
- EM_S390
-
IBM S/390
- EM_ARM
-
Machines de technologie RISC avancées
- EM_SH
-
Renesas SuperH
- EM_SPARCV9
-
SPARC v9 64-bit.
- 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 à laquelle le système transfère
initialement le contrôle, démarrant ainsi le processus. Si ce fichier ne
comporte pas de point d'entrée, ce champ contient zéro.
- e_phoff
-
Ce membre contient le déplacement en octets de la table contenant l'en-tête
de programme. Si ce fichier ne comporte pas de table d'en-tête de programme,
ce champ contient zéro.
- e_shoff
-
Ce membre contient le déplacement en octets de la table des en-têtes de
sections. Si ce fichier ne comporte pas de table des en-têtes des sections,
ce champ contient zéro.
- e_flags
-
Ce membre contient des drapeaux spécifiques au processeur. Le nom de ces
drapeaux est de la forme EF_machine_drapeau. À l'heure actuelle, aucun
drapeau n'a été défini.
- e_ehsize
-
Ce membre contient la taille de l'en-tête ELF en octets.
- e_phentsize
-
Ce membre contient la taille en octets d'une entrée de la table d'en-tête de
programme ; toutes les entrées sont de même taille.
- e_phnum
-
Ce membre 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 un fichier ne comporte
pas d'en-tête de programme,
e_phnum
contiendra la valeur zéro.
- e_shentsize
-
Ce membre 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 sont de même taille.
- e_shnum
-
Ce membre 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
Si
un fichier ne comporte pas de table des en-têtes de sections, le champ
e_shnum
contiendra zéro.
- e_shstrndx
-
Ce membre 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 comporte 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
``defined''
se rapportant à la section de numéro
SHN_UNDEF
est un symbole indéfini.
- SHN_LORESERVE
-
Cette valeur indique la borne inférieure de la plage des indices réservés.
- SHN_LOPROC
-
Les valeurs supérieures ou égales à
SHN_HIPROC
sont réservées à des
sémantiques spécifiques au processeur.
- SHN_HIPROC
-
Les valeurs inférieures ou égales à
SHN_LOPROC
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 des 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 fichier 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 les fichiers exécutables. Un fichier indique la
taille de son propre en-tête de programme à l'aide des membres
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 repose sur emplacement du champ
p_flags
au
sein de la structure complète.
- p_type
-
Ce membre 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 membres ne
sont pas définis. Cela permet à l'en-tête de programme de contenir des
entrées qui ne sont pas 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 membre
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,
terminé par un caractère « nulll », utilisé pour invoquer l'interpréteur. 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 chaque
entrée de segment chargeable.
- 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 chaque entrée de segment
chargeable.
- PT_LOPROC
-
Les valeurs supérieures ou égales à
PT_HIPROC
sont réservées à des
sémantiques spécifiques au processeur.
- PT_HIPROC
-
Les valeurs inférieures ou égales à
PT_LOPROC
sont réservées à des
sémantiques spécifiques au processeur.
- p_offset
-
Ce membre contient le déplacement du premier octet du segment par rapport au
début du fichier.
- p_vaddr
-
Ce membre contient l'adresse virtuelle à laquelle se trouve en mémoire le
premier octet du segment.
- p_paddr
-
Su les systèmes pour lesquels l'adresse physique est pertinente, ce membre
est réservé pour l'adresse physique du segment. Sous
BSD ,
ce champ n'est
pas utilisé et doit avoir la valeur zéro.
- p_filesz
-
Ce membre contient la taille en octets dans l'image fichier de ce
segment. Il peut être égal à zéro.
- p_memsz
-
Ce membre contient la taille en octets de l'image mémoire de ce segment. Il
peut être égal à zéro.
- p_flags
-
Ce membre contient les drapeaux relatifs à ce segment :
- PF_X
-
Segment exécutable.
- PF_W
-
Segment accessible en écriture.
- PF_R
-
Segment accessible en lecture.
Un segment de texte est souvent affecté des drapeaux
PF_X
et
PF_R
Un segment de données est souvent affecté des drapeaux
PF_X
PF_W
et
PF_R
- p_align
-
Ce membre 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éplacement
en octets depuis le début du fichier.
e_shnum
contient le nombre
d'entrées que contient la table des en-têtes de sections.
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 spéciaux :
- 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 indique la borne inférieure de la plage des indices réservés.
- SHN_LOPROC
-
Les valeurs supérieures ou égales à
SHN_HIPROC
sont réservées à des
sémantiques spécifiques au processeur.
- SHN_HIPROC
-
Les valeurs inférieures ou égales à
SHN_LOPROC
sont réservées à des
sémantiques spécifiques au processeur.
- SHN_ABS
-
Cette valeur définit la valeur absolue de la référence correspondante. Par
exemple, un symbole défini par rapport à la 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 des sections 32 bit et
64 bit.
- sh_name
-
Ce membre 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 caractère nul.
- sh_type
-
Ce membre 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'est donc
associé à aucune section. Les valeurs des autres champs de l'en-tête de
section ne sont pas définies.
- SHT_PROGBITS
-
Cette section contient des informations définies par le programme, dont le
format et le sens ne sont déterminés que par celui-ci.
- SHT_SYMTAB
-
Cette section contient une table de symboles. Typiquement,
SHT_SYMTAB
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 ayant des additifs
explicites, par exemple les entrées 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 à 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 à 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
d'espace dans le fichier. Bien que cette section ne contienne aucun octet,
le membre
sh_offset
contient son déplacement 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 de
la classe de 32 bits. Un objet peut contenir plusieurs sections de
repositionnement.
- SHT_SHLIB
-
Cette section est réservée et sa sémantique n'est pas définie.
- 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'à
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
n'entre en conflit avec les types de section actuels ou futurs définis par
le système.
- sh_flags
-
Les sections contiennent des indicateurs sous forme d'un bit décrivant
divers attributs. Si, dans
sh_flags
le bit correspondant à un
indicateur 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 qu'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 membre
contient l'adresse à laquelle le premier octet de la section doit se
trouver. Sinon, ce membre contient zéro.
- sh_offset
-
La valeur de ce membre indique le déplacement 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 emplacement théorique dans le fichier.
- sh_size
-
Ce membre contient la taille en octets de la section. À 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-têtes de
sections, son interprétation dépend du type de section.
- sh_info
-
Ce membre contient des informations complémentaires, son l'interprétation
dépend du type de section.
- sh_addralign
-
Certaines sections ont des contraintes d'alignement d'adresse. 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 zéro ou des puissances entières positives 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 membre 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
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 utilisé.
- .ctors
-
Cette section contient des pointeurs initialisés 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 données faisant partie de l'image mémoire du
programme. Elle est du type
SHT_PROGBITS
Les types de 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
Les types de ses attributs
sont
SHF_ALLOC
et
SHF_WRITE
- .debug
-
Cette section contient des données de débogage symbolique. Son contenu n'est
pas précisé. Elle est du type
SHT_PROGBITS
Aucun type d'attribut
n'est utilisé.
- .dtors
-
Cette section contient des pointeurs initialisés 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 spécifique au processeur. Cette section est du type
SHT_DYNAMIC
Voir ci-dessus pour les attributs.
- .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
Le type
d'attribut utilisé 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 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éplacements. 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 vers 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 dans le format
``Note Section''
défini ci-dessous. 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 que le
noyau court-circuite, 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 les noms des sections. Elle est du type
SHT_STRTAB
Aucun type d'attribut.
- .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 zéro binaire (« null »), 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 null. De même, le dernier octet de la table de chaînes est
défini comme contenant un null, ce qui assure que toutes les chaînes se
termineront bien par un null.
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 bit et 64 bit comportent les mêmes membres, seul leur ordre
diffère.
- st_name
-
Ce membre 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 membre donne la valeur associée au symbole.
- st_size
-
De nombreux symboles sont associés à des tailles. Ce champ contient zéro 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 défini.
- STT_OBJECT
-
Ce symbole est associé à un objet de données.
- 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
(valeur
comprise) 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 entre eux.
- STB_GLOBAL
-
Les symboles globaux sont visibles de tous les fichiers objets devant être
réunis. 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 leur
définition a une priorité plus faible.
- STB_LOPROC
-
Cette valeur et les valeurs suivantes jusqu'à
STB_HIPROC
(valeur
comprise) 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
extrait une liaison
d'une valeur st_info.
Fn ELF32_ST_TYPE info
ou
Fn ELF64_ST_TYPE info
extraire un type d'une valeur st_info.
Fn ELF32_ST_INFO liaison type
ou
Fn ELF64_ST_INFO liaison type
convertir une liaison et un type en une valeur st_info.
- st_other
-
Ce membre 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 avec
une section. Ce membre 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
détenir les bonnes informations concernant l'image mémoire d'un
programme. Les entrées de repositionnement sont ces données.
Structures de repositionnement pour lesquelles un additif est nécessaire :
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 nécessaire :
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 où appliquer l'action de
repositionnement. Pour un fichier repositionnable, sa valeur est le
déplacement 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 membre 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, il s'agit du 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 membre indique un additif constant pour le calcul de la valeur à stocker
dans le champ repositionnable.
La section .dynamic comporte une série de structures qui contiennent les
informations relatives à l'édition de liens dynamique. Le membre 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 membre peut prendre l'une des trois valeurs suivantes :
- DT_NULL
-
Indique la fin de la section dynamique
- DT_NEEDED
-
Décalage dans la table des chaînes vers le nom d'une bibliothèque nécessaire
- 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 chaînes
- 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 entrée de la table Rela
- 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 terminaison
- DT_SONAME
-
Déplacement dans la table des chaînes vers le nom de l'objet partagé
- DT_RPATH
-
Déplacement dans la table des chaînes pour le chemin de recherche de la
bibliothèque (déprécié)
- DT_SYMBOLIC
-
Demander à l'éditeur de liens de rechercher les symboles dans cet objet
partagé avant l'exécutable
- 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 entrée de la table Rel
- DT_PLTREL
-
Type de relocation auquel se réfère PLT (Rela ou Rel)
- DT_DEBUG
-
Utilisation non définie pour le débogage
- DT_TEXTREL
-
Son absence indique qu'aucune relocation ne devrait s'appliquer à un segment
non accessible en écriture
- DT_JMPREL
-
Adresse des entrées de relocation, uniquement pour la PLT
- DT_BIND_NOW
-
Informer l'éditeur de liens dynamique de traiter toutes les relocations
avant de transférer le contrôle à l'exécutable
- DT_RUNPATH
-
Décalage dans la table des chaînes pour le chemin de recherche de la
bibliothèque
- DT_LOPROC
-
Début des sémantiques spécifiques au processeur
- DT_HIPROC
-
Fin de la sémantique propre au processeur
- d_val
-
Ce membre représente des valeurs entières ayant des interprétations
diverses.
- d_ptr
-
Ce membre représente les adresses virtuelles du programme. Lors de
l'interprétation de ces adresses, l'adresse réelle doit être calculée en se
basant sur la valeur originale du fichier et sur l'adresse de base de la
mémoire. Les fichiers ne contiennent pas d'entrées de repositionnement pour
fixer ces adresses.
- _DYNAMIC
-
Tableau contenant toutes les structures de la section .dynamic. Ceci est
automatiquement rempli par l'éditeur de liens.
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)"
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 Unix Système V d'AT&T. Le format ELF est un
standard reconnu.
AUTEURS
La version originale de cette page de manuel a été écrite par
An Jeroen Ruigrok van der Werven
Aq asmodai@FreeBSD.org
en s'inspirant de
la page de manuel
elf
Bs x
de BSDi.
TRADUCTION
Cette page de manuel a été traduite par
Jean-Philippe Guérard <fevrier AT tigreraye DOT org> en 2005 et
révisée par Alain Portal <aportal AT univ-montp2 DOT fr> en 2006.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction par un rapport de bogue sur
le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en
utilisant la commande
« man -L C <section> <page_de_man> ».
|