Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       dladdr, dladdr1 - Traduire les adresses en informations symboliques

SYNOPSIS

       #define _GNU_SOURCE
       #include <dlfcn.h>

       int dladdr(void *addr, Dl_info *info);

       int dladdr1(void *addr, Dl_info *info, void **extra_info, int flags);

       Éditez les liens avec -ldl.

DESCRIPTION

       La  fonction  dladdr() détermine si l'adresse spécifiée dans addr est située dans l'un des
       objets partagés chargés par l'application appelante.  Si  c'est  le  cas,  alors  dladdr()
       renvoie  des  informations  sur  l'objet  partagé et le symbole qui recouvrent addr. Cette
       information est renvoyée dans une structure Dl_info :

           typedef struct {
               const char *dli_fname; /* Chemin du fichier de l'objet partagé
                                         contenant l'adresse */
               void       *dli_fbase; /* Adresse de base à laquelle l'objet partagé
                                         est chargé */
               const char *dli_sname; /* Nom du symbole dont la définition
                                         recouvre addr */
               void       *dli_saddr; /* Adresse exacte du symbole dont
                                         le nom est dli_sname */
           } Dl_info;

       Si aucun symbole correspondant  à  l'adresse  addr  ne  peut  être  trouvé,  dli_sname  et
       dli_saddr sont définis à NULL.

       La  fonction  dladdr1() est comme dladdr() mais renvoie des informations additionnelles au
       moyen du paramètre extra_info. Les informations renvoyées dépendent de la valeur spécifiée
       dans flags et qui peut avoir l'une des valeurs suivantes :

       RTLD_DL_LINKMAP
              Obtient  un  pointeur  vers  la  table  d'association  de  liens  pour  le  fichier
              correspondant. Le paramètre extra_info pointe vers un pointeur  sur  une  structure
              link_map (c'est-à-dire struct link_map **), définie dans <link.h> comme :

                  struct link_map {
                      ElfW(Addr) l_addr;  /* Différence 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'implémentation */
                  };

       RTLD_DL_SYMENT
              Obtenir  un  pointeur  vers  une  entrée  de  la  table  de symboles ELF du symbole
              correspondant. Le paramètre extra_info est un pointeur  vers  un  pointeur  sur  un
              symbole :  const  ElfW(Sym)**. La macro ElfW() convertit son paramètre en un nom de
              type de données ELF adapté à l'architecture matérielle. Par exemple, sur un système
              64 bits,  ElfW(Sym)  produit le type de données nommé Elf64_Sym qui est défini dans
              <elf.h> comme :

                  typedef struct  {
                      Elf64_Word    st_name;     /* Nom du symbole */
                      unsigned char st_info;     /* Type et lien du symbole */
                      unsigned char st_other;    /* Visibilité du symbole */
                      Elf64_Section st_shndx;    /* Index de section */
                      Elf64_Addr    st_value;    /* Valeur du symbole */
                      Elf64_Xword   st_size;     /* Taille du symbole */
                  } Elf64_Sym;

              Le champ st_name est un index dans la table de chaînes.

              Le champ st_info encode le type et le lien du symbole. Le type peut être extrait en
              utilisant  la  macro ELF64_ST_TYPE(st_info) (ou ELF32_ST_TYPE() sur les plateformes
              32 bits) qui retourne une des valeurs suivantes :

                  Valeur          Description
                  STT_NOTYPE      Le type de ce symbole n'est pas défini
                  STT_OBJECT      Ce symbole est associé à un objet de données
                  STT_FUNC        Ce symbole est associé à un objet de code
                  STT_SECTION     Ce symbole est associé à une section
                  STT_FILE        Le nom de ce symbole est un nom de fichier
                  STT_COMMON      Ce symbole est un objet de données commun
                  STT_TLS         Ce symbole est un objet de données local au thread
                  STT_GNU_IFUNC   Ce symbole est un objet de code indirect

              La correspondance de symbole peut être extraite du champ st_info  en  utilisant  la
              macro  ELF64_ST_BIND(st_info)  (ou  ELF32_ST_BIND() sur les plateformes 32 bits) et
              renvoie l'une des valeurs suivantes :

                  Valeur           Description
                  STB_LOCAL        Symbole local
                  STB_GLOBAL       Symbole global
                  STB_WEAK         Symbole faible
                  STB_GNU_UNIQUE   Symbole unique

              Le champ st_other contient la visibilité du  symbole  qui  peut  être  extraite  en
              utilisant  la  macro ELF64_ST_VISIBILITY(st_info) (ou ELF32_ST_VISIBILITY() sur les
              plateformes 32 bits) et renvoie une des valeurs suivantes :

                  Valeur          Description
                  STV_DEFAULT     Règles de visibilité par défaut du symbole
                  STV_INTERNAL    Classe cachée spécifique au processeur
                  STV_HIDDEN      Le symbole n'est pas disponible dans d'autres modules
                  STV_PROTECTED   Non préemptible, non exporté

VALEUR RENVOYÉE

       En cas de succès, ces fonctions renvoient une valeur non  nulle.  Si  l'adresse  spécifiée
       dans addr peut être mise en correspondance avec un objet partagé, mais pas vers un symbole
       dans l'objet partagé, alors les champs info->dli_sname et info->dli_saddr sont mis à NULL.

       Si l'adresse spécifiée dans addr ne peut pas être  mise  en  correspondance  avec  l'objet
       partagé,  alors  ces  fonctions  renvoient  0.  Dans  ce cas, aucun message d'erreur n'est
       disponible avec dlerror(3).

VERSIONS

       dladdr() est présente depuis la version 2.0 de la glibc. dladdr1()  est  apparue  pour  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  │
       ├────────────────────┼──────────────────────┼─────────┤
       │dladdr(), dladdr1() │ Sécurité des threads │ MT-Safe │
       └────────────────────┴──────────────────────┴─────────┘

CONFORMITÉ

       Ces  fonctions  sont  des  extensions  GNU  non  standard qui sont également présentes sur
       Solaris.

BOGUES

       Quelquefois, les pointeurs de fonction passés à  dladdr()  peuvent  vous  surprendre.  Sur
       certaines  architectures  (notablement  i386 et x86_64), dli_fname et dli_fbase peuvent au
       final pointer sur l'objet depuis  lequel  vous  appelez  dladdr(),  même  si  la  fonction
       utilisée en paramètre devrait provenir d'une bibliothèque liée dynamiquement.

       Le  problème  est  que  le pointeur de fonction ne sera résolu que lors de la compilation,
       mais pointe simplement vers la  section  de  l'objet  original  plt  (table  de  procédure
       d'édition  des  liens)  qui  redirige l'appel après avoir demandé à l'éditeur dynamique de
       liens de résoudre le symbole. Un contournement consiste à compiler le code pour qu'il soit
       indépendant de son adressage : dans ce cas le compilateur ne peut pas préparer le pointeur
       à la compilation et gcc(1) générera du code qui chargera juste l'adresse finale du symbole
       depuis  la  table  GOT  (table d'offset globale) lors de l'exécution, avant de la passer à
       dladdr().

VOIR AUSSI

       dl_iterate_phdr(3), dlinfo(3), dlopen(3), dlsym(3), ld.so(8)

COLOPHON

       Cette page fait partie de la publication 5.10 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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 ⟨⟩.