]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - lib/librtld_db/rtld_db.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / lib / librtld_db / rtld_db.h
1 /*
2  * Copyright (c) 2010 The FreeBSD Foundation 
3  * All rights reserved. 
4  * 
5  * This software was developed by Rui Paulo under sponsorship from the
6  * FreeBSD Foundation. 
7  *  
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions 
10  * are met: 
11  * 1. Redistributions of source code must retain the above copyright 
12  *    notice, this list of conditions and the following disclaimer. 
13  * 2. Redistributions in binary form must reproduce the above copyright 
14  *    notice, this list of conditions and the following disclaimer in the 
15  *    documentation and/or other materials provided with the distribution. 
16  * 
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
27  * SUCH DAMAGE. 
28  *
29  * $FreeBSD$
30  */ 
31
32 #ifndef _RTLD_DB_H_
33 #define _RTLD_DB_H_
34
35 #include <sys/param.h>
36 #include <sys/cdefs.h>
37 #include <sys/types.h>
38
39
40 #define RD_VERSION      1
41
42 typedef enum {
43         RD_OK,
44         RD_ERR,
45         RD_DBERR,
46         RD_NOCAPAB,
47         RD_NODYNAM,
48         RD_NOBASE,
49         RD_NOMAPS
50 } rd_err_e;
51
52 typedef struct rd_agent {
53         struct proc_handle *rda_php;
54         uintptr_t rda_dlactivity_addr;
55         uintptr_t rda_preinit_addr;
56         uintptr_t rda_postinit_addr;
57 } rd_agent_t;
58
59 typedef struct rd_loadobj {
60         uintptr_t       rdl_saddr;              /* start address */
61         uintptr_t       rdl_eaddr;              /* end address */
62         uint32_t        rdl_offset;
63         uint8_t         rdl_prot;
64 #define RD_RDL_R        0x01
65 #define RD_RDL_W        0x02
66 #define RD_RDL_X        0x04
67         enum {
68                 RDL_TYPE_NONE   = 0,
69                 RDL_TYPE_DEF,
70                 RDL_TYPE_VNODE,
71                 RDL_TYPE_SWAP,
72                 RDL_TYPE_DEV,
73                 /* XXX some types missing */
74                 RDL_TYPE_UNKNOWN = 255
75         } rdl_type;
76         unsigned char   rdl_path[PATH_MAX];
77 } rd_loadobj_t;
78
79 typedef enum {
80         RD_NONE = 0,
81         RD_PREINIT,
82         RD_POSTINIT,
83         RD_DLACTIVITY
84 } rd_event_e;
85
86 typedef enum {
87         RD_NOTIFY_BPT,
88         RD_NOTIFY_AUTOBPT,
89         RD_NOTIFY_SYSCALL
90 } rd_notify_e;
91
92 typedef struct rd_notify {
93         rd_notify_e type;
94         union {
95                 uintptr_t bptaddr;
96                 long      syscallno;
97         } u;
98 } rd_notify_t;
99
100 typedef enum {
101         RD_NOSTATE = 0,
102         RD_CONSISTENT,
103         RD_ADD,
104         RD_DELETE
105 } rd_state_e;
106
107 typedef struct rd_event_msg {
108         rd_event_e type;
109         union {
110                 rd_state_e state;
111         } u;
112 } rd_event_msg_t;
113
114 typedef enum {
115         RD_RESOLVE_NONE,
116         RD_RESOLVE_STEP,
117         RD_RESOLVE_TARGET,
118         RD_RESOLVE_TARGET_STEP
119 } rd_skip_e;
120
121 typedef struct rd_plt_info {
122         rd_skip_e pi_skip_method;
123         long      pi_nstep;
124         uintptr_t pi_target;
125         uintptr_t pi_baddr;
126         unsigned int pi_flags;
127 } rd_plt_info_t;
128
129 #define RD_FLG_PI_PLTBOUND      0x0001
130
131 __BEGIN_DECLS
132
133 struct proc_handle;
134 void            rd_delete(rd_agent_t *);
135 const char      *rd_errstr(rd_err_e);
136 rd_err_e        rd_event_addr(rd_agent_t *, rd_event_e, rd_notify_t *);
137 rd_err_e        rd_event_enable(rd_agent_t *, int);
138 rd_err_e        rd_event_getmsg(rd_agent_t *, rd_event_msg_t *);
139 rd_err_e        rd_init(int);
140 typedef int rl_iter_f(const rd_loadobj_t *, void *);
141 rd_err_e        rd_loadobj_iter(rd_agent_t *, rl_iter_f *, void *);
142 void            rd_log(const int);
143 rd_agent_t      *rd_new(struct proc_handle *);
144 rd_err_e        rd_objpad_enable(rd_agent_t *, size_t);
145 struct proc;
146 rd_err_e        rd_plt_resolution(rd_agent_t *, uintptr_t, struct proc *,
147                     uintptr_t, rd_plt_info_t *);
148 rd_err_e        rd_reset(rd_agent_t *);
149
150 __END_DECLS
151
152 #endif /* _RTLD_DB_H_ */