Votre IP: 38.107.179.240 
  
 
Google
 
Accueil e-mail Linux
Linux
Perl
Perl
C
Langage C
Dico
Dictionnaire
Biblio liens
Bibliothèque de liens
Index articles
Index articles
 

Date création : 27-03-2008 20:23:44

Linux  Vous êtes dans : GNU/Linux Astuces / Pages man [Section3 - Sous-fonctions]


DL_ITERATE_PHDR

 

Index

  1. NOM
  2. SYNOPSIS
  3. DESCRIPTION
  4. EXEMPLE
  5. VALEUR RENVOYÉE
  6. CONFORMITÉ À
  7. VOIR AUSSI
  8. TRADUCTION

 

NOMIndex

dl_iterate_phdr - Parcourir une liste d'objets partagés  

SYNOPSISIndex

#define _GNU_SOURCE
#include <link.h>

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

DESCRIPTIONIndex

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é un 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;
 

EXEMPLEIndex

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)
", info->dlpi_name,
        info->dlpi_phnum);

    for (j = 0; j < info->dlpi_phnum; j++)
         printf("		 header %2d: address=%10p
", 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);
}
 

VALEUR RENVOYÉEIndex

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

CONFORMITÉ ÀIndex

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

VOIR AUSSIIndex

ldd(1), objdump(1), readelf(1), dlopen(3), ld.so(8), et « Executable and Linking Format Specification » disponible en ligne à divers endroits.  

TRADUCTIONIndex

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.
La traduction de cette page de manuel est basée sur les traductions disponibles sur http://manpagesfr.free.fr/, mais est gérée par l'équipe francophone de traduction de Debian au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction 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> ».


Création : octobre 2007  © Tous droits réservés 2007 linux-perl-c
Valid HTML 4.01 TransitionalValid CSS