Man page - rtld-audit(7)

Packages contains this manual

Available languages:

en fr ru

Manual

RTLD-AUDIT

NOM
SYNOPSIS
DESCRIPTION
la_version()
la_objsearch()
la_activity()
la_objopen()
la_objclose()
la_preinit()
la_symbind*()
la_pltenter()
la_pltexit()
VERSIONS
STANDARDS
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

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

SYNOPSIS

#define _GNU_SOURCE /* See 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 );

This is the only function that must be defined by an auditing library: it performs the initial handshake between the dynamic linker and the auditing library. When invoking this function, the dynamic linker passes, in version , the highest version of the auditing interface that the linker supports.

A typical implementation of this function simply returns the constant LAV_CURRENT , which indicates the version of <link.h> that was used to build the audit module. If the dynamic linker does not support this version of the audit interface, it will refuse to activate this audit module. If the function returns zero, the dynamic linker also does not activate this audit module.

In order to enable backwards compatibility with older dynamic linkers, an audit module can examine the version argument and return an earlier version than LAV_CURRENT , assuming the module can adjust its implementation to match the requirements of the previous version of the audit interface. The la_version function should not return the value of version without further checks because it could correspond to an interface that does not match the <link.h> definitions used to build the audit module.

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_value . 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 * 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.

The framesizep argument points to a long int buffer that can be used to explicitly set the frame size used for the call to this PLT entry. If different la_pltenter () invocations for this symbol return different values, then the maximum returned value is used. The la_pltexit () function is called only if this buffer is explicitly set to a suitable value.

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.

VERSIONS

This API is very similar to the Solaris API described in the Solaris Linker and Libraries Guide , in the chapter Runtime Linker Auditing Interface .

STANDARDS

None.

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).

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.

EXEMPLES

#include <link.h>
#include <stdio.h>
unsigned int
la_version(unsigned int version)
{
printf("la_version(): version = %u; LAV_CURRENT = %u\n",
version, LAV_CURRENT);
return LAV_CURRENT;
}
char *
la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag)
{
printf("la_objsearch(): name = %s; cookie = %p", 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 = %p; 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=%p\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(): %p\n", cookie);
return 0;
}
void
la_preinit(uintptr_t *cookie)
{
printf("la_preinit(): %p\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 = %u; flags = %#x", ndx, *flags);
printf("; refcook = %p; defcook = %p\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 = %u; flags = %#x", ndx, *flags);
printf("; refcook = %p; defcook = %p\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 *framesizep)
{
printf("la_i86_gnu_pltenter(): %s (%p)\n", symname, sym->st_value);
return sym->st_value;
}

VOIR AUSSI

ldd (1), dlopen (3), ld.so (8), ldconfig (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> et David Prévot <david@tilapin.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 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 .