1 .\" Copyright (c) 2009 Linux Foundation, written by Michael Kerrisk
2 .\" <mtk.manpages@gmail.com>
4 .\" %%%LICENSE_START(VERBATIM)
5 .\" Permission is granted to make and distribute verbatim copies of this
6 .\" manual provided the copyright notice and this permission notice are
7 .\" preserved on all copies.
9 .\" Permission is granted to copy and distribute modified versions of this
10 .\" manual under the conditions for verbatim copying, provided that the
11 .\" entire resulting derived work is distributed under the terms of a
12 .\" permission notice identical to this one.
14 .\" Since the Linux kernel and libraries are constantly changing, this
15 .\" manual page may be incorrect or out-of-date. The author(s) assume no
16 .\" responsibility for errors or omissions, or for damages resulting from
17 .\" the use of the information contained herein. The author(s) may not
18 .\" have taken the same level of care in the production of this manual,
19 .\" which is licensed free of charge, as they might when working
22 .\" Formatted or processed versions of this manual, if unaccompanied by
23 .\" the source, must acknowledge the copyright and authors of this work.
26 .\" 2009-01-12, mtk, Created
28 .TH RTLD-AUDIT 7 2020-11-01 "Linux" "Linux Programmer's Manual"
30 rtld-audit \- auditing API for the dynamic linker
33 .BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
37 The GNU dynamic linker (run-time linker)
38 provides an auditing API that allows an application
39 to be notified when various dynamic linking events occur.
40 This API is very similar to the auditing interface provided by the
41 Solaris run-time linker.
42 The necessary constants and prototypes are defined by including
45 To use this interface, the programmer creates a shared library
46 that implements a standard set of function names.
47 Not all of the functions need to be implemented: in most cases,
48 if the programmer is not interested in a particular class of auditing event,
49 then no implementation needs to be provided for the corresponding
52 To employ the auditing interface, the environment variable
54 must be defined to contain a colon-separated list of shared libraries,
55 each of which can implement (parts of) the auditing API.
56 When an auditable event occurs,
57 the corresponding function is invoked in each library,
58 in the order that the libraries are listed.
62 .BI "unsigned int la_version(unsigned int " version );
65 This is the only function that
67 be defined by an auditing library:
68 it performs the initial handshake between the dynamic linker and
70 When invoking this function, the dynamic linker passes, in
72 the highest version of the auditing interface that the linker supports.
74 A typical implementation of this function simply returns the constant
76 which indicates the version of
78 that was used to build the audit module.
79 If the dynamic linker does
80 not support this version of the audit interface, it will refuse to
81 activate this audit module.
82 If the function returns zero, the dynamic
83 linker also does not activate this audit module.
85 In order to enable backwards compatibility with older dynamic linkers,
86 an audit module can examine the
88 argument and return an earlier version than
90 assuming the module can adjust its implementation to match the
91 requirements of the previous version of the audit interface.
94 function should not return the value of
96 without further checks because it could correspond to an interface
97 that does not match the
99 definitions used to build the audit module.
103 .BI "char *la_objsearch(const char *" name ", uintptr_t *" cookie ,
104 .BI " unsigned int " flag );
107 The dynamic linker invokes this function to inform the auditing library
108 that it is about to search for a shared object.
111 argument is the filename or pathname that is to be searched for.
113 identifies the shared object that initiated the search.
115 is set to one of the following values:
118 This is the original name that is being searched for.
119 Typically, this name comes from an ELF
128 was created using a directory specified in
129 .BR LD_LIBRARY_PATH .
133 was created using a directory specified in an ELF
144 .RI ( /etc/ld.so.cache ).
148 was found via a search of one of the default directories.
152 is specific to a secure object (unused on Linux).
154 As its function result,
156 returns the pathname that the dynamic linker should use
157 for further processing.
158 If NULL is returned, then this pathname is ignored for further processing.
159 If this audit library simply intends to monitor search paths, then
165 .BI "void la_activity( uintptr_t *" cookie ", unsigned int "flag );
168 The dynamic linker calls this function to inform the auditing library
169 that link-map activity is occurring.
171 identifies the object at the head of the link map.
172 When the dynamic linker invokes this function,
174 is set to one of the following values:
177 New objects are being added to the link map.
180 Objects are being removed from the link map.
183 Link-map activity has been completed: the map is once again consistent.
187 .BI "unsigned int la_objopen(struct link_map *" map ", Lmid_t " lmid ,
188 .BI " uintptr_t *" cookie );
191 The dynamic linker calls this function when a new shared object is loaded.
194 argument is a pointer to a link-map structure that describes the object.
197 field has one of the following values
200 Link map is part of the initial namespace.
203 Link map is part of a new namespace requested via
207 is a pointer to an identifier for this object.
208 The identifier is provided to later calls to functions
209 in the auditing library in order to identify this object.
210 This identifier is initialized to point to object's link map,
211 but the audit library can change the identifier to some other value
212 that it may prefer to use to identify the object.
216 returns a bit mask created by ORing zero or more of the
218 which allow the auditing library to select the objects to be monitored by
222 Audit symbol bindings to this object.
225 Audit symbol bindings from this object.
227 A return value of 0 from
229 indicates that no symbol bindings should be audited for this object.
233 .BI "unsigned int la_objclose(uintptr_t *" cookie );
236 The dynamic linker invokes this function after any finalization
237 code for the object has been executed,
238 before the object is unloaded.
241 argument is the identifier obtained from a previous invocation of
244 In the current implementation, the value returned by
250 .BI "void la_preinit(uintptr_t *" cookie );
253 The dynamic linker invokes this function after all shared objects
254 have been loaded, before control is passed to the application
255 (i.e., before calling
259 may still later dynamically load objects using
264 .BI "uintptr_t la_symbind32(Elf32_Sym *" sym ", unsigned int " ndx ,
265 .BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
266 .BI " unsigned int *" flags ", const char *" symname );
267 .BI "uintptr_t la_symbind64(Elf64_Sym *" sym ", unsigned int " ndx ,
268 .BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
269 .BI " unsigned int *" flags ", const char *" symname );
272 The dynamic linker invokes one of these functions
273 when a symbol binding occurs between two shared objects
274 that have been marked for auditing notification by
278 function is employed on 32-bit platforms;
281 function is employed on 64-bit platforms.
285 argument is a pointer to a structure
286 that provides information about the symbol being bound.
287 The structure definition is shown in
289 Among the fields of this structure,
291 indicates the address to which the symbol is bound.
295 argument gives the index of the symbol in the symbol table
296 of the bound shared object.
300 argument identifies the shared object that is making the symbol reference;
301 this is the same identifier that is provided to the
303 function that returned
304 .BR LA_FLG_BINDFROM .
307 argument identifies the shared object that defines the referenced symbol;
308 this is the same identifier that is provided to the
310 function that returned
315 argument points a string containing the name of the symbol.
319 argument is a bit mask that both provides information about the symbol
320 and can be used to modify further auditing of this
321 PLT (Procedure Linkage Table) entry.
322 The dynamic linker may supply the following bit values in this argument:
323 .\" LA_SYMB_STRUCTCALL appears to be unused
326 The binding resulted from a call to
332 call returned an alternate value for this symbol.
334 By default, if the auditing library implements
338 functions (see below), then these functions are invoked, after
340 for PLT entries, each time the symbol is referenced.
341 .\" pltenter/pltexit are called for non-dynamically loaded libraries,
342 .\" but don't seem to be called for dynamically loaded libs?
343 .\" Is this the same on Solaris?
344 The following flags can be ORed into
346 to change this default behavior:
348 .B LA_SYMB_NOPLTENTER
362 is the address to which control should be passed after the function returns.
363 If the auditing library is simply monitoring symbol bindings,
364 then it should return
366 A different value may be returned if the library wishes to direct control
367 to an alternate location.
369 The precise name and argument types for this function
370 depend on the hardware platform.
371 (The appropriate definition is supplied by
373 Here is the definition for x86-32:
376 .BI "Elf32_Addr la_i86_gnu_pltenter(Elf32_Sym *" sym ", unsigned int " ndx ,
377 .BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
378 .BI " La_i86_regs *" regs ", unsigned int *" flags ,
379 .BI " const char *" symname ", long *" framesizep );
382 This function is invoked just before a PLT entry is called,
383 between two shared objects that have been marked for binding notification.
397 argument points to a structure (defined in
399 containing the values of registers to be used for
400 the call to this PLT entry.
404 argument points to a bit mask that conveys information about,
405 and can be used to modify subsequent auditing of, this PLT entry, as for
408 .\" FIXME . Is the following correct?
413 buffer that can be used to explicitly set the frame size
414 used for the call to this PLT entry.
417 invocations for this symbol return different values,
418 then the maximum returned value is used.
421 function is called only if this buffer is
422 explicitly set to a suitable value.
429 The precise name and argument types for this function
430 depend on the hardware platform.
431 (The appropriate definition is supplied by
433 Here is the definition for x86-32:
436 .BI "unsigned int la_i86_gnu_pltexit(Elf32_Sym *" sym ", unsigned int " ndx ,
437 .BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
438 .BI " const La_i86_regs *" inregs ", La_i86_retval *" outregs ,
439 .BI " const char *" symname );
442 This function is called when a PLT entry,
443 made between two shared objects that have been marked
444 for binding notification, returns.
445 The function is called just before control returns to the caller
460 argument points to a structure (defined in
462 containing the values of registers used for the call to this PLT entry.
465 argument points to a structure (defined in
467 containing return values for the call to this PLT entry.
468 These values can be modified by the caller,
469 and the changes will be visible to the caller of the PLT entry.
471 In the current GNU implementation, the return value of
474 .\" This differs from Solaris, where an audit library that monitors
475 .\" symbol binding should return the value of the 'retval' argument
476 .\" (not provided by GNU, but equivalent to returning outregs->lrv_eax
477 .\" on (say) x86-32).
479 This API is nonstandard, but very similar to the Solaris API,
480 described in the Solaris
481 .IR "Linker and Libraries Guide" ,
483 .IR "Runtime Linker Auditing Interface" .
485 Note the following differences from the Solaris dynamic linker
490 interface is not supported by the GNU implementation.
496 functions do not provide a
502 function does not provide
506 arguments (but does provide a
508 argument with the function return value).
510 In glibc versions up to and include 2.9,
511 specifying more than one audit library in
513 results in a run-time crash.
514 This is reportedly fixed in glibc 2.10.
515 .\" FIXME . Specifying multiple audit libraries doesn't work on GNU.
516 .\" My simple tests on Solaris work okay, but not on Linux -- mtk, Jan 2009
517 .\" glibc bug filed: http://sourceware.org/bugzilla/show_bug.cgi?id=9733
518 .\" Reportedly, this is fixed on 16 Mar 2009 (i.e., for glibc 2.10)
525 la_version(unsigned int version)
527 printf("la_version(): version = %u; LAV_CURRENT = %u\en",
528 version, LAV_CURRENT);
534 la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag)
536 printf("la_objsearch(): name = %s; cookie = %p", name, cookie);
537 printf("; flag = %s\en",
538 (flag == LA_SER_ORIG) ? "LA_SER_ORIG" :
539 (flag == LA_SER_LIBPATH) ? "LA_SER_LIBPATH" :
540 (flag == LA_SER_RUNPATH) ? "LA_SER_RUNPATH" :
541 (flag == LA_SER_DEFAULT) ? "LA_SER_DEFAULT" :
542 (flag == LA_SER_CONFIG) ? "LA_SER_CONFIG" :
543 (flag == LA_SER_SECURE) ? "LA_SER_SECURE" :
550 la_activity (uintptr_t *cookie, unsigned int flag)
552 printf("la_activity(): cookie = %p; flag = %s\en", cookie,
553 (flag == LA_ACT_CONSISTENT) ? "LA_ACT_CONSISTENT" :
554 (flag == LA_ACT_ADD) ? "LA_ACT_ADD" :
555 (flag == LA_ACT_DELETE) ? "LA_ACT_DELETE" :
560 la_objopen(struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
562 printf("la_objopen(): loading \e"%s\e"; lmid = %s; cookie=%p\en",
564 (lmid == LM_ID_BASE) ? "LM_ID_BASE" :
565 (lmid == LM_ID_NEWLM) ? "LM_ID_NEWLM" :
569 return LA_FLG_BINDTO | LA_FLG_BINDFROM;
573 la_objclose (uintptr_t *cookie)
575 printf("la_objclose(): %p\en", cookie);
581 la_preinit(uintptr_t *cookie)
583 printf("la_preinit(): %p\en", cookie);
587 la_symbind32(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
588 uintptr_t *defcook, unsigned int *flags, const char *symname)
590 printf("la_symbind32(): symname = %s; sym\->st_value = %p\en",
591 symname, sym\->st_value);
592 printf(" ndx = %u; flags = %#x", ndx, *flags);
593 printf("; refcook = %p; defcook = %p\en", refcook, defcook);
595 return sym\->st_value;
599 la_symbind64(Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
600 uintptr_t *defcook, unsigned int *flags, const char *symname)
602 printf("la_symbind64(): symname = %s; sym\->st_value = %p\en",
603 symname, sym\->st_value);
604 printf(" ndx = %u; flags = %#x", ndx, *flags);
605 printf("; refcook = %p; defcook = %p\en", refcook, defcook);
607 return sym\->st_value;
611 la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx,
612 uintptr_t *refcook, uintptr_t *defcook, La_i86_regs *regs,
613 unsigned int *flags, const char *symname, long *framesizep)
615 printf("la_i86_gnu_pltenter(): %s (%p)\en", symname, sym\->st_value);
617 return sym\->st_value;