Provided by: manpages-fr-dev_4.18.1-1_all bug

NOM

       dlinfo - Obtenir des informations sur un objet chargé dynamiquement

BIBLIOTHÈQUE

       Bibliothèque de liens dynamiques (libdl, -ldl)

SYNOPSIS

       #define _GNU_SOURCE
       #include <link.h>
       #include <dlfcn.h>

       int dlinfo(void *restrict handle, int request, void *restrict info);

DESCRIPTION

       La  fonction  dlinfo()  obtient  des  informations  sur  l'objet  chargé  dynamiquement et
       référencé par handle  (habituellement  obtenu  par  un  appel  préalable  à  dlopen(3)  ou
       dlmopen(3)).  Le  paramètre  request  spécifie  quelle  information doit être renvoyée. Le
       paramètre info est un pointeur vers  un  tampon  utilisé  pour  stocker  les  informations
       renvoyées par l'appel ; le type de ce paramètre dépend de request.

       Les  valeurs suivantes sont prises en charge pour request (avec le type correspondant pour
       info entre parenthèses) :

       RTLD_DI_LMID (Lmid_t *)
              Récupérer l'identifiant de la liste d'association des liens (espace de  noms)  dans
              lequel handle est chargé.

       RTLD_DI_LINKMAP (struct link_map **)
              Récupèrer  un  pointeur  vers  la  structure  link_map  correspondant  à handle. Le
              paramètre info pointe vers un pointeur sur une  structure  link_map,  définie  dans
              <link.h> comme :

                  struct link_map {
                      ElfW(Addr) l_addr;  /* Difference entre l'adresse
                                             dans le fichier ELF et
                                             l'adresse en mémoire */
                      char      *l_name;  /* Chemin absolu du fichier où
                                             l'objet a été trouvé */
                      ElfW(Dyn) *l_ld;    /* La section dynamique de l'objet
                                             partagé */
                      struct link_map *l_next, *l_prev;
                                          /* Chaîne des objets chargés */

                      /* Plus des champs supplémentaires privés
                         de l'implementation */
                  };

       RTLD_DI_ORIGIN (char *)
              Copie le chemin du fichier de l'objet partégé correspondant à handle vers l'endroit
              pointé vers info.

       RTLD_DI_SERINFO (Dl_serinfo *)
              Obtient les chemins de recherche de bibliothèques pour un objet partagé indiqué 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  requête
              RTLD_DI_SERINFOSIZE  décrite  ci-dessous  permet  aux  applications  de  déterminer
              convenablement la taille du tampon. L'appelant doit effectur les étapes suivantes :

              (1)  Utiliser   une  requête  RTLD_DI_SERINFOSIZE  pour  renseigner  une  structure
                   Dl_serinfo avec la taille (dls_size) de la structure requise pour  la  requête
                   RTLD_DI_SERINFO ultérieure.

              (2)  Allouer un tampon Dl_serinfo de la bonne taille (dls_size).

              (3)  Utiliser  un  requête  RTLD_DI_SERINFOSIZE pour remplir les champs dls_size et
                   dls_cnt du tampon alloué à l'étape précédante.

              (4)  Utiliser  un  RTLD_DI_SERINFO  pour  obtenir  les  chemins  de  recherche   de
                   bibliothèques.

              La structure Dl_serinfo est définie comme suit :

                  typedef struct {
                      size_t dls_size;           /* Taille en octets du
                                                    tampon entier */
                      unsigned int dls_cnt;      /* Nombre d'éléments
                                                    dans 'dls_serpath' */
                      Dl_serpath dls_serpath[1]; /* En fait plus long,
                                                    'dls_cnt' éléments */
                  } Dl_serinfo;

              Chacun des éléments dls_serpath dans la structure ci-dessus sont structurés sous la
              forme suivantes :

                  typedef struct {
                      char *dls_name;            /* Nom du répertoire de recherche
                                                    de chemin de bibliothèque */
                      unsigned int dls_flags;    /* Indique d'où ce
                                                    répertoire provient */
                  } Dl_serpath;

              Le champ dls_flags n'est pas utilisé pour le moment et contient toujours zéro.

       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  appropriées  pour  allouer un tampon pouvant être
              utilisé dans une requête RTLD_DI_SERINFO ultérieure.

       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  partagé,  comme  utilisé  dans  les  relocalisations  TLS. Si cet objet ne
              définit pas de segment TLS, zéro 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  partagés.  Si  cet  objet ne définit pas un segment PT_TLS, ou si le thread
              appelant ne lui a pas alloué de bloc, NULL est placé dans *info.

VALEUR RENVOYÉE

       En cas de succès, dlinfo() renvoie 0. En cas d'erreur,  elle  renvoie  -1 ;  la  cause  de
       l'erreur peut être diagnostiquée avec dlerror(3).

VERSIONS

       dlinfo() est apparue la première fois dans la version 2.3.3 de la glibc.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).

       ┌────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │dlinfo()                                                │ Sécurité des threads │ MT-Safe │
       └────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS

       Cette fonction est une extension GNU non standard.

NOTES

       Cette  fonction  dérive  de  la  fonction Solaris de même nom et existe aussi sur d'autres
       systèmes. Les ensembles de requêtes prises en charge par les diverses  implémentations  ne
       se recouvrent que partiellement.

EXEMPLES

       Le  programme  ci-dessous  ouvre un objet partagé en utilisant dlopen(3) et utilise par la
       suite les requêtes RTLD_DI_SERINFOSIZE et RTLD_DI_SERINFO pour obtenir la liste de  chemin
       de  recherche  de  bibliothèques pour la bibliothèque. Voici un exemple de ce qui pourrait
       être observé lors de l'exécution 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 <dlfcn.h>
       #include <link.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           void *handle;
           Dl_serinfo serinfo;
           Dl_serinfo *sip;

           if (argc != 2) {
               fprintf(stderr, "Usage : %s <libpath>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           /* Obtenir un gestionnaire pour l'objet partagé indiqué sur la
              ligne de commande. */

           handle = dlopen(argv[1], RTLD_NOW);
           if (handle == NULL) {
               fprintf(stderr, "dlopen() failed: %s\n", dlerror());
               exit(EXIT_FAILURE);
           }

           /* Découvrir la taille du tampon qu'il faut passer à
              RTLD_DI_SERINFO. */

           if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == -1) {
               fprintf(stderr, "RTLD_DI_SERINFOSIZE a échoué : %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' fields
              dans le tampon nouvellement alloué. */

           if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) {
               fprintf(stderr, "RTLD_DI_SERINFOSIZE a échoué : %s\n", dlerror());
               exit(EXIT_FAILURE);
           }

           /* Récupérer et afficher la liste de recherche des bibliothques. */

           if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) {
               fprintf(stderr, "RTLD_DI_SERINFO a échoué : %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 française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier   <barbier@debian.org>,   David   Prévot  <david@tilapin.org>  et  Grégoire  Scano
       <gregoire.scano@malloc.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.