ELF(5) File Formats Manual ELF(5) NOM elf - Format des fichiers executables ELF (<< Executable and Linking Format >>) SYNOPSIS #include DESCRIPTION Le fichier d'en-tete 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 objets partages. 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. Types de base 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. En-tete ELF (Ehdr) 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, independamment 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 Cela definit une architecture 32 bits. Elle permet d'utiliser des machines avec des espaces d'adressage virtuel et des fichiers d'une taille allant jusqu'a 4 gigaoctets. ELFCLASS64 Cela 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 geres : ELFDATANONE Format de donnees inconnu. ELFDATA2LSB Complement a deux, petit boutiste. ELFDATA2MSB Complement a deux, gros boutiste. EI_VERSION Le 7e octet est le numero de version de la specification du format ELF : EV_NONE Version non valable. EV_CURRENT Version actuelle. EI_OSABI Le 8e 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 Le 9e 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 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 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 associes au fichier. 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 Ce nombre est defini comme 0xffff, le plus grand nombre que e_phnum peut valoir, qui specifie ou le nombre reel 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. En-tete de programme (Phdr) 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 l'emplacement du champ p_flags au sein de la structure complete. p_type Ce membre de la structure 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 definies. 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 octet 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 specifie l'emplacement de notes (ElfN_Nhdr). 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 PT_HIPROC Les valeurs comprises dans la plage inclusive [PT_LOPROC, PT_HIPROC] sont reservees a des semantiques specifiques au processeur. PT_GNU_STACK Extension GNU qui est utilisee par le noyau de Linux pour controler l'etat de la pile a l'aide de l'indicateur positionne dans le membre p_flags. 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 Sur 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 du 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 au 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_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. En-tete de section (Shdr) 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_shstrndx ; 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 SHN_HIPROC Les valeurs superieures dans la plage inclusive [SHN_LOPROC, SHN_HIPROC] 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 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 octet NULL. 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 This section holds a symbol table. Typically, SHT_SYMTAB provides symbols for link editing, though it may also be used for dynamic linking. As a complete symbol table, it may contain many symbols unnecessary for dynamic linking. An object file can also contain a SHT_DYNSYM section. The index of the associated string table section can be found in the sh_link member. 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 notes (ElfN_Nhdr). 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 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 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 de section 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 differente de zero, 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 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 d'entrees de taille fixe, comme 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 contribuent a 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 initialisees qui contribuent a 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 initialisees qui contribuent a 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, un 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 du 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 diverses notes. Elle est du type SHT_NOTE. Aucun type d'attribut. .note.ABI-tag Cette section est utilisee pour declarer l'ABI d'execution attendue de l'image ELF. Elle peut comprendre le nom du systeme d'exploitation et ses versions d'execution. Cette section est du type SHT_NOTE. Le seul attribut utilise est SHF_ALLOC. .note.gnu.build-id This section is used to hold an ID that uniquely identifies the contents of the ELF image. Different files with the same build ID should contain the same executable content. See the --build-id option to the GNU linker (ld(1)) for more details. This section is of type SHT_NOTE. The only attribute used is SHF_ALLOC. .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. Cela indique a l'editeur de liens GNU que le fichier objet requiert une pile executable. .note.openbsd.ident Les executables natifs d'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, tous les tests de compatibilite de l'emulation binaire ELF. .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. Table des chaines et des symboles Les sections de tables de chaines contiennent des sequences de caracteres terminees par un octet NULL, communement appelees chaines. Le fichier objet utilise ces chaines pour representer les noms des symboles et des sections. Une chaine peut etre vue comme un indice dans la section de table de chaines. Le premier octet, qui est l'indice zero, est defini comme contenant un octet NULL(<< \0 >>). De meme, le dernier octet de la table de chaines est defini comme contenant un octet NULL, ce qui assure que toutes les chaines 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 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 differente de zero, 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 STT_HIPROC Les valeurs comprises dans la plage inclusive [STT_LOPROC, STT_HIPROC] 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 STB_HIPROC Les valeurs comprises dans la plage inclusive [STB_LOPROC, STB_HIPROC] incluse sont reservees a des semantiques specifiques au processeur. Il existe des macros permettant d"empaqueter et depaqueter 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 definit la visibilite du symbole. STV_DEFAULT Regles de visibilite des symboles par defaut. Les symboles globaux et les symboles faibles sont disponibles pour d'autres modules ; les definitions dans d'autres modules peuvent s'interposer dans les references du module local. STV_INTERNAL Classe cachee specifique au processeur. STV_HIDDEN Le symbole n'est pas disponible pour d'autres modules ; les references du module local se resolvent toujours dans le symbole local (c'est-a-dire les definitions des autres modules ne peuvent s'interposer dans le symbole). STV_PROTECTED Le symbole est disponible pour d'autres modules, mais les references du module local se resolvent toujours dans le symbole local. 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. Entrees de repositionnement (Rel et Rela) 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 n'est pas 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. Etiquettes dynamiques (Dyn) 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 Indication de la fin de la section dynamique DT_NEEDED Deplacement dans la table des chaines vers le nom d'une bibliotheque necessaire DT_PLTRELSZ Taille en octets des entrees 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 chaines 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 entree de la table de repositionnement 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 des dependances directes et indirectes de la bibliotheque 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 de repositionnement Rel DT_RELSZ Taille en octets de la table de repositionnement Rela DT_RELENT Taille en octets d'une entree de la table Rel DT_PLTREL Type d'entree de repositionnement auquel se refere PLT (Rela ou Rel) DT_DEBUG Utilisation non definie pour le debogage DT_TEXTREL Son absence indique qu'aucune entree de repositionnement ne devrait s'appliquer a un segment non accessible en ecriture DT_JMPREL Adresse des entrees de repositionnement, associees uniquement a la PLT DT_BIND_NOW Enjoindre a l'editeur de liens dynamique de traiter tous les repositionnements avant de transferer le controle a l'executable DT_RUNPATH Deplacement dans la table des chaines pour le chemin de recherche des dependances directes de la bibliotheque DT_LOPROC DT_HIPROC Les valeurs comprises dans la plage inclusive [DT_LOPROC, DT_HIPROC] sont reservees a des semantiques specifiques 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 corriger ces adresses. _DYNAMIC Tableau contenant toutes les structures dynamiques de la section .dynamic. Cela est automatiquement rempli par l'editeur de liens. Notes (Nhdr) Les notes d'ELF permettent d'ajouter des informations arbitraires pour le systeme a utiliser. Elles sont largement utilisees par les fichiers core (e_type de ET_CORE), mais de nombreux projets definissent leur propre jeu d'extensions. Par exemple, la chaine de compilation GNU utilise les notes d'ELF pour passer des informations de l'editeur de liens a la bibliotheque C. Note sections contain a series of notes (see the struct definitions below). Each note is followed by the name field (whose length is defined in n_namesz) and then by the descriptor field (whose length is defined in n_descsz) and whose starting address has a 4 byte alignment. Neither field is defined in the note struct due to their arbitrary lengths. Un exemple pour analyser deux notes consecutives peut clarifier leur disposition en memoire : void *memory, *name, *desc; Elf64_Nhdr *note, *next_note; /* The buffer is pointing to the start of the section/segment. */ note = memory; /* If the name is defined, it follows the note. */ name = note->n_namesz == 0 ? NULL : memory + sizeof(*note); /* If the descriptor is defined, it follows the name (with alignment). */ desc = note->n_descsz == 0 ? NULL : memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4); /* The next note follows both (with alignment). */ next_note = memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4) + ALIGN_UP(note->n_descsz, 4); Garder en memoire que l'interpretation de n_type depend de l'espace de noms defini par le champ n_namesz. Si le champ n_namesz n'est pas defini (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 immediatement cette note dans la memoire. Le nom se termine par un octet NULL. Par exemple, si le nom est << GNU >>, n_namesz sera defini a 4. n_descsz La longueur du champ descripteur en octets. Le contenu suivra immediatement le champ du nom dans la memoire. 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 utilisees par les fichiers core. Elles sont tres specifiques au systeme d'exploitation ou a l'architecture et requierent souvent une etroite coordination avec les noyaux, les bibliotheques C et les debogueurs. Elles sont utilisees quand l'espace de noms est celui par defaut (c'est-a-dire n_namesz sera defini a 0), ou un repli est utilise 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 tache NT_PLATFORM Chaine a 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 croitre avec le temps) NT_FILE Contient des informations sur les fichiers projetes 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 etat etendu du x86 utilisant xsave NT_S390_HIGH_GPRS moities superieures 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 controle du s390 NT_S390_PREFIX registre de prefixe du s390 NT_S390_LAST_BREAK adresse d'evenement d'arret du s390 NT_S390_SYSTEM_CALL donnees de redemarrage d'appel systeme 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'arret materiel d'ARM NT_ARM_HW_WATCH registres de point d'observation materiel d'ARM NT_ARM_SYSTEM_CALL numero de l'appel systeme d'ARM n_name = GNU Extensions utilisees par la chaine de compilation GNU. NT_GNU_ABI_TAG Information sur l'ABI du systeme d'exploitation (OS). Le champ desc sera compose de quatre mots : [0] OS descriptor (ELF_NOTE_OS_LINUX, ELF_NOTE_OS_GNU, and so on) [1] version majeure de l'ABI [2] version mineure de l'ABI [3] version sous-mineure de l'ABI NT_GNU_HWCAP Information synthetique sur les capacites materielles (hwcap). Le champ desc commence par deux mots : [0] nombre d'entrees [1] masque de bits des entrees activees. Puis suivent les entrees a longueur variable, un octet suivi d'une chaine terminee par un octet NULL de nom de << hwcap >>. L'octet donne le numero du bit a tester s'il est active, (1U << bit) & masque de bits. NT_GNU_BUILD_ID Identifiant unique de construction tel que genere par l'option --build-id de GNU ld(1). Le desc consiste en n'importe quel nombre d'octets different de zero. NT_GNU_GOLD_VERSION Le desc contient la version de l'editeur de liens Gold de GNU utilise. Default/unknown namespace (e_type != ET_CORE) Elles sont utilisees quand l'espace de noms est celui par defaut (c'est-a-dire n_namesz sera defini a 0), ou un repli est utilise quand l'espace de noms est inconnu). NT_VERSION Une chaine 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 adoptee. 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), 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 executables ELF (Executable and Linking Format) Sun Microsystems, Guide de l'editeur de liens et des bibliotheques (Linker and Libraries Guide). Version preliminaire de l'ABI AMD64 (System V Application Binary Interface. AMD64 Architecture Processor Supplement - Interface binaire des applications System V). TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.18 8 fevrier 2026 ELF(5)