Provided by: manpages-fr_4.27.0-1_all bug

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.

Pages du manuel de Linux 6.9.1                    15 juin 2024                                            ELF(5)