]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man7/rtld-audit.7
sock_diag.7: More minor fixes to Dmitry's patch
[thirdparty/man-pages.git] / man7 / rtld-audit.7
CommitLineData
d56bebb0
MK
1.\" Copyright (c) 2009 Linux Foundation, written by Michael Kerrisk
2.\" <mtk.manpages@gmail.com>
3.\"
93015253 4.\" %%%LICENSE_START(VERBATIM)
d56bebb0
MK
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.
8.\"
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.
13.\"
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
20.\" professionally.
21.\"
22.\" Formatted or processed versions of this manual, if unaccompanied by
23.\" the source, must acknowledge the copyright and authors of this work.
4b72fb64 24.\" %%%LICENSE_END
d56bebb0
MK
25.\"
26.\" 2009-01-12, mtk, Created
27.\"
6f3c74a8 28.TH RTLD-AUDIT 7 2015-12-05 "Linux" "Linux Programmer's Manual"
d56bebb0
MK
29.SH NAME
30rtld-audit \- auditing API for the dynamic linker
31.SH SYNOPSIS
86b91fdf 32.BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
d56bebb0
MK
33
34.B #include <link.h>
35.SH DESCRIPTION
36The GNU dynamic linker (run-time linker)
37provides an auditing API that allows an application
38to be notified when various dynamic linking events occur.
39This API is very similar to the auditing interface provided by the
40Solaris run-time linker.
41The necessary constants and prototypes are defined by including
42.IR <link.h> .
43
44To use this interface, the programmer creates a shared library
45that implements a standard set of function names.
46Not all of the functions need to be implemented: in most cases,
47if the programmer is not interested in a particular class of auditing event,
36dc0d7c 48then no implementation needs to be provided for the corresponding
d56bebb0
MK
49auditing function.
50
51To employ the auditing interface, the environment variable
52.BR LD_AUDIT
53must be defined to contain a colon-separated list of shared libraries,
54each of which can implement (parts of) the auditing API.
d56bebb0
MK
55When an auditable event occurs,
56the corresponding function is invoked in each library,
57in the order that the libraries are listed.
58.SS la_version()
59\&
60.nf
61.BI "unsigned int la_version(unsigned int " version );
62.fi
63.PP
64This is the only function that
65.I must
66be defined by an auditing library:
67it performs the initial handshake between the dynamic linker and
68the auditing library.
69When invoking this function, the dynamic linker passes, in
70.IR version ,
71the highest version of the auditing interface that the linker supports.
72If necessary, the auditing library can check that this version
73is sufficient for its requirements.
74
75As its function result,
76this function should return the version of the auditing interface
77that this auditing library expects to use (returning
78.I version
79is acceptable).
80If the returned value is 0,
81or a version that is greater than that supported by the dynamic linker,
82then the audit library is ignored.
83.SS la_objsearch()
84\&
85.nf
86.BI "char *la_objsearch(const char *" name ", uintptr_t *" cookie ,
87.BI " unsigned int " flag );
88.fi
89.PP
90The dynamic linker invokes this function to inform the auditing library
91that it is about to search for a shared object.
92The
93.I name
94argument is the filename or pathname that is to be searched for.
95.I cookie
96identifies the shared object that initiated the search.
97.I flag
98is set to one of the following values:
99.TP 17
100.B LA_SER_ORIG
101This is the original name that is being searched for.
102Typically, this name comes from an ELF
103.B DT_NEEDED
104entry, or is the
105.I filename
106argument given to
107.BR dlopen (3).
108.TP
109.B LA_SER_LIBPATH
110.I name
111was created using a directory specified in
112.BR LD_LIBRARY_PATH .
113.TP
114.B LA_SER_RUNPATH
115.I name
116was created using a directory specified in an ELF
117.B DT_RPATH
118or
119.B DT_RUNPATH
120list.
121.TP
122.B LA_SER_CONFIG
123.I name
124was found via the
125.BR ldconfig (8)
126cache
127.RI ( /etc/ld.so.cache ).
128.TP
129.B LA_SER_DEFAULT
130.I name
131was found via a search of one of the default directories.
132.TP
133.B LA_SER_SECURE
134.I name
135is specific to a secure object (unused on Linux).
136.PP
137As its function result,
138.BR la_objsearch ()
139returns the pathname that the dynamic linker should use
140for further processing.
141If NULL is returned, then this pathname is ignored for further processing.
142If this audit library simply intends to monitor search paths, then
143.I name
144should be returned.
145.SS la_activity()
146\&
147.nf
148.BI "void la_activity( uintptr_t *" cookie ", unsigned int "flag );
149.fi
150.PP
151The dynamic linker calls this function to inform the auditing library
152that link-map activity is occurring.
153.I cookie
154identifies the object at the head of the link map.
155When the dynamic linker invokes this function,
156.I flag
157is set to one of the following values:
158.TP 19
159.B LA_ACT_ADD
160New objects are being added to the link map.
161.TP
162.B LA_ACT_DELETE
163Objects are being removed from the link map.
164.TP
165.B LA_ACT_CONSISTENT
166Link-map activity has been completed: the map is once again consistent.
167.SS la_objopen()
168\&
169.nf
170.BI "unsigned int la_objopen(struct link_map *" map ", Lmid_t " lmid ,
171.BI " uintptr_t *" cookie );
172.fi
173.PP
174The dynamic linker calls this function when a new shared object is loaded.
175The
176.I map
177argument is a pointer to a link-map structure that describes the object.
178The
179.I lmid
180field has one of the following values
181.TP 17
182.B LM_ID_BASE
183Link map is part of the initial namespace.
184.TP
185.B LM_ID_NEWLM
186Link map is part of a new namespace requested via
187.BR dlmopen (3).
188.PP
189.I cookie
190is a pointer to an identifier for this object.
191The identifier is provided to later calls to functions
192in the auditing library in order to identify this object.
193This identifier is initialized to point to object's link map,
194but the audit library can change the identifier to some other value
195that it may prefer to use to identify the object.
196.PP
197As its return value,
198.BR la_objopen ()
199returns a bit mask created by ORing zero or more of the
200following constants,
201which allow the auditing library to select the objects to be monitored by
202.BR la_symbind* ():
203.TP 17
204.B LA_FLG_BINDTO
205Audit symbol bindings to this object.
206.TP
207.B LA_FLG_BINDFROM
208Audit symbol bindings from this object.
209.PP
210A return value of 0 from
211.BR la_objopen ()
212indicates that no symbol bindings should be audited for this object.
213.SS la_objclose()
214\&
215.nf
a6e08809 216.BI "unsigned int la_objclose(uintptr_t *" cookie );
d56bebb0
MK
217.fi
218.PP
219The dynamic linker invokes this function after any finalization
220code for the object has been executed,
221before the object is unloaded.
222The
223.I cookie
224argument is the identifier obtained from a previous invocation of
225.BR la_objopen ().
226
227In the current implementation, the value returned by
228.BR la_objclose ()
229is ignored.
230.SS la_preinit()
231\&
232.nf
233.BI "void la_preinit(uintptr_t *" cookie );
234.fi
235.PP
236The dynamic linker invokes this function after all shared objects
237have been loaded, before control is passed to the application
238(i.e., before calling
239.IR main ()).
240Note that
241.IR main ()
242may still later dynamically load objects using
243.BR dlopen (3).
244.SS la_symbind*()
245\&
246.nf
247.BI "uintptr_t la_symbind32(Elf32_Sym *" sym ", unsigned int " ndx ,
248.BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
249.BI " unsigned int *" flags ", const char *" symname );
250.BI "uintptr_t la_symbind64(Elf64_Sym *" sym ", unsigned int " ndx ,
251.BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
252.BI " unsigned int *" flags ", const char *" symname );
36dc0d7c 253.fi
d56bebb0
MK
254.PP
255The dynamic linker invokes one of these functions
256when a symbol binding occurs between two shared objects
257that have been marked for auditing notification by
258.BR la_objopen ().
259The
260.BR la_symbind32 ()
261function is employed on 32-bit platforms;
262the
263.BR la_symbind64 ()
264function is employed on 64-bit platforms.
265
266The
267.I sym
268argument is a pointer to a structure
269that provides information about the symbol being bound.
270The structure definition is shown in
271.IR <elf.h> .
272Among the fields of this structure,
273.I st_value
274indicates the address to which the symbol is bound.
275
276The
277.I ndx
278argument gives the index of the symbol in the symbol table
279of the bound shared object.
280
281The
282.I refcook
283argument identifies the shared object that is making the symbol reference;
284this is the same identifier that is provided to the
285.BR la_objopen ()
286function that returned
287.BR LA_FLG_BINDFROM .
288The
289.I defcook
290argument identifies the shared object that defines the referenced symbol;
291this is the same identifier that is provided to the
292.BR la_objopen ()
293function that returned
294.BR LA_FLG_BINDTO .
295
296The
297.I symname
298argument points a string containing the name of the symbol.
299
300The
301.I flags
302argument is a bit mask that both provides information about the symbol
303and can be used to modify further auditing of this
304PLT (Procedure Linkage Table) entry.
305The dynamic linker may supply the following bit values in this argument:
306.\" LA_SYMB_STRUCTCALL appears to be unused
307.TP 22
308.B LA_SYMB_DLSYM
309The binding resulted from a call to
310.BR dlsym (3).
311.TP
312.B LA_SYMB_ALTVALUE
313A previous
314.BR la_symbind* ()
315call returned an alternate value for this symbol.
316.PP
317By default, if the auditing library implements
318.BR la_pltenter ()
319and
320.BR la_pltexit ()
321functions (see below), then these functions are invoked, after
322.BR la_symbind (),
323for PLT entries, each time the symbol is referenced.
324.\" pltenter/pltexit are called for non-dynamically loaded libraries,
325.\" but don't seem to be called for dynamically loaded libs?
326.\" Is this the same on Solaris?
327The following flags can be ORed into
328.IR *flags
329to change this default behavior:
330.TP 22
331.B LA_SYMB_NOPLTENTER
332Don't call
333.BR la_pltenter ()
334for this symbol.
335.TP 22
336.B LA_SYMB_NOPLTEXIT
337Don't call
338.BR la_pltexit ()
339for this symbol.
340.PP
341The return value of
342.BR la_symbind32 ()
343and
344.BR la_symbind64 ()
345is the address to which control should be passed after the function returns.
346If the auditing library is simply monitoring symbol bindings,
347then it should return
d68a52c4 348.IR sym\->st_value .
d56bebb0
MK
349A different value may be returned if the library wishes to direct control
350to an alternate location.
351.SS la_pltenter()
352The precise name and argument types for this function
353depend on the hardware platform.
354(The appropriate definition is supplied by
355.IR <link.h> .)
356Here is the definition for x86-32:
357.nf
358
359.BI "Elf32_Addr la_i86_gnu_pltenter(Elf32_Sym *" sym ", unsigned int " ndx ,
360.BI " uintptr_t *" refcook ", uintptr_t *" defcook ,
361.BI " La_i86_regs *" regs ", unsigned int *" flags ,
362.BI " const char *" symname ", long int *" framesizep );
363.fi
364
365This function is invoked just before a PLT entry is called,
366between two shared objects that have been marked for binding notification.
367
368The
369.IR sym ,
370.IR ndx ,
371.IR refcook ,
372.IR defcook ,
373and
374.IR symname
375are as for
376.BR la_symbind* ().
377
378The
379.I regs
380argument points to a structure (defined in
381.IR <link.h> )
382containing the values of registers to be used for
383the call to this PLT entry.
384
385The
386.I flags
387argument points to a bit mask that conveys information about,