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: head/lib/librtld_db/rtld_db.h 265629 2014-05-08 03:26:25Z markj $ |
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 | 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_ */ |
153 | |