1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef __AUDIT_DOT_H
#define __AUDIT_DOT_H
#ifndef _ASM
#include <sys/types.h>
#include <rtld.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Define all auditing structures.
*
* A shared object may be a client of one or more audit libraries. Calls to an
* auditor are accompanied with cookies that identify an object being audited.
* These cookies are initialized to the link-map pointers of the object being
* audited, however the auditor is free to re-allocate these cookies, and thus
* associate their own data with each object being audited.
*
* With auditing version LAV_VERSION5, local auditors can provide la_preinit()
* and la_activity() routines, each of which should be passed a cookie that
* represents the link-map of the head of the associated link-map list. These
* cookies are maintained on the associated link-map list, using the lm_cookies
* alist. These cookies are created by _audit_add_head(), and dynamically
* retrieved by the _audit_preinit() and _audit_activity() routines.
*
* Having these cookies kept on the link-map list decouples these cookies from
* the Audit_client structure of the object being locally audited. In addition,
* this model ensures that multiple objects, undergoing local auditing from the
* same auditor, receive the same head link-map cookie.
*/
typedef struct {
Rt_map *ac_lmp; /* audit library identifier */
uintptr_t ac_cookie; /* cookie assigned to audit library */
Word ac_flags; /* and its associated flags */
} Audit_client;
#define FLG_AC_BINDTO 0x00001
#define FLG_AC_BINDFROM 0x00002
/*
* Each shared object being audited may provide a list of client structures
* and dynamic plts (one per auditor).
*/
struct audit_info {
uint_t ai_cnt; /* no. of clients */
Audit_client *ai_clients; /* array of client structures */
void *ai_dynplts; /* array of dynamic plts */
};
/*
* Define an Audit Descriptor - each audit object is added to this descriptor
* as an Audit Interface. There is one global audit descriptor - auditors,
* and a specific object my require its own - AUDITORS(lmp).
*/
struct audit_desc {
char *ad_name; /* originating audit names */
APlist *ad_list; /* audit objs Audit Interface list */
uint_t ad_cnt; /* no. of audit objs in this desc. */
uint_t ad_flags; /* audit capabilities found. See */
/* LML_TFLG_AUD_* flags */
};
/*
* Define an Audit List descriptor for each audit object.
*/
struct audit_list {
const char *al_libname; /* object name for diagnostics */
Rt_map *al_lmp; /* object link-map */
Grp_hdl *al_ghp; /* object handle */
uint_t al_flags; /* audit capabilities found */
uint_t (*al_version)(uint_t);
void (*al_preinit)(uintptr_t *);
char *(*al_objsearch)(const char *, uintptr_t *, uint_t);
uint_t (*al_objopen)(Link_map *, Lmid_t, uintptr_t *);
int (*al_objfilter)(uintptr_t *, const char *, uintptr_t *,
uint_t);
uint_t (*al_objclose)(uintptr_t *);
void (*al_activity)(uintptr_t *, uint_t);
#if defined(_ELF64)
uintptr_t (*al_pltenter)(Sym *, uint_t, uintptr_t *, uintptr_t *,
void *, uint_t *, const char *);
uintptr_t (*al_pltexit)(Sym *, uint_t, uintptr_t *, uintptr_t *,
uintptr_t, const char *);
uintptr_t (*al_symbind)(Sym *, uint_t, uintptr_t *,
uintptr_t *, uint_t *, const char *);
#else
uintptr_t (*al_pltenter)(Sym *, uint_t, uintptr_t *, uintptr_t *,
void *, uint_t *);
uintptr_t (*al_pltexit)(Sym *, uint_t, uintptr_t *, uintptr_t *,
uintptr_t);
uintptr_t (*al_symbind)(Sym *, uint_t, uintptr_t *,
uintptr_t *, uint_t *);
#endif /* _ELF64 */
uint_t al_vernum; /* object version */
};
/*
* Link-Edit audit functions
*/
extern int audit_setup(Rt_map *, Audit_desc *, uint_t, int *);
extern void audit_desc_cleanup(Rt_map *);
extern void audit_info_cleanup(Rt_map *);
extern int audit_objopen(Rt_map *, Rt_map *);
extern int audit_objfilter(Rt_map *, const char *, Rt_map *,
uint_t flags);
extern void audit_activity(Rt_map *, uint_t);
extern void audit_preinit(Rt_map *);
extern char *audit_objsearch(Rt_map *, const char *, uint_t);
extern void audit_objclose(Rt_map *, Rt_map *);
extern void _audit_objclose(APlist *, Rt_map *);
extern Addr audit_symbind(Rt_map *, Rt_map *, Sym *, uint_t,
Addr value, uint_t *);
extern Addr audit_pltenter(Rt_map *, Rt_map *, Sym *, uint_t,
void *, uint_t *);
extern Addr audit_pltexit(uintptr_t, Rt_map *, Rt_map *, Sym *,
uint_t);
extern uint_t audit_flags;
#endif /* _ASM */
/*
* Values for audit_flags. Intended to be the same as the LML equivalents
* but kept in a separate variable to simplify boot_elf.s coding.
*/
#define AF_PLTENTER 0x01 /* same as LML_AUD_PLTENTER */
#define AF_PLTEXIT 0x02 /* Same as LML_AUD_PLTEXIT */
#ifdef __cplusplus
}
#endif
#endif /* __AUDIT_DOT_H */
|