dlinfo(3) Library Functions Manual dlinfo(3) NOM dlinfo - Obtenir des informations sur un objet charge dynamiquement BIBLIOTHEQUE Bibliotheque de liens dynamiques (libdl, -ldl) SYNOPSIS #define _GNU_SOURCE #include #include int dlinfo(void *restrict handle, int request, void *restrict info); DESCRIPTION La fonction dlinfo() obtient des informations sur l'objet charge dynamiquement et reference par handle (habituellement obtenu par un appel prealable a dlopen(3) ou dlmopen(3)). Le parametre request specifie quelle information doit etre renvoyee. Le parametre info est un pointeur vers un tampon utilise pour stocker les informations renvoyees par l'appel ; le type de ce parametre depend de request. Les valeurs suivantes sont prises en charge pour request (avec le type correspondant pour info entre parentheses) : RTLD_DI_LMID (Lmid_t *) Recuperer l'identifiant de la liste d'association des liens (espace de noms) dans lequel handle est charge. RTLD_DI_LINKMAP (struct link_map **) Recuperer un pointeur vers la structure link_map correspondant a handle. Le parametre info pointe vers un pointeur sur une structure link_map, definie dans comme : struct link_map { ElfW(Addr) l_addr; /* Difference entre l'adresse dans le fichier ELF et l'adresse en memoire */ char *l_name; /* Chemin absolu du fichier ou l'objet a ete trouve */ ElfW(Dyn) *l_ld; /* La section dynamique de l'objet partage */ struct link_map *l_next, *l_prev; /* Chaine des objets charges */ /* Plus des champs supplementaires prives de l'implementation */ }; RTLD_DI_ORIGIN (char *) Copie le chemin du fichier de l'objet partege correspondant a handle vers l'endroit pointe vers info. RTLD_DI_SERINFO (Dl_serinfo *) Obtient les chemins de recherche de bibliotheques pour un objet partage indique par handle. L'argument info est un pointeur vers un Dl_serinfo qui contient les chemins de recherche. Parce que le nombre de chemins de recherche peut varier, la taille de la structure sur laquelle info pointe peut aussi varier. La requete RTLD_DI_SERINFOSIZE decrite ci-dessous permet aux applications de determiner convenablement la taille du tampon. L'appelant doit effectur les etapes suivantes : (1) Utiliser une requete RTLD_DI_SERINFOSIZE pour renseigner une structure Dl_serinfo avec la taille (dls_size) de la structure requise pour la requete RTLD_DI_SERINFO ulterieure. (2) Allouer un tampon Dl_serinfo de la bonne taille (dls_size). (3) Utiliser un requete RTLD_DI_SERINFOSIZE pour remplir les champs dls_size et dls_cnt du tampon alloue a l'etape precedante. (4) Utiliser un RTLD_DI_SERINFO pour obtenir les chemins de recherche de bibliotheques. La structure Dl_serinfo est definie comme suit : typedef struct { size_t dls_size; /* Taille en octets du tampon entier */ unsigned int dls_cnt; /* Nombre d'elements dans 'dls_serpath' */ Dl_serpath dls_serpath[1]; /* En fait plus long, 'dls_cnt' elements */ } Dl_serinfo; Chacun des elements dls_serpath dans la structure ci-dessus sont structures sous la forme suivantes : typedef struct { char *dls_name; /* Nom du repertoire de recherche de chemin de bibliotheque */ unsigned int dls_flags; /* Indique d'ou ce repertoire provient */ } Dl_serpath; Le champ dls_flags n'est pas utilise pour le moment et contient toujours zero. RTLD_DI_SERINFOSIZE (Dl_serinfo *) Renseigne les champs dls_size et dls_cnt de la structure Dl_serinfo sur laquelle pointe info avec des valeurs appropriees pour allouer un tampon pouvant etre utilise dans une requete RTLD_DI_SERINFO ulterieure. RTLD_DI_TLS_MODID (size_t *, depuis la version 2.4 de la glibc) Obtient l'identifiant de module du segment TLS (stockage local au thread) de l'objet partage, comme utilise dans les relocalisations TLS. Si cet objet ne definit pas de segment TLS, zero est mis dans *info. RTLD_DI_TLS_DATA (void **, depuis la version 2.4 de la glibc) Obtenir un pointeur au bloc TLS du thread appelant correspondant au segment TLS des objets partages. Si cet objet ne definit pas un segment PT_TLS, ou si le thread appelant ne lui a pas alloue de bloc, NULL est place dans *info. VALEUR RENVOYEE En cas de succes, dlinfo() renvoie 0. En cas d'erreur, elle renvoie -1 ; la cause de l'erreur peut etre diagnostiquee avec dlerror(3). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |dlinfo() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ VERSIONS Les ensembles de requetes prises en charge par les diverses implementations ne se recouvrent que partiellement. STANDARDS GNU. HISTORIQUE glibc 2.3.3. Solaris. EXEMPLES Le programme ci-dessous ouvre un objet partage en utilisant dlopen(3) et utilise par la suite les requetes RTLD_DI_SERINFOSIZE et RTLD_DI_SERINFO pour obtenir la liste de chemin de recherche de bibliotheques pour la bibliotheque. Voici un exemple de ce qui pourrait etre observe lors de l'execution du programme : $ ./a.out /lib64/libm.so.6 dls_serpath[0].dls_name = /lib64 dls_serpath[1].dls_name = /usr/lib64 Source du programme #define _GNU_SOURCE #include #include #include #include int main(int argc, char *argv[]) { void *handle; Dl_serinfo serinfo; Dl_serinfo *sip; if (argc != 2) { fprintf(stderr, "Utilisation : %s \n", argv[0]); exit(EXIT_FAILURE); } /* Obtenir un gestionnaire pour l'objet partage indique sur la ligne de commande. */ handle = dlopen(argv[1], RTLD_NOW); if (handle == NULL) { fprintf(stderr, "dlopen() failed: %s\n", dlerror()); exit(EXIT_FAILURE); } /* Decouvrir la taille du tampon qu'il faut passer a RTLD_DI_SERINFO. */ if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == -1) { fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror()); exit(EXIT_FAILURE); } /* Allouer le tampon pour l'utiliser avec RTLD_DI_SERINFO. */ sip = malloc(serinfo.dls_size); if (sip == NULL) { perror("malloc"); exit(EXIT_FAILURE); } /* Initialiser les champs 'dls_size' et 'dls_cnt' dans le tampon nouvellement alloue. */ if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) { fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror()); exit(EXIT_FAILURE); } /* Recuperer et afficher la liste de recherche des bibliotheques. */ if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) { fprintf(stderr, "RTLD_DI_SERINFO failed: %s\n", dlerror()); exit(EXIT_FAILURE); } for (size_t j = 0; j < serinfo.dls_cnt; j++) printf("dls_serpath[%zu].dls_name = %s\n", j, sip->dls_serpath[j].dls_name); exit(EXIT_SUCCESS); } VOIR AUSSI dl_iterate_phdr(3), dladdr(3), dlerror(3), dlopen(3), dlsym(3), ld.so(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Gregoire Scano Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 dlinfo(3)