.\" -*- coding: UTF-8 -*- '\" t .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dl_iterate_phdr 3 "17 mai 2025" "Pages du manuel de Linux 6.15" .SH NOM dl_iterate_phdr – Parcourir une liste d'objets partagés .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP,\ \fI\-lc\fP) .SH SYNOPSIS .nf \fB#define _GNU_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP .P \fBint dl_iterate_phdr(\fP \fB typeof(int (struct dl_phdr_info *\fP\fIinfo\fP\fB, size_t \fP\fIsize\fP\fB, void *\fP\fIdata\fP\fB))\fP \fB *\fP\fIcallback\fP\fB,\fP \fB void *\fP\fIdata\fP\fB);\fP .fi .SH DESCRIPTION La fonction \fBdl_iterate_phdr\fP() permet à une application de s'informer, lors de son exécution, des objets partagés qu'elle a chargés et de l'ordre dans lequel ils ont été chargés. .P La fonction \fBdl_iterate_phdr\fP() parcourt la liste des objets partagés par une application et appelle la fonction \fIcallback\fP sur chaque objet jusqu'à ce que tous les objets partagés aient été traités ou que la fonction \fIcallback\fP ait renvoyé une valeur non nulle. .P Chaque appel de \fIcallback\fP prend trois paramètres\ : \fIinfo\fP qui est un pointeur vers une structure contenant des informations sur les objets partagés\ ; \fIsize\fP qui est la taille de la structure pointée par \fIinfo\fP\ ; et \fIdata\fP qui est une copie de toute valeur qui est passée par le programme appelant dans le second argument (également nommé \fIdata\fP) lors de l'appel de \fBdl_iterate_phdr\fP(). .P L'argument \fIinfo\fP est une structure du type suivant\ : .P .in +4n .EX struct dl_phdr_info { ElfW(Addr) dlpi_addr; /* Base address of object */ const char *dlpi_name; /* (Null\-terminated) name of object */ const ElfW(Phdr) *dlpi_phdr; /* Pointer to array of ELF program headers for this object */ ElfW(Half) dlpi_phnum; /* # of items in \f[I]dlpi_phdr\fR */ \& /* The following fields were added in glibc 2.4, after the first version of this structure was available. Check the \f[I]size\fR argument passed to the dl_iterate_phdr callback to determine whether or not each later member is available. */ \& unsigned long long dlpi_adds; /* Incremented when a new object may have been added */ unsigned long long dlpi_subs; /* Incremented when an object may have been removed */ size_t dlpi_tls_modid; /* If there is a PT_TLS segment, its module ID as used in TLS relocations, else zero */ void *dlpi_tls_data; /* The address of the calling thread\[aq]s instance of this module\[aq]s PT_TLS segment, if it has one and it has been allocated in the calling thread, otherwise a null pointer */ }; .EE .in .P La macro \fIElfW\fP() convertit son argument en un nom de type de données ELF adapté à l'architecture matérielle. 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 \fI\fP et \fI\fP. .P Le champ \fIdlpi_addr\fP 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 \fIdlpi_name\fP 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é. .P Pour comprendre le sens des champs \fIdlpi_phdr\fP et \fIdlpi_phnum\fP, il faut se rendre compte que les objets partagés ELF sont constitué d'un certain nombre de segments, chacun d'eux possédant un en\-tête décrivant le segment. Le champ \fIdlpi_phdr\fP est un pointeur vers un tableau des en\-têtes du programme de cet objet partagé. Le champ \fIdlpi_phnum\fP est la taille de ce tableau. .P Ces en\-têtes de programme sont structurés sous la forme suivantes\ : .P .in +4n .EX 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; .EE .in .P Notez que la position en mémoire virtuelle d'un en\-tête de programme, \fIx\fP, est calculée avec la formule suivante\ : .P .in +4n .EX addr == info\->dlpi_addr + info\->dlpi_phdr[x].p_vaddr; .EE .in .P Les valeurs possibles pour \fIp_type\fP incluent les suivantes (voir \fI\fP pour plus de détails) : .P .in +4n .EX .\" For PT_GNU_STACK, see http://www.airs.com/blog/archives/518 #define PT_LOAD 1 /* Segment de programme chargeable */ #define PT_DYNAMIC 2 /* Information d'édition de liens dynamiques */ #define PT_INTERP 3 /* Interpréteur de programme */ #define PT_NOTE 4 /* Information auxiliaire */ #define PT_SHLIB 5 /* Réservé */ #define PT_PHDR 6 /* Entrée pour la table d'en\-tête elle même */ #define PT_TLS 7 /* Segment de stockage local au thread */ #define PT_GNU_EH_FRAME 0x6474e550 /* Segment GCC .eh_frame_hdr */ #define PT_GNU_STACK 0x6474e551 /* Indique l'exécutabilité de la pile */ #define PT_GNU_RELRO 0x6474e552 /* Lecture seule après relocalisation */ .EE .in .SH "VALEUR RENVOYÉE" La fonction \fBdl_iterate_phdr\fP() renvoie n'importe quelle valeur renvoyée par le dernier appel à \fIcallback\fP. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribut Valeur T{ .na .nh \fBdl_iterate_phdr\fP() T} Sécurité des threads MT\-Safe .TE .SH VERSIONS De nombreux autres systèmes fournissent une version de cette fonction bien que les détails de la structure \fIdl_phdr_info\fP soient différents. Sur les BSD et Solaris, la structure inclut les champs \fIdlpi_addr\fP, \fIdlpi_name\fP, \fIdlpi_phdr\fP et \fIdlpi_phnum\fP en plus d'autres champs spécifiques à chaque implémentation. .P Les futures versions de la bibliothèque C peuvent ajouter d'autres champs à la structure \fIdl_phdr_info\fP ; dans ce cas, l'argument \fIsize\fP fournit un mécanisme pour que la fonction appelée sache si elle est exécutée sur un système possédant des champs supplémentaires. .SH STANDARDS Aucune. .SH HISTORIQUE glibc 2.2.4. .SH NOTES Le premier objet visité par \fIcallback\fP est le programme principal. Pour ce programme, le champ \fIdlpi_name\fP est une chaîne de caractères vide. .SH EXEMPLES Le programme suivant affiche la liste des chemins des objets partagés qu'il a chargé. Pour chaque objet partagé, le programme liste plusieurs informations (adresse virtuelle, taille, drapeaux et type) pour chacun des segments des objets ELF. .P La session shell suivante montre la sortie produite sur un système x86\-64. Le premier objet partagé pour lequel une sortie est affichée (où le nom est une chaîne de caractères vide) est le programme principal. .P .in +4n .EX $\fB ./a.out\fP; Name: "" (9 segments) 0: [ 0x400040; memsz: 1f8] flags: 0x5; PT_PHDR 1: [ 0x400238; memsz: 1c] flags: 0x4; PT_INTERP 2: [ 0x400000; memsz: ac4] flags: 0x5; PT_LOAD 3: [ 0x600e10; memsz: 240] flags: 0x6; PT_LOAD 4: [ 0x600e28; memsz: 1d0] flags: 0x6; PT_DYNAMIC 5: [ 0x400254; memsz: 44] flags: 0x4; PT_NOTE 6: [ 0x400970; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME 7: [ (nil); memsz: 0] flags: 0x6; PT_GNU_STACK 8: [ 0x600e10; memsz: 1f0] flags: 0x4; PT_GNU_RELRO Name: "linux\-vdso.so.1" (4 segments) 0: [0x7ffc6edd1000; memsz: e89] flags: 0x5; PT_LOAD 1: [0x7ffc6edd1360; memsz: 110] flags: 0x4; PT_DYNAMIC 2: [0x7ffc6edd17b0; memsz: 3c] flags: 0x4; PT_NOTE 3: [0x7ffc6edd17ec; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME Name: "/lib64/libc.so.6" (10 segments) 0: [0x7f55712ce040; memsz: 230] flags: 0x5; PT_PHDR 1: [0x7f557145b980; memsz: 1c] flags: 0x4; PT_INTERP 2: [0x7f55712ce000; memsz: 1b6a5c] flags: 0x5; PT_LOAD 3: [0x7f55716857a0; memsz: 9240] flags: 0x6; PT_LOAD 4: [0x7f5571688b80; memsz: 1f0] flags: 0x6; PT_DYNAMIC 5: [0x7f55712ce270; memsz: 44] flags: 0x4; PT_NOTE 6: [0x7f55716857a0; memsz: 78] flags: 0x4; PT_TLS 7: [0x7f557145b99c; memsz: 544c] flags: 0x4; PT_GNU_EH_FRAME 8: [0x7f55712ce000; memsz: 0] flags: 0x6; PT_GNU_STACK 9: [0x7f55716857a0; memsz: 3860] flags: 0x4; PT_GNU_RELRO Name: "/lib64/ld\-linux\-x86\-64.so.2" (7 segments) 0: [0x7f557168f000; memsz: 20828] flags: 0x5; PT_LOAD 1: [0x7f55718afba0; memsz: 15a8] flags: 0x6; PT_LOAD 2: [0x7f55718afe10; memsz: 190] flags: 0x6; PT_DYNAMIC 3: [0x7f557168f1c8; memsz: 24] flags: 0x4; PT_NOTE 4: [0x7f55716acec4; memsz: 604] flags: 0x4; PT_GNU_EH_FRAME 5: [0x7f557168f000; memsz: 0] flags: 0x6; PT_GNU_STACK 6: [0x7f55718afba0; memsz: 460] flags: 0x4; PT_GNU_RELRO .EE .in .SS "Source du programme" .\" SRC BEGIN (dl_iterate_phdr.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& static int callback(struct dl_phdr_info *info, size_t size, void *data) { char *type; int p_type; \& printf("Name: \[rs]"%s\[rs]" (%d segments)\[rs]n", info\->dlpi_name, info\->dlpi_phnum); \& for (size_t j = 0; j < info\->dlpi_phnum; j++) { p_type = info\->dlpi_phdr[j].p_type; type = (p_type == PT_LOAD) ? "PT_LOAD" : (p_type == PT_DYNAMIC) ? "PT_DYNAMIC" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_NOTE) ? "PT_NOTE" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_PHDR) ? "PT_PHDR" : (p_type == PT_TLS) ? "PT_TLS" : (p_type == PT_GNU_EH_FRAME) ? "PT_GNU_EH_FRAME" : (p_type == PT_GNU_STACK) ? "PT_GNU_STACK" : (p_type == PT_GNU_RELRO) ? "PT_GNU_RELRO" : NULL; \& printf(" %2zu: [%14p; memsz:%7jx] flags: %#jx; ", j, (void *) (info\->dlpi_addr + info\->dlpi_phdr[j].p_vaddr), (uintmax_t) info\->dlpi_phdr[j].p_memsz, (uintmax_t) info\->dlpi_phdr[j].p_flags); if (type != NULL) printf("%s\[rs]n", type); else printf("[other (%#x)]\[rs]n", p_type); } \& return 0; } \& int main(void) { dl_iterate_phdr(callback, NULL); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "VOIR AUSSI" \fBldd\fP(1), \fBobjdump\fP(1), \fBreadelf\fP(1), \fBdladdr\fP(3), \fBdlopen\fP(3), \fBelf\fP(5), \fBld.so\fP(8) .P « \fIExecutable and Linking Format Specification\fP » disponible en ligne à divers endroits. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Grégoire Scano . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .