Provided by: manpages-fr_3.32d0.2p4-1_all bug

NOM

       rtld-audit - API d'audit pour l'éditeur de liens dynamique

SYNOPSIS

       #define _GNU_SOURCE /* Consultez feature_test_macros(7) */

       #include <link.h>

DESCRIPTION

       L'éditeur  de  liens  dynamique  GNU  (l'éditeur  de  liens à l'exécution) fournit une API
       d'audit qui permet à une application d'être notifiée quand différents  événements  liés  à
       l'édition de liens surviennent. Cette API est très similaire à l'interface d'audit fournie
       par l'éditeur de liens Solaris. Les constantes et prototypes nécessaires sont  définis  en
       incluant <link.h>.

       Pour  utiliser  cette  interface,  le  programmeur  crée  une  bibliothèque  partagée  qui
       implémente un ensemble standard de noms de fonctions. Toutes les  fonctions  n'ont  pas  à
       être  implémentées :  dans  la plupart des cas, si le programmeur n'est pas intéressé dans
       une certaine classe d'événements d'audit, alors aucune implémentation n'a à  être  fournie
       pour la fonction d'audit correspondante.

       Pour  utiliser l'interface d'audit, la variable d'environnement LD_AUDIT doit être définie
       avec une liste de bibliothèques partagées, séparées par des « deux-points »,  qui  peuvent
       implémenter  l'API  (ou  une  partie)  d'audit.  Quand un événement pouvant être surveillé
       survient, la fonction correspondante est appelée dans chaque bibliothèque, dans l'ordre où
       sont listées les bibliothèques.

   la_version()

       unsigned int la_version(unsigned int version);

       Il  s'agit  de la seule fonction qui doit être définie par une bibliothèque d'audit : elle
       effectue la présentation initiale entre l'éditeur de liens  et  la  bibliothèque  d'audit.
       Lorsque  cette fonction est appelée, l'éditeur de liens passe, dans version, la version la
       plus importante de l'interface d'audit qui soit prise en charge par l'éditeur de liens. Si
       nécessaire, la bibliothèque d'audit peut vérifier que cette version suffit à ses besoins.

       En  retour,  cette  fonction  doit  renvoyer  la  version de l'interface d'audit que cette
       bibliothèque d'audit va utiliser (renvoyer version est permis). Si la valeur de retour est
       0  ou  une  version  supérieure  à  celle prise en charge par l'éditeur de liens, alors la
       bibliothèque d'audit est ignorée.

   la_objsearch()

       char *la_objsearch(const char *name, uintptr_t *cookie,
                          unsigned int flag);

       L'éditeur de liens appelle cette fonction pour informer la bibliothèque d'audit  qu'il  va
       se mettre à la recherche d'un objet partagé. Le paramètre name est le nom de fichier ou le
       chemin dans lequel s'effectue  la  recherche.  cookie  identifie  l'objet  partagé  qui  a
       déclenché la recherche. flag est l'une des valeurs suivantes :

       LA_SER_ORIG      Il  s'agit du nom de départ de la recherche. Généralement ce nom provient
                        d'une entrée  ELF  DT_NEEDED  ou  est  le  paramètre  filename  fourni  à
                        dlopen(3).

       LA_SER_LIBPATH   name a été créé en utilisant un répertoire indiqué dans LD_LIBRARY_PATH.

       LA_SER_RUNPATH   name  a  été  créé  en utilisant un répertoire indiqué dans une liste ELF
                        DT_RPATH ou DT_RUNPATH.

       LA_SER_CONFIG    name a été trouvé par le cache ldconfig(8) (/etc/ld.so.cache).

       LA_SER_DEFAULT   name a été trouvé par une recherche dans un des répertoires par défaut.

       LA_SER_SECURE    name est spécifique à un objet sûr (pas utilisé sous Linux).

       la_objsearch() renvoie comme valeur de retour le chemin que  l'éditeur  de  liens  devrait
       utiliser  pour  les  opérations suivantes. Si NULL est renvoyé, alors le chemin est ignoré
       par la suite. Les bibliothèques qui ne cherche qu'à  observer  les  chemins  de  recherche
       devraient renvoyer name.

   la_activity()

       void la_activity( uintptr_t *cookie, unsigned int flag);

       L'éditeur   de  liens  appelle  cette  fonction  pour  informer  la  bibliothèque  d'audit
       d'activités sur la table des liens. cookie identifie l'objet à la tête de la table.  Quand
       l'éditeur de liens appelle cette fonction, flag vaut l'une des valeurs suivantes :

       LA_ACT_ADD         De nouveaux objets sont ajoutés à la table.

       LA_ACT_DELETE      Des objets sont retirés d ela table.

       LA_ACT_CONSISTENT  L'activité  sur  la  table  est  terminée :  la  table  est  de nouveau
                          cohérente.

   la_objopen()

       unsigned int la_objopen(struct link_map *map, Lmid_t lmid,
                               uintptr_t *cookie);

       L'éditeur de liens appelle cette fonction quand un nouvel objet  partagé  est  chargé.  Le
       paramètre  map  est un pointeur vers la structure d'une table de liens qui décrit l'objet.
       Le champ lmid prend une des valeurs suivantes :

       LM_ID_BASE       La table fait partie de l'espace de noms de départ.

       LM_ID_NEWLM      La table fait partie d'un nouvel espace de noms demandé avec dlmopen(3).

       cookie est un pointeur vers un identifiant pour un objet.  L'identifiant  est  fourni  aux
       appels  suivants  des  fonctions  de  la  bibliothèque  d'audit afin d'identifier l'objet.
       L'identifiant est initialisé pour pointer vers la table de l'objet, mais  la  bibliothèque
       d'audit peut changer l'identifiant pour une autre valeur qu'elle préférerait utiliser pour
       identifier l'objet.

       la_objopen() renvoie comme valeur de retour un masque de bits créé en  combinant  zéro  ou
       plusieurs  constantes  avec  un  OU  binaire,  ce  qui permet à la bibliothèque d'audit de
       sélectionner les objets à surveiller avec les fonctions la_symbind*() :

       LA_FLG_BINDTO    Surveiller les associations de symboles à cet objet.

       LA_FLG_BINDFROM  Surveiller les associations de symboles provenant de cet objet.

       Une valeur de retour de 0 pour la_objopen() indique qu'aucune association de symbole n'est
       à surveiller pour cet objet.

   la_objclose()

       unsigned int la_objclose(uintptr_t *cookie);

       L'éditeur  de  liens appelle cette fonction après l'exécution du code de finalisation pour
       l'objet (s'il y en a), et avant  que  l'objet  soit  déchargé.  Le  paramètre  cookie  est
       l'identifiant obtenu par l'appel précédent à la_objopen().

       Dans l'implémentation actuelle, la valeur renvoyée par la_objclose() est ignorée.

   la_preinit()

       void la_preinit(uintptr_t *cookie);

       L'éditeur  de  liens  appelle  cette  fonction  après que tous les objets partagés ont été
       chargés, avant que le contrôle soit donné à l'application (c'est-à-dire  avant  l'appel  à
       main()).  Notez  que  main()  peut  encore  charger  des objets dynamiquement en utilisant
       dlopen(3).

   la_symbind*()

       uintptr_t la_symbind32(Elf32_Sym *sym, unsigned int ndx,
                              uintptr_t *refcook, uintptr_t *defcook,
                              unsigned int *flags, const char *symname);
       uintptr_t la_symbind64(Elf64_Sym *sym, unsigned int ndx,
                              uintptr_t *refcook, uintptr_t *defcook,
                              unsigned int *flags, const char *symname);

       L'éditeur de liens appelle une de ces fonctions quand une association de symbole  survient
       entre deux objets partagés qui ont été marqués comme étant surveillés par la_objopen(). La
       fonction  la_symbind32()  est  utilisée  pour  les  plate-formes  32 bits ;  la   fonction
       la_symbind64() est utilisée pour les plate-formes 64 bits.

       Le  paramètre  sym  est un pointeur vers une structure qui fournit des informations sur le
       symbole en cours d'association. La définition de la  structure  se  trouve  dans  <elf.h>.
       Parmi  les  champs  de  la structure, st_value indique l'adresse à laquelle le symbole est
       associé.

       Le paramètre ndx fournit l'index du symbole dans la table des symboles de l'objet  partagé
       associé.

       Le  paramètre  refcook  identifie  l'objet  partagé  qui crée la référence du symbole ; il
       s'agit  du  même  identifiant  fourni  à  la   fonction   la_objopen()   qui   a   renvoyé
       LA_FLG_BINDFROM.  Le  paramètre  defcook  identifie  l'objet partagé qui défini le symbole
       référencé ; il s'agit du même identifiant fourni à la fonction la_objopen() qui a  renvoyé
       LA_FLG_BINDTO.

       Le paramètre symname pointe vers une chaîne contenant le nom du symbole.

       Le  paramètre  flags est un masque de bits qui peut à la fois fournir des informations sur
       le symbole et être utilisé pour modifier encore plus la surveillance de cette entrée de la
       PLT (Procedure Linkage Table). L'éditeur de liens dynamique peut fournir les bits suivants
       dans ce paramètre :

       LA_SYMB_DLSYM         L'association provient d'un appelle à dlsym(3).

       LA_SYMB_ALTVALUE      Un appel précédent à la_symbind*() a renvoyé une autre  valeur  pour
                             ce symbole.

       Par  défaut,  si  la  bibliothèque  d'audit  implémente  les  fonctions  la_pltenter()  et
       la_pltexit() (voir ci-dessous), alors ces fonctions  sont  appelées,  après  la_symbind(),
       pour  les  entrées  de  la  PLT,  à chaque fois que le symbole est référencé. Les drapeaux
       suivants peuvent être fournis en les  combinant  avec  un  OU  binaire  dans  *flags  pour
       modifier ce comportement par défaut :

       LA_SYMB_NOPLTENTER    Ne pas appeler la_pltenter() pour ce symbole.

       LA_SYMB_NOPLTEXIT     Ne pas appeler la_pltexit() pour ce symbole.

       La  valeur  de  retour  de  la_symbind32()  et  la_symbind64() est l'adresse à laquelle le
       contrôle doit être donné après que la fonction se termine. Si la bibliothèque  d'audit  ne
       fait  qu'observer  les  associations  de symboles, elle devrait renvoyer sym->st_name. Une
       valeur différente peut être renvoyée si la bibliothèque souhaite rediriger le  contrôle  à
       un autre endroit.

   la_pltenter()
       Le  nom  et  les  types  des  paramètres  de  cette  fonction  dépendent de la plate-forme
       matérielle. (la définition appropriée est fournie par <link.h>.) Voici la définition  pour
       la plate-forme x86-32 :

       Elf32_Addr la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx,
                        uintptr_t *refcook, uintptr_t *defcook,
                        La_i86_regs *regs, unsigned int *flags,
                        const char *symname, long int *framesizep);

       Cette  fonction  est appelée juste avant l'appel d'une entrée de la PLT, entre deux objets
       partagés ayant été marqués pour la notification des associations.

       Les paramètres sym, ndx, refcook, defcook et symname sont comme pour la_symbind*().

       Le paramètre regs pointe vers une structure  (définie  dans  <link.h>)  qui  contient  les
       valeurs des registres à utiliser pour l'appel à cette entrée de la PLT.

       Le  paramètre  flags pointe vers une masque de bits qui, comme pour la_symbind*(), fournit
       des informations pour cette entrée de la PLT et peut être utilisé pour modifier  la  façon
       dont elle sera surveillée ultérieurement.

       Le  paramètre  framesizep  pointe  vers  un  long int  qui  peut être utilisé pour définir
       explicitement la taille de la trame utilisée pour l'appel à cette entrée  de  la  PLT.  Si
       différents  appels à la_pltenter() pour ce symbole renvoient différentes valeurs, alors la
       valeur maximale renvoyée est utilisée. La fonction la_pltenter() n'est appelée que  si  ce
       pointeur est explicitement définit avec une valeur convenable.

       La valeur de retour de la_pltenter() est comme pour la_symbind*().

   la_pltexit()
       Le  nom  et  les  types  des  paramètres  de  cette  fonction  dépendent de la plate-forme
       matérielle. (la définition appropriée est fournie par <link.h>.) Voici la définition  pour
       la plate-forme x86-32 :

       unsigned int la_i86_gnu_pltexit(Elf32_Sym *sym, unsigned int ndx,
                        uintptr_t *refcook, uintptr_t *defcook,
                        const La_i86_regs *inregs, La_i86_retval *outregs,
                        const char *symname);

       Cette  fonction  est  appelée quand une entrée de la PLT, créée entre deux objets partagés
       ayant été marqués pour la notification des  associations,  se  termine.  La  fonction  est
       appelée juste avant que le contrôle soit rendu à l'appelant de l'entrée de la PLT.

       Les paramètres sym, ndx, refcook, defcook et symname sont comme pour la_symbind*().

       Le  paramètre  inregs  pointe  vers une structure (définie dans <link.h>) qui contient les
       valeurs des registres utilisés pour l'appel à cette entrée de la PLT. Le paramètre outregs
       pointe  vers  une  structure (définie dans <link.h>) qui contient les valeurs de retour de
       l'appel à cette entrée de la PLT. Ces valeurs peuvent être modifiées par l'appelant et les
       modifications seront visibles pour l'appelant de l'entrée de la PLT.

       Dans l'implémentation GNU actuelle, la valeur de retour de la_pltexit() est ignorée.

CONFORMITÉ

       Cette API n'est pas standard, mais est très proche de l'API Solaris, décrite dans le guide
       Solaris Linker and Libraries Guide, au chapitre Runtime Linker Auditing Interface.

NOTES

       Notez les différences suivantes avec l'API d'audit de l'éditeur de liens Solaris :

       *  L'interface Solaris la_objfilter() n'est pas prise en charge par l'implémentation GNU.

       *  Les fonctions Solaris la_symbind32() et la_pltexit() ne fournissent  pas  de  paramètre
          symname.

       *  La  fonction  Solaris  la_pltexit() ne fournit pas de paramètre inregs ou outregs (mais
          fournit une paramètre retval avec la valeur de retour de la fonction).

EXEMPLE

       #include <link.h>
       #include <stdio.h>

       unsigned int
       la_version(unsigned int version)
       {
           printf("la_version(): %d\n", version);

           return version;
       }

       char *
       la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag)
       {
           printf("la_objsearch(): name = %s; cookie = %x", name, cookie);
           printf("; flag = %s\n",
                   (flag == LA_SER_ORIG) ? "LA_SER_ORIG" :
                   (flag == LA_SER_LIBPATH) ? "LA_SER_LIBPATH" :
                   (flag == LA_SER_RUNPATH) ? "LA_SER_RUNPATH" :
                   (flag == LA_SER_DEFAULT) ? "LA_SER_DEFAULT" :
                   (flag == LA_SER_CONFIG) ? "LA_SER_CONFIG" :
                   (flag == LA_SER_SECURE) ? "LA_SER_SECURE" :
                   "???");

           return name;
       }

       void
       la_activity (uintptr_t *cookie, unsigned int flag)
       {
           printf("la_activity(): cookie = %x; flag = %s\n", cookie,
                   (flag == LA_ACT_CONSISTENT) ? "LA_ACT_CONSISTENT" :
                   (flag == LA_ACT_ADD) ? "LA_ACT_ADD" :
                   (flag == LA_ACT_DELETE) ? "LA_ACT_DELETE" :
                   "???");
       }

       unsigned int
       la_objopen(struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
       {
           printf("la_objopen(): loading \"%s\"; lmid = %s; cookie=%x\n",
                   map->l_name,
                   (lmid == LM_ID_BASE) ? "LM_ID_BASE" :
                   (lmid == LM_ID_NEWLM) ? "LM_ID_NEWLM" :
                   "???",
                   cookie);

           return LA_FLG_BINDTO | LA_FLG_BINDFROM;
       }

       unsigned int
       la_objclose (uintptr_t *cookie)
       {
           printf("la_objclose(): %x\n", cookie);

           return 0;
       }

       void
       la_preinit(uintptr_t *cookie)
       {
           printf("la_preinit(): %x\n", cookie);
       }

       uintptr_t
       la_symbind32(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
               uintptr_t *defcook, unsigned int *flags, const char *symname)
       {
           printf("la_symbind32(): symname = %s; sym->st_value = %p\n",
                   symname, sym->st_value);
           printf("        ndx = %d; flags = 0x%x", ndx, *flags);
           printf("; refcook = %x; defcook = %x\n", refcook, defcook);

           return sym->st_value;
       }

       uintptr_t
       la_symbind64(Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
               uintptr_t *defcook, unsigned int *flags, const char *symname)
       {
           printf("la_symbind64(): symname = %s; sym->st_value = %p\n",
                   symname, sym->st_value);
           printf("        ndx = %d; flags = 0x%x", ndx, *flags);
           printf("; refcook = %x; defcook = %x\n", refcook, defcook);

           return sym->st_value;
       }

       Elf32_Addr
       la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx,
               uintptr_t *refcook, uintptr_t *defcook, La_i86_regs *regs,
               unsigned int *flags, const char *symname, long int *framesizep)
       {
           printf("la_i86_gnu_pltenter(): %s (%p)\n", symname, sym->st_value);

           return sym->st_value;
       }

BOGUES

       Dans les versions de  la  glibc  jusqu'à  la  version 2.9  (inclue),  fournit  plus  d'une
       bibliothèque  d'audit  dans LD_AUDIT provoquait un crash à l'exécution. Cela a été corrigé
       dans la version 2.10.

VOIR AUSSI

       ldd(1), dlopen(3), ld.so(8), ldconfig(8)

COLOPHON

       Cette page fait partie de la publication 3.32 du projet man-pages Linux.  Une  description
       du  projet  et  des  instructions  pour  signaler  des  anomalies  peuvent être trouvées à
       l'adresse <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis   2010,   cette   traduction   est   maintenue   à   l'aide   de    l'outil    po4a
       <URL:http://po4a.alioth.debian.org/>  par  l'équipe  de  traduction francophone au sein du
       projet perkamon <URL:http://perkamon.alioth.debian.org/>.

       Nicolas François 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> ».