Man page - elf(5)

Packages contains this manual

Available languages:

en fr ja ru

Manual

ELF

NOM
SYNOPSIS
DESCRIPTION
Types de base
En-tĂȘte ELF (Ehdr)
En-tĂȘte de programme (Phdr)
En-tĂȘte de section (Shdr)
Table des chaĂźnes et des symboles
Entrées de repositionnement (Rel et Rela)
Étiquettes dynamiques (Dyn)
Notes (Nhdr)
NOTES
VOIR AUSSI
TRADUCTION

NOM

elf – Format des fichiers exĂ©cutables ELF (« Executable and Linking Format »)

SYNOPSIS

#include <elf.h>

DESCRIPTION

Le fichier d’en-tĂȘte <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 objets partagĂ©s.

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.

Types de base

Les types suivants sont utilisés 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 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 « 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.

En-tĂȘte ELF (Ehdr)

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Ă©pendamment 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

Cela dĂ©finit une architecture 32 bits. Elle permet d’utiliser des machines avec des espaces d’adressage virtuel et des fichiers d’une taille allant jusqu’à 4 gigaoctets.

ELFCLASS64

Cela 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 gérés :

ELFDATANONE

Format de données inconnu.

ELFDATA2LSB

Complément à deux, petit boutiste.

ELFDATA2MSB

Complément à deux, gros boutiste.

EI_VERSION

Le 7e octet est le numéro de version de la spécification du format ELF :

EV_NONE

Version non valable.

EV_CURRENT

Version actuelle.

EI_OSABI

Le 8e 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 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 (embarqué)

EI_ABIVERSION

Le 9e 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_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 bits

EM_S390

IBM S/390

EM_ARM

Machines modernes de technologie RISC

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 Ă  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 associĂ©s au fichier. 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.

Si le nombre d’entrĂ©es de la table d’en-tĂȘte de programme est supĂ©rieur ou Ă©gal Ă  PN_XNUM (0xffff), ce membre contient PN_XNUM (0xffff) et le nombre rĂ©el d’entrĂ©es dans la table d’en-tĂȘte de programme est stockĂ© dans le membre sh_info de l’entrĂ©e initiale de la table des en-tĂȘtes de sections. Dans le cas contraire, le membre sh_info de l’entrĂ©e initiale de la table des en-tĂȘtes de sections contient la valeur zĂ©ro.
PN_XNUM

Ce nombre est dĂ©fini comme 0xffff, le plus grand nombre que e_phnum peut valoir, qui spĂ©cifie oĂč le nombre rĂ©el d’en-tĂȘtes de programme est assignĂ©.

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.

Si le nombre d’entrĂ©es de la table des en-tĂȘtes de sections est supĂ©rieur ou Ă©gal Ă  SHN_LORESERVE (0xff00), e_shnum contient la valeur zĂ©ro et le nombre rĂ©el d’entrĂ©es dans la table des en-tĂȘtes de sections est stockĂ© dans le membre sh_size de l’entrĂ©e initiale de la table des en-tĂȘtes de sections. Dans le cas contraire, le membre sh_size de l’entrĂ©e initiale de la table des en-tĂȘtes de sections contient la valeur 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 .

Si l’indice de la section de la table des chaĂźnes de noms des sections est supĂ©rieur ou Ă©gal Ă  SHN_LORESERVE (0xff00), ce membre contient la valeur SHN_XINDEX (0xffff) et l’indice rĂ©el de la section de la table des chaĂźnes de noms des sections est stockĂ© dans le membre sh_link de l’entrĂ©e initiale de la table des en-tĂȘtes de sections. Dans le cas contraire, le membre sh_link de l’entrĂ©e initiale de la table des en-tĂȘtes de sections contient la valeur zĂ©ro.

En-tĂȘte de programme (Phdr)

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 l’emplacement du champ p_flags au sein de la structure complĂšte.

p_type

Ce membre de la structure 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Ă©finies. 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 octet NULL, 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 spĂ©cifie l’emplacement de notes (ElfN_Nhdr).

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
PT_HIPROC

Les valeurs comprises dans la plage inclusive [ PT_LOPROC , PT_HIPROC ] sont réservées à des sémantiques spécifiques au processeur.

PT_GNU_STACK

Extension GNU qui est utilisĂ©e par le noyau de Linux pour contrĂŽler l’état de la pile Ă  l’aide de l’indicateur positionnĂ© dans le membre p_flags .

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

Sur 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 du 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 un masque de bits d’options relatives au 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_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 .

En-tĂȘte de section (Shdr)

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 de table des en-tĂȘtes de sections sont rĂ©servĂ©s : l’entrĂ©e initiale et toutes les entrĂ©es comprises entre SHN_LORESERVE et SHN_HIRESERVE . L’entrĂ©e initiale est utilisĂ©e par des extensions ELF pour e_phnum , e_shnum et e_shstrndx ; dans les autres cas, chaque champ de l’entrĂ©e initiale est mis Ă  zĂ©ro. Un fichier objet ne contient pas de section 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
SHN_HIPROC

Les valeurs supérieures dans la plage inclusive [ SHN_LOPROC , SHN_HIPROC ] 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 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 bits et 64 bits.
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 octet NULL.

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 notes (ElfN_Nhdr).

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 minimal de symboles de liaison dynamique. Un fichier objet peut aussi contenir une section SHT_SYMTAB .

SHT_LOPROC
SHT_HIPROC

Les valeurs comprises dans la plage inclusive [ SHT_LOPROC , SHT_HIPROC ] 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 de section 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 diffĂ©rente de zĂ©ro, 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 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 d’entrĂ©es de taille fixe, comme 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 contribuent Ă  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 initialisĂ©es qui contribuent Ă  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 initialisĂ©es qui contribuent Ă  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 .

.gnu.version

Cette section contient la table des symboles de version, un tableau d’élĂ©ments ElfN_Half . Cette section est du type SHT_GNU_versym . Le type d’attribut utilisĂ© est SHF_ALLOC .

.gnu.version_d

Cette section contient les dĂ©finitions de version de symboles, une table de structures ElfN_Verdef . Cette section est du type SHT_GNU_verdef . Le type d’attribut utilisĂ© est SHF_ALLOC .

.gnu.version_r

Cette section contient la version de symbole des Ă©lĂ©ments nĂ©cessaires, une table de structures ElfN_Verneed . Cette section est du type SHT_GNU_versym . Le type d’attribut utilisĂ© est SHF_ALLOC .

.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 diverses notes. Elle est du type SHT_NOTE . Aucun type d’attribut.

.note.ABI-tag

Cette section est utilisĂ©e pour dĂ©clarer l’ABI d’exĂ©cution attendue de l’image ELF. Elle peut comprendre le nom du systĂšme d’exploitation et ses versions d’exĂ©cution. Cette section est du type SHT_NOTE . Le seul attribut utilisĂ© est SHF_ALLOC .

.note.gnu.build-id

Cette section est utilisĂ©e pour conserver un identifiant unique du contenu de l’image ELF. DiffĂ©rents fichiers avec le mĂȘme identifiant de construction pourraient contenir le mĂȘme contenu exĂ©cutable. Voir l’option --build-id de l’éditeur de liens GNU ( ld (1)) pour plus de dĂ©tails. Cette section est du type SHT_NOTE . Le seul attribut utilisĂ© est SHF_ALLOC .

.note.GNU-stack

Cette section est utilisĂ©e dans les fichiers objets de Linux pour dĂ©clarer les attributs de la pile. Cette section est du type SHT_PROGBITS . Le seul attribut utilisĂ© est SHF_EXECINSTR . Cela indique Ă  l’éditeur de liens GNU que le fichier objet requiert une pile exĂ©cutable.

.note.openbsd.ident

Les exĂ©cutables natifs d’OpenBSD 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, tous les tests 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 .

Table des chaĂźnes et des symboles

Les sections de tables de chaĂźnes contiennent des sĂ©quences de caractĂšres terminĂ©es par un octet NULL, communĂ©ment appelĂ©es chaĂźnes. Le fichier objet utilise ces chaĂźnes pour reprĂ©senter les noms des symboles et des sections. Une chaĂźne peut ĂȘtre vue comme un indice dans la section de table de chaĂźnes. Le premier octet, qui est l’indice zĂ©ro, est dĂ©fini comme contenant un octet NULL(« \0 »). De mĂȘme, le dernier octet de la table de chaĂźnes est dĂ©fini comme contenant un octet NULL, ce qui assure que toutes les chaĂźnes se termineront bien par un octet 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 bits et 64 bits 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 diffĂ©rente de zĂ©ro, 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
STT_HIPROC

Les valeurs comprises dans la plage inclusive [ STT_LOPROC , STT_HIPROC ] 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
STB_HIPROC

Les valeurs comprises dans la plage inclusive [ STB_LOPROC , STB_HIPROC ] incluse sont réservées à des sémantiques spécifiques au processeur.

Il existe des macros permettant d”empaqueter et dĂ©paqueter les champs de type et de liaison :
ELF32_ST_BIND(
info )
ELF64_ST_BIND(
info )

Extraire une liaison d’une valeur st_info .

ELF32_ST_TYPE( info )
ELF64_ST_TYPE(
info )

Extraire un type d’une valeur st_info .

ELF32_ST_INFO( liaison , type )
ELF64_ST_INFO(
liaison , type )

Convertir une liaison et un type en une valeur st_info .

st_other

Ce membre définit la visibilité du symbole.
STV_DEFAULT

RĂšgles de visibilitĂ© des symboles par dĂ©faut. Les symboles globaux et les symboles faibles sont disponibles pour d’autres modules ; les dĂ©finitions dans d’autres modules peuvent s’interposer dans les rĂ©fĂ©rences du module local.

STV_INTERNAL

Classe cachée spécifique au processeur.

STV_HIDDEN

Le symbole n’est pas disponible pour d’autres modules ; les rĂ©fĂ©rences du module local se rĂ©solvent toujours dans le symbole local (c’est-Ă -dire les dĂ©finitions des autres modules ne peuvent s’interposer dans le symbole).

STV_PROTECTED

Le symbole est disponible pour d’autres modules, mais les rĂ©fĂ©rences du module local se rĂ©solvent toujours dans le symbole local.

Il existe des macros permettant d’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 avec une section. Ce membre contient l’indice correspondant de la table des en-tĂȘtes de sections.

Entrées de repositionnement (Rel et Rela)

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 n’est pas 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.

Étiquettes dynamiques (Dyn)

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

Indication de la fin de la section dynamique

DT_NEEDED

DĂ©placement dans la table des chaĂźnes vers le nom d’une bibliothĂšque nĂ©cessaire

DT_PLTRELSZ

Taille en octets des entrées de repositionnement 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 de repositionnement Rela

DT_RELASZ

Taille en octets de la table de repositionnement Rela

DT_RELAENT

Taille en octets d’une entrĂ©e de la table de repositionnement 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 des dépendances directes et indirectes de la bibliothÚque

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 de repositionnement Rel

DT_RELSZ

Taille en octets de la table de repositionnement Rela

DT_RELENT

Taille en octets d’une entrĂ©e de la table Rel

DT_PLTREL

Type d’entrĂ©e de repositionnement 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 entrĂ©e de repositionnement ne devrait s’appliquer Ă  un segment non accessible en Ă©criture

DT_JMPREL

Adresse des entrées de repositionnement, associées uniquement à la PLT

DT_BIND_NOW

Enjoindre Ă  l’éditeur de liens dynamique de traiter tous les repositionnements avant de transfĂ©rer le contrĂŽle Ă  l’exĂ©cutable

DT_RUNPATH

Déplacement dans la table des chaßnes pour le chemin de recherche des dépendances directes de la bibliothÚque

DT_LOPROC

DT_HIPROC

Les valeurs comprises dans la plage inclusive [ DT_LOPROC , DT_HIPROC ] sont réservées à des sémantiques spécifiques 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 corriger ces adresses.

_DYNAMIC

Tableau contenant toutes les structures dynamiques de la section .dynamic . Cela est automatiquement rempli par l’éditeur de liens.

Notes (Nhdr)

Les notes d’ELF permettent d’ajouter des informations arbitraires pour le systĂšme Ă  utiliser. Elles sont largement utilisĂ©es par les fichiers core ( e_type de ET_CORE ), mais de nombreux projets dĂ©finissent leur propre jeu d’extensions. Par exemple, la chaĂźne de compilation GNU utilise les notes d’ELF pour passer des informations de l’éditeur de liens Ă  la bibliothĂšque C.

Les sections note contiennent une sĂ©rie de notes (voir les dĂ©finitions struct plus loin). Chaque note est suivie par le champ nom (dont la longueur est dĂ©finie dans n_namesz ), puis par le champ descripteur (dont la longueur est dĂ©finie dans n_descsz ) et dont l’adresse de dĂ©part a un alignement de 4 octets. Aucun champ n’est dĂ©fini dans la structure de note Ă  cause de leur longueur arbitraire.

Un exemple pour analyser deux notes consécutives peut clarifier leur disposition en mémoire :

void *memory, *name, *desc;
Elf64_Nhdr *note, *next_note;
/* Le tampon pointe vers le début de la section ou du segment. */
note = memory;
/* Si le descripteur est défini, il suit la note. */
name = note->n_namesz == 0 ? NULL : memory + sizeof(*note);
/* Si le descripteur est défini, il suit le nom*/
(avec l’alignement). */
desc = note->n_descsz == 0 ? NULL :
memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4);
/* La note suivante suit les deux (avec l’alignement). */
next_note = memory + sizeof(*note) +
ALIGN_UP(note->n_namesz, 4) +
ALIGN_UP(note->n_descsz, 4);

Garder en mĂ©moire que l’interprĂ©tation de n_type dĂ©pend de l’espace de noms dĂ©fini par le champ n_namesz . Si le champ n_namesz n’est pas dĂ©fini (par exemple, est 0), il y a deux jeux de notes : un pour les fichiers core et un pour tous les autres types d’ELF. Si l’espace de noms est inconnu, les outils se replieront aussi habituellement sur ces jeux de notes.

typedef struct {
Elf32_Word n_namesz;
Elf32_Word n_descsz;
Elf32_Word n_type;
} Elf32_Nhdr;

typedef struct {
Elf64_Word n_namesz;
Elf64_Word n_descsz;
Elf64_Word n_type;
} Elf64_Nhdr;

n_namesz

La longueur du champ nom en octets. Le contenu suivra immédiatement cette note dans la mémoire. Le nom se termine par un octet NULL. Par exemple, si le nom est « GNU », n_namesz sera défini à 4.

n_descsz

La longueur du champ descripteur en octets. Le contenu suivra immédiatement le champ du nom dans la mémoire.

n_type

Selon la valeur du champ nom, ce membre peut prendre l’une des trois valeurs suivantes :

Core files (e_type = ET_CORE)

Notes utilisĂ©es par les fichiers core. Elles sont trĂšs spĂ©cifiques au systĂšme d’exploitation ou Ă  l’architecture et requiĂšrent souvent une Ă©troite coordination avec les noyaux, les bibliothĂšques C et les dĂ©bogueurs. Elles sont utilisĂ©es quand l’espace de noms est celui par dĂ©faut (c’est-Ă -dire n_namesz sera dĂ©fini à 0), ou un repli est utilisĂ© quand l’espace de noms est inconnu).

NT_PRSTATUS

structure prstatus

NT_FPREGSET

structure fpregset

NT_PRPSINFO

structure prpsinfo

NT_PRXREG

structure prxregset

NT_TASKSTRUCT

structure tĂąche

NT_PLATFORM

ChaĂźne Ă  partir de sysinfo(SI_PLATFORM)

NT_AUXV

tableau d’auxv

NT_GWINDOWS

structure gwindows

NT_ASRS

structure asrset

NT_PSTATUS

structure pstatus

NT_PSINFO

structure psinfo

NT_PRCRED

structure prcred

NT_UTSNAME

structure utsname

NT_LWPSTATUS

structure lwpstatus

NT_LWPSINFO

structure lwpinfo

NT_PRFPXREG

structure fprxregset

NT_SIGINFO

siginfo_t (sa taille peut croĂźtre avec le temps)

NT_FILE

Contient des informations sur les fichiers projetés

NT_PRXFPREG

user_fxsr_struct

NT_PPC_VMX

registres Altivec/VMX de PowerPC

NT_PPC_SPE

registres SPE/EVR de PowerPC

NT_PPC_VSX

registres VSX de PowerPC

NT_386_TLS

emplacements TLS du i386 (structure user_desc)

NT_386_IOPERM

bitmap de permission E/S du x86 (1=refus)

NT_X86_XSTATE

état étendu du x86 utilisant xsave

NT_S390_HIGH_GPRS

moitiés supérieures des registres du s390

NT_S390_TIMER

registre du temporisateur du s390

NT_S390_TODCMP

registre du comparateur d’horloge TOD (heure du jour) du s390

NT_S390_TODPREG

registre programmable du TOD du s390

NT_S390_CTRS

registres de contrĂŽle du s390

NT_S390_PREFIX

registre de préfixe du s390

NT_S390_LAST_BREAK

adresse d’évĂ©nement d’arrĂȘt du s390

NT_S390_SYSTEM_CALL

donnĂ©es de redĂ©marrage d’appel systĂšme du s390

NT_S390_TDB

bloc de diagnostic de transaction du S390

NT_ARM_VFP

registre VFP/NEON d’ARM

NT_ARM_TLS

registre TLS d’ARM

NT_ARM_HW_BREAK

registres de point d’arrĂȘt matĂ©riel d’ARM

NT_ARM_HW_WATCH

registres de point d’observation matĂ©riel d’ARM

NT_ARM_SYSTEM_CALL

numĂ©ro de l’appel systĂšme d’ARM

n_name = GNU

Extensions utilisées par la chaßne de compilation GNU.
NT_GNU_ABI_TAG

Information sur l’ABI du systĂšme d’exploitation (OS). Le champ desc sera composĂ© de quatre mots :

[0]

descripteur du systùme d’exploitation ( ELF_NOTE_OS_LINUX , ELF_NOTE_OS_GNU , etc.)

[1]

version majeure de l’ABI

[2]

version mineure de l’ABI

[3]

version sous-mineure de l’ABI

NT_GNU_HWCAP

Information synthétique sur les capacités matérielles (hwcap). Le champ desc commence par deux mots :

[0]

nombre d’entrĂ©es

[1]

masque de bits des entrées activées.

Puis suivent les entrĂ©es Ă  longueur variable, un octet suivi d’une chaĂźne terminĂ©e par un octet NULL de nom de « hwcap ». L’octet donne le numĂ©ro du bit Ă  tester s’il est activĂ©, (1U << bit) & masque de bits.

NT_GNU_BUILD_ID

Identifiant unique de construction tel que gĂ©nĂ©rĂ© par l’option --build-id de GNU ld (1). Le desc consiste en n’importe quel nombre d’octets diffĂ©rent de zĂ©ro.

NT_GNU_GOLD_VERSION

Le desc contient la version de l’éditeur de liens Gold de GNU utilisĂ©.

Default/unknown namespace (e_type != ET_CORE)

Elles sont utilisĂ©es quand l’espace de noms est celui par dĂ©faut (c’est-Ă -dire n_namesz sera dĂ©fini à 0), ou un repli est utilisĂ© quand l’espace de noms est inconnu).

NT_VERSION

Une chaüne de version d’un certain type.

NT_ARCH

Information sur l’architecture.

NOTES

ELF est apparu d’abord dans le System V. Le format ELF est une norme adoptĂ©e.

Les extensions pour e_phnum , e_shnum et e_strndx sont des extensions Linux. Sun, BSD et AMD64 les gùrent aussi. Pour plus d’informations, veuillez lire la section VOIR AUSSI.

VOIR AUSSI

as (1), elfedit (1), gdb (1), ld (1), nm (1), objcopy (1), objdump (1), patchelf (1), readelf (1), size (1), strings (1), strip (1), execve (2), dl_iterate_phdr (3), core (5), ld.so (8)

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écutables ELF ( Executable and Linking Format )

Sun Microsystems, Guide de l’éditeur de liens et des bibliothĂšques ( Linker and Libraries Guide ).

Version prĂ©liminaire de l’ABI AMD64 ( System V Application Binary Interface. AMD64 Architecture Processor Supplement – Interface binaire des applications System V).

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .