Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       dl_iterate_phdr - Parcourir une liste d'objets partagés

SYNOPSIS

       #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
       #include <link.h>

       int dl_iterate_phdr(
                 int (*callback) (struct dl_phdr_info *info,
                                  size_t size, void *data,
                 void *data;

DESCRIPTION

       La  fonction  dl_iterate_phdr()  permet  à  une  application  de  s'informer  lors  de son
       exécution, des objets partagés qu'elle a chargé.

       La fonction dl_iterate_phdr() parcourt la liste des objets partagés par une application et
       appelle  la  fonction  callback  sur  chaque objet jusqu'à ce que tous les objets partagés
       aient été traités ou que la fonction callback ait renvoyé une valeur non nulle.

       Chaque appel de callback prend trois  arguments :  info  qui  est  un  pointeur  vers  une
       structure  contenant  des informations sur les objets partagés ; size qui est la taille de
       la structure pointée par info ; et data qui est une copie de toute valeur qui  est  passée
       par  le  programme appelant dans le second argument (également nommé data) lors de l'appel
       de dl_iterate_phdr().

       L'argument info est une structure du type suivant :

           struct dl_phdr_info {
               ElfW(Addr)        dlpi_addr;  /* Adresse de base de l'objet */
               const char       *dlpi_name;  /* Nom de l'objet (terminée par
                                                un octet nul */
               const ElfW(Phdr) *dlpi_phdr;  /* Pointeur vers un tableau des
                                                en-têtes ELF du programme
                                                de cet objet */
               ElfW(Half)        dlpi_phnum; /* Nombre d'éléments dans
                                                dlpi_phdr */
           };

       (La macro ElfW() convertit son argument en  un  nom  de  type  de  données  ELF  adapté  à
       l'architecture  matériel.  Par exemple, sur un système 32-bits, ElfW(Addr) produit le type
       de données nommé Elf32_Addr. Des informations supplémentaires sur ces types  peuvent  être
       trouvées dans les fichiers d'en-tête <elf.h> et <link.h>).

       Le  champ  dlpi_addr  indique  l'adresse  de  base de l'objet partagé (la différence entre
       l'adresse en mémoire virtuelle de l'objet partagé et le décalage avec cet  objet  dans  le
       fichier  depuis  lequel  il a été chargé). Le champ dlpi_name est une chaîne de caractères
       terminée par un caractère nul indiquant le chemin à partir duquel l'objet  partagé  a  été
       chargé.

       Pour  comprendre  le sens des champs dlpi_phdr et dlpi_phnum, il faut se rendre compte que
       les objets partagés ELF sont un nombre de segments,  chacun  d'eux  possédant  un  en-tête
       décrivant  le  segment. Le champ dlpi_phdr est un pointeur vers un tableau des en-têtes du
       programme de cet objet partagé. Le champ dlpi_phnum est la taille de ce tableau.

       Ces en-têtes de programme sont structurés sous la forme suivantes :

           typedef struct
             {
               Elf32_Word  p_type;    /* Type de segment */
               Elf32_Off   p_offset;  /* Décalage du fichier de segment (?) */
               Elf32_Addr  p_vaddr;   /* Adresse virtuelle du segment */
               Elf32_Addr  p_paddr;   /* Adresse physique du segment */
               Elf32_Word  p_filesz;  /* Taille du segment dans le fichier */
               Elf32_Word  p_memsz;   /* Taille du segment en mémoire */
               Elf32_Word  p_flags;   /* Drapeau du segment */
               Elf32_Word  p_align;   /* Alignement du segment */
           } Elf32_Phdr;

       Notez que la position d'un en-tête de programme, x, en mémoire virtuelle est calculée avec
       la formule suivante :

         addr == info->dlpi_addr + info->dlpi_phdr[x].p_vaddr;

VALEUR RENVOYÉE

       La fonction dl_iterate_phdr() renvoie quoi qu'il en soit la valeur renvoyée par le dernier
       appel à callback.

VERSIONS

       dl_iterate_phdr() est géré par la glibc depuis la version 2.2.4.

CONFORMITÉ

       La fonction dl_iterate_phdr() est spécifique à Linux et ne doit pas être utilisée pour des
       applications portables.

EXEMPLE

       Le programme suivant affiche la liste des chemins des objets partagés qu'il a chargé. Pour
       chaque objet partagé, le programme liste les adresses virtuelles auxquelles  les  segments
       ELF de l'objet sont chargés.

       #define _GNU_SOURCE
       #include <link.h>
       #include <stdlib.h>
       #include <stdio.h>

       static int
       callback(struct dl_phdr_info *info, size_t size, void *data)
       {
           int j;

           printf("name=%s (%d segments)\n", info->dlpi_name,
               info->dlpi_phnum);

           for (j = 0; j < info->dlpi_phnum; j++)
                printf("\t\t header %2d: address=%10p\n", j,
                    (void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
           return 0;
       }

       int
       main(int argc, char *argv[])
       {
           dl_iterate_phdr(callback, NULL);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       ldd(1), objdump(1), readelf(1), dlopen(3), elf(5), ld.so(8)

       « Executable and Linking Format Specification » disponible en ligne à divers endroits.

COLOPHON

       Cette  page  fait partie de la publication 3.65 du projet man-pages Linux. Une description
       du projet et des  instructions  pour  signaler  des  anomalies  peuvent  être  trouvées  à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis    2010,    cette   traduction   est   maintenue   à   l'aide   de   l'outil   po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du  projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Christophe    Blaess    <http://www.blaess.fr/christophe/>   (1996-2003),   Alain   Portal
       <http://manpagesfr.free.fr/> (2003-2006). Florentin  Duneau  et  l'équipe  francophone  de
       traduction de Debian (2006-2009).

       Veuillez     signaler     toute     erreur     de     traduction     en     écrivant     à
       <debian-l10n-french@lists.debian.org>  ou  par  un  rapport  de  bogue   sur   le   paquet
       manpages-fr.

       Vous  pouvez  toujours  avoir  accès  à la version anglaise de ce document en utilisant la
       commande « man -L C <section> <page_de_man> ».