Loading

NOM

       dl_iterate_phdr - Parcourir une liste d’objets partagés

SYNOPSIS

       #define _GNU_SOURCE
       #include <link.h>

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

       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),
       feature_test_macros(7), ld.so(8) et  « Executable  and  Linking  Format
       Specification » disponible en ligne à divers endroits.

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 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

       Cette page de manuel a été traduite  et  mise  à  jour  par  Christophe
       Blaess  <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
       Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et  mise  à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Florentin Duneau <fduneau@gmail.com> et l’équipe
       francophone de traduction de Debian.

       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> ».