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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
/*-
* Copyright (c) 2007 John Birrell (jb@freebsd.org)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef __LIBDWARF_H_
#define __LIBDWARF_H_
#include <sys/param.h>
#include <sys/queue.h>
#include <stdio.h>
#include <gelf.h>
#include "dwarf.h"
#include "libdwarf.h"
#define DWARF_debug_abbrev 0
#define DWARF_debug_aranges 1
#define DWARF_debug_frame 2
#define DWARF_debug_info 3
#define DWARF_debug_line 4
#define DWARF_debug_pubnames 5
#define DWARF_eh_frame 6
#define DWARF_debug_macinfo 7
#define DWARF_debug_str 8
#define DWARF_debug_loc 9
#define DWARF_debug_pubtypes 10
#define DWARF_debug_ranges 11
#define DWARF_debug_static_func 12
#define DWARF_debug_static_vars 13
#define DWARF_debug_types 14
#define DWARF_debug_weaknames 15
#define DWARF_symtab 16
#define DWARF_strtab 17
#define DWARF_DEBUG_SNAMES 18
#define DWARF_DIE_HASH_SIZE 8191
#define DWARF_SET_ERROR(_e, _err) do { \
_e->err_error = _err; \
_e->elf_error = 0; \
_e->err_func = __func__; \
_e->err_line = __LINE__; \
_e->err_msg[0] = '\0'; \
} while (0)
#define DWARF_SET_ELF_ERROR(_e, _err) do { \
_e->err_error = DWARF_E_ELF; \
_e->elf_error = _err; \
_e->err_func = __func__; \
_e->err_line = __LINE__; \
_e->err_msg[0] = '\0'; \
} while (0)
struct _Dwarf_AttrValue {
uint64_t av_attrib; /* DW_AT_ */
uint64_t av_form; /* DW_FORM_ */
union {
uint64_t u64;
int64_t s64;
const char *s;
uint8_t *u8p;
} u[2]; /* Value. */
STAILQ_ENTRY(_Dwarf_AttrValue)
av_next; /* Next attribute value. */
};
struct _Dwarf_Die {
int die_level; /* Parent-child level. */
uint64_t die_offset; /* DIE offset in section. */
uint64_t die_abnum; /* Abbrev number. */
Dwarf_Abbrev die_a; /* Abbrev pointer. */
Dwarf_CU die_cu; /* Compilation unit pointer. */
const char *die_name; /* Ptr to the name string. */
STAILQ_HEAD(, _Dwarf_AttrValue)
die_attrval; /* List of attribute values. */
STAILQ_ENTRY(_Dwarf_Die)
die_next; /* Next die in list. */
STAILQ_ENTRY(_Dwarf_Die)
die_hash; /* Next die in hash table. */
};
struct _Dwarf_Attribute {
uint64_t at_attrib; /* DW_AT_ */
uint64_t at_form; /* DW_FORM_ */
STAILQ_ENTRY(_Dwarf_Attribute)
at_next; /* Next attribute. */
};
struct _Dwarf_Abbrev {
uint64_t a_entry; /* Abbrev entry. */
uint64_t a_tag; /* Tag: DW_TAG_ */
uint8_t a_children; /* DW_CHILDREN_no or DW_CHILDREN_yes */
STAILQ_HEAD(, _Dwarf_Attribute)
a_attrib; /* List of attributes. */
STAILQ_ENTRY(_Dwarf_Abbrev)
a_next; /* Next abbrev. */
};
struct _Dwarf_CU {
uint64_t cu_offset; /* Offset to the this compilation unit. */
uint32_t cu_length; /* Length of CU data. */
uint32_t cu_header_length;
/* Length of the CU header. */
uint16_t cu_version; /* DWARF version. */
uint64_t cu_abbrev_offset;
/* Offset into .debug_abbrev. */
uint8_t cu_pointer_size;
/* Number of bytes in pointer. */
uint64_t cu_next_offset;
/* Offset to the next compilation unit. */
STAILQ_HEAD(, _Dwarf_Abbrev)
cu_abbrev; /* List of abbrevs. */
STAILQ_HEAD(, _Dwarf_Die)
cu_die; /* List of dies. */
STAILQ_HEAD(, _Dwarf_Die)
cu_die_hash[DWARF_DIE_HASH_SIZE];
/* Hash of dies. */
STAILQ_ENTRY(_Dwarf_CU)
cu_next; /* Next compilation unit. */
};
typedef struct _Dwarf_section {
Elf_Scn *s_scn; /* Section pointer. */
GElf_Shdr s_shdr; /* Copy of the section header. */
char *s_sname; /* Ptr to the section name. */
uint32_t s_shnum; /* Section number. */
Elf_Data *s_data; /* Section data. */
} Dwarf_section;
struct _Dwarf_Debug {
Elf *dbg_elf; /* Ptr to the ELF handle. */
GElf_Ehdr dbg_ehdr; /* Copy of the ELF header. */
int dbg_elf_close; /* True if elf_end() required. */
int dbg_mode; /* Access mode. */
size_t dbg_stnum; /* Section header string table section number. */
int dbg_offsize; /* DWARF offset size. */
Dwarf_section dbg_s[DWARF_DEBUG_SNAMES];
/* Array of section information. */
STAILQ_HEAD(, _Dwarf_CU)
dbg_cu; /* List of compilation units. */
Dwarf_CU dbg_cu_current;
/* Ptr to the current compilation unit. */
STAILQ_HEAD(, _Dwarf_Func) dbg_func; /* List of functions */
};
struct _Dwarf_Func {
Dwarf_Die func_die;
const char *func_name;
Dwarf_Addr func_low_pc;
Dwarf_Addr func_high_pc;
int func_is_inlined;
/* inlined instance */
STAILQ_HEAD(, _Dwarf_Inlined_Func) func_inlined_instances;
STAILQ_ENTRY(_Dwarf_Func) func_next;
};
struct _Dwarf_Inlined_Func {
struct _Dwarf_Func *ifunc_origin;
Dwarf_Die ifunc_abstract;
Dwarf_Die ifunc_concrete;
Dwarf_Addr ifunc_low_pc;
Dwarf_Addr ifunc_high_pc;
STAILQ_ENTRY(_Dwarf_Inlined_Func) ifunc_next;
};
void dwarf_build_function_table(Dwarf_Debug dbg);
#ifdef DWARF_DEBUG
#include <assert.h>
#define DWARF_ASSERT(x) assert(x)
#else
#define DWARF_ASSERT(x)
#endif
#endif /* !__LIBDWARF_H_ */
|