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