rdwarf 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +28 -0
- data/README.md +39 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/ext/rdwarf/depend +5 -0
- data/ext/rdwarf/extconf.rb +29 -0
- data/ext/rdwarf/libdwarf/CHANGES +102 -0
- data/ext/rdwarf/libdwarf/CODINGSTYLE +71 -0
- data/ext/rdwarf/libdwarf/COPYING +28 -0
- data/ext/rdwarf/libdwarf/ChangeLog +619 -0
- data/ext/rdwarf/libdwarf/ChangeLog2006 +835 -0
- data/ext/rdwarf/libdwarf/ChangeLog2007 +217 -0
- data/ext/rdwarf/libdwarf/ChangeLog2008 +263 -0
- data/ext/rdwarf/libdwarf/ChangeLog2009 +348 -0
- data/ext/rdwarf/libdwarf/ChangeLog2010 +175 -0
- data/ext/rdwarf/libdwarf/ChangeLog2011 +297 -0
- data/ext/rdwarf/libdwarf/ChangeLog2012 +131 -0
- data/ext/rdwarf/libdwarf/ChangeLog2013 +238 -0
- data/ext/rdwarf/libdwarf/ChangeLog2014 +399 -0
- data/ext/rdwarf/libdwarf/LGPL.txt +504 -0
- data/ext/rdwarf/libdwarf/LIBDWARFCOPYRIGHT +40 -0
- data/ext/rdwarf/libdwarf/Makefile.in +220 -0
- data/ext/rdwarf/libdwarf/NEWS +535 -0
- data/ext/rdwarf/libdwarf/README +235 -0
- data/ext/rdwarf/libdwarf/checkexamples.c +1179 -0
- data/ext/rdwarf/libdwarf/cmplrs/dwarf_addr_finder.h +55 -0
- data/ext/rdwarf/libdwarf/common.c +62 -0
- data/ext/rdwarf/libdwarf/common.h +38 -0
- data/ext/rdwarf/libdwarf/config.h.in +146 -0
- data/ext/rdwarf/libdwarf/configure +5581 -0
- data/ext/rdwarf/libdwarf/configure.in +167 -0
- data/ext/rdwarf/libdwarf/dw-linetableheader.txt +39 -0
- data/ext/rdwarf/libdwarf/dwarf.h +1342 -0
- data/ext/rdwarf/libdwarf/dwarf_abbrev.c +291 -0
- data/ext/rdwarf/libdwarf/dwarf_abbrev.h +45 -0
- data/ext/rdwarf/libdwarf/dwarf_addr_finder.c +676 -0
- data/ext/rdwarf/libdwarf/dwarf_alloc.c +685 -0
- data/ext/rdwarf/libdwarf/dwarf_alloc.h +38 -0
- data/ext/rdwarf/libdwarf/dwarf_arange.c +595 -0
- data/ext/rdwarf/libdwarf/dwarf_arange.h +62 -0
- data/ext/rdwarf/libdwarf/dwarf_base_types.h +157 -0
- data/ext/rdwarf/libdwarf/dwarf_die_deliv.c +1802 -0
- data/ext/rdwarf/libdwarf/dwarf_die_deliv.h +46 -0
- data/ext/rdwarf/libdwarf/dwarf_elf_access.c +1348 -0
- data/ext/rdwarf/libdwarf/dwarf_elf_access.h +46 -0
- data/ext/rdwarf/libdwarf/dwarf_error.c +492 -0
- data/ext/rdwarf/libdwarf/dwarf_error.h +53 -0
- data/ext/rdwarf/libdwarf/dwarf_form.c +1302 -0
- data/ext/rdwarf/libdwarf/dwarf_frame.c +2454 -0
- data/ext/rdwarf/libdwarf/dwarf_frame.h +418 -0
- data/ext/rdwarf/libdwarf/dwarf_frame2.c +1533 -0
- data/ext/rdwarf/libdwarf/dwarf_frame3.c +282 -0
- data/ext/rdwarf/libdwarf/dwarf_funcs.c +123 -0
- data/ext/rdwarf/libdwarf/dwarf_funcs.h +33 -0
- data/ext/rdwarf/libdwarf/dwarf_gdbindex.c +520 -0
- data/ext/rdwarf/libdwarf/dwarf_gdbindex.h +97 -0
- data/ext/rdwarf/libdwarf/dwarf_global.c +612 -0
- data/ext/rdwarf/libdwarf/dwarf_global.h +117 -0
- data/ext/rdwarf/libdwarf/dwarf_harmless.c +228 -0
- data/ext/rdwarf/libdwarf/dwarf_harmless.h +31 -0
- data/ext/rdwarf/libdwarf/dwarf_incl.h +61 -0
- data/ext/rdwarf/libdwarf/dwarf_init_finish.c +1263 -0
- data/ext/rdwarf/libdwarf/dwarf_leb.c +159 -0
- data/ext/rdwarf/libdwarf/dwarf_line.c +1822 -0
- data/ext/rdwarf/libdwarf/dwarf_line.h +446 -0
- data/ext/rdwarf/libdwarf/dwarf_line2.c +98 -0
- data/ext/rdwarf/libdwarf/dwarf_line_table_reader_common.c +1583 -0
- data/ext/rdwarf/libdwarf/dwarf_loc.c +1525 -0
- data/ext/rdwarf/libdwarf/dwarf_loc.h +149 -0
- data/ext/rdwarf/libdwarf/dwarf_loc2.c +833 -0
- data/ext/rdwarf/libdwarf/dwarf_macro.c +479 -0
- data/ext/rdwarf/libdwarf/dwarf_macro.h +35 -0
- data/ext/rdwarf/libdwarf/dwarf_opaque.h +778 -0
- data/ext/rdwarf/libdwarf/dwarf_original_elf_init.c +219 -0
- data/ext/rdwarf/libdwarf/dwarf_print_lines.c +631 -0
- data/ext/rdwarf/libdwarf/dwarf_pubtypes.c +132 -0
- data/ext/rdwarf/libdwarf/dwarf_query.c +1594 -0
- data/ext/rdwarf/libdwarf/dwarf_ranges.c +194 -0
- data/ext/rdwarf/libdwarf/dwarf_reloc_arm.h +308 -0
- data/ext/rdwarf/libdwarf/dwarf_reloc_mips.h +117 -0
- data/ext/rdwarf/libdwarf/dwarf_reloc_ppc.h +242 -0
- data/ext/rdwarf/libdwarf/dwarf_reloc_ppc64.h +272 -0
- data/ext/rdwarf/libdwarf/dwarf_reloc_x86_64.h +127 -0
- data/ext/rdwarf/libdwarf/dwarf_sort_line.c +665 -0
- data/ext/rdwarf/libdwarf/dwarf_string.c +82 -0
- data/ext/rdwarf/libdwarf/dwarf_stubs.c +38 -0
- data/ext/rdwarf/libdwarf/dwarf_tied.c +423 -0
- data/ext/rdwarf/libdwarf/dwarf_tsearch.h +125 -0
- data/ext/rdwarf/libdwarf/dwarf_tsearchhash.c +675 -0
- data/ext/rdwarf/libdwarf/dwarf_types.c +121 -0
- data/ext/rdwarf/libdwarf/dwarf_types.h +32 -0
- data/ext/rdwarf/libdwarf/dwarf_util.c +913 -0
- data/ext/rdwarf/libdwarf/dwarf_util.h +324 -0
- data/ext/rdwarf/libdwarf/dwarf_vars.c +125 -0
- data/ext/rdwarf/libdwarf/dwarf_vars.h +29 -0
- data/ext/rdwarf/libdwarf/dwarf_weaks.c +123 -0
- data/ext/rdwarf/libdwarf/dwarf_weaks.h +29 -0
- data/ext/rdwarf/libdwarf/dwarf_xu_index.c +579 -0
- data/ext/rdwarf/libdwarf/dwarf_xu_index.h +68 -0
- data/ext/rdwarf/libdwarf/dwgetopt.c +181 -0
- data/ext/rdwarf/libdwarf/dwgetopt.h +51 -0
- data/ext/rdwarf/libdwarf/gennames.c +531 -0
- data/ext/rdwarf/libdwarf/install.sh +119 -0
- data/ext/rdwarf/libdwarf/libdwarf.h.in +3746 -0
- data/ext/rdwarf/libdwarf/libdwarf2.1.mm +9805 -0
- data/ext/rdwarf/libdwarf/libdwarf2.1.pdf +0 -0
- data/ext/rdwarf/libdwarf/libdwarf2p.1.mm +2807 -0
- data/ext/rdwarf/libdwarf/libdwarf2p.1.pdf +0 -0
- data/ext/rdwarf/libdwarf/libdwarfdefs.h +81 -0
- data/ext/rdwarf/libdwarf/malloc_check.c +327 -0
- data/ext/rdwarf/libdwarf/malloc_check.h +52 -0
- data/ext/rdwarf/libdwarf/mips_extensions.mm +1266 -0
- data/ext/rdwarf/libdwarf/mips_extensions.pdf +0 -0
- data/ext/rdwarf/libdwarf/pro_alloc.c +179 -0
- data/ext/rdwarf/libdwarf/pro_alloc.h +33 -0
- data/ext/rdwarf/libdwarf/pro_arange.c +310 -0
- data/ext/rdwarf/libdwarf/pro_arange.h +51 -0
- data/ext/rdwarf/libdwarf/pro_die.c +431 -0
- data/ext/rdwarf/libdwarf/pro_die.h +59 -0
- data/ext/rdwarf/libdwarf/pro_encode_nm.c +108 -0
- data/ext/rdwarf/libdwarf/pro_encode_nm.h +39 -0
- data/ext/rdwarf/libdwarf/pro_error.c +96 -0
- data/ext/rdwarf/libdwarf/pro_error.h +43 -0
- data/ext/rdwarf/libdwarf/pro_expr.c +575 -0
- data/ext/rdwarf/libdwarf/pro_expr.h +36 -0
- data/ext/rdwarf/libdwarf/pro_finish.c +45 -0
- data/ext/rdwarf/libdwarf/pro_forms.c +1271 -0
- data/ext/rdwarf/libdwarf/pro_frame.c +572 -0
- data/ext/rdwarf/libdwarf/pro_frame.h +120 -0
- data/ext/rdwarf/libdwarf/pro_funcs.c +50 -0
- data/ext/rdwarf/libdwarf/pro_incl.h +91 -0
- data/ext/rdwarf/libdwarf/pro_init.c +327 -0
- data/ext/rdwarf/libdwarf/pro_line.c +373 -0
- data/ext/rdwarf/libdwarf/pro_line.h +112 -0
- data/ext/rdwarf/libdwarf/pro_macinfo.c +457 -0
- data/ext/rdwarf/libdwarf/pro_macinfo.h +31 -0
- data/ext/rdwarf/libdwarf/pro_opaque.h +513 -0
- data/ext/rdwarf/libdwarf/pro_pubnames.c +60 -0
- data/ext/rdwarf/libdwarf/pro_reloc.c +253 -0
- data/ext/rdwarf/libdwarf/pro_reloc.h +38 -0
- data/ext/rdwarf/libdwarf/pro_reloc_stream.c +256 -0
- data/ext/rdwarf/libdwarf/pro_reloc_stream.h +52 -0
- data/ext/rdwarf/libdwarf/pro_reloc_symbolic.c +245 -0
- data/ext/rdwarf/libdwarf/pro_reloc_symbolic.h +45 -0
- data/ext/rdwarf/libdwarf/pro_section.c +2233 -0
- data/ext/rdwarf/libdwarf/pro_section.h +100 -0
- data/ext/rdwarf/libdwarf/pro_types.c +274 -0
- data/ext/rdwarf/libdwarf/pro_types.h +34 -0
- data/ext/rdwarf/libdwarf/pro_util.h +38 -0
- data/ext/rdwarf/libdwarf/pro_vars.c +52 -0
- data/ext/rdwarf/libdwarf/pro_weaks.c +51 -0
- data/ext/rdwarf/rdwarf.c +765 -0
- data/ext/rdwarf/rdwarf.h +52 -0
- data/ext/rdwarf/rdwarf_names_gen.rb +109 -0
- data/lib/rdwarf.rb +181 -0
- data/lib/rdwarf/version.rb +3 -0
- data/rdwarf.gemspec +30 -0
- metadata +251 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
|
|
4
|
+
Portions Copyright (C) 2009-2011 David Anderson. All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
This program is free software; you can redistribute it and/or modify it
|
|
7
|
+
under the terms of version 2.1 of the GNU Lesser General Public License
|
|
8
|
+
as published by the Free Software Foundation.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it would be useful, but
|
|
11
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
13
|
+
|
|
14
|
+
Further, this software is distributed without any warranty that it is
|
|
15
|
+
free of the rightful claim of any third person regarding infringement
|
|
16
|
+
or the like. Any license provided herein, whether implied or
|
|
17
|
+
otherwise, applies only to this software file. Patent licenses, if
|
|
18
|
+
any, provided herein do not apply to combinations of this program with
|
|
19
|
+
other software, or any other product whatsoever.
|
|
20
|
+
|
|
21
|
+
You should have received a copy of the GNU Lesser General Public
|
|
22
|
+
License along with this program; if not, write the Free Software
|
|
23
|
+
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
|
|
24
|
+
USA.
|
|
25
|
+
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#include "config.h"
|
|
29
|
+
#include "dwarf_incl.h"
|
|
30
|
+
#include <stdio.h>
|
|
31
|
+
#include <stdlib.h>
|
|
32
|
+
#include "dwarf_frame.h"
|
|
33
|
+
#include "dwarf_arange.h" /* using Arange as a way to build a list */
|
|
34
|
+
|
|
35
|
+
/* Used by rqs (an IRIX application).
|
|
36
|
+
Not needed except for that one application.
|
|
37
|
+
Should be moved to its own source file since
|
|
38
|
+
it is so rarely needed.
|
|
39
|
+
Returns DW_DLV_OK if returns the arrays.
|
|
40
|
+
Returns DW_DLV_NO_ENTRY if no section. ?? (How do I tell?)
|
|
41
|
+
Returns DW_DLV_ERROR if there is an error.
|
|
42
|
+
|
|
43
|
+
Uses DW_FRAME_CFA_COL because IRIX is only DWARF2
|
|
44
|
+
and that is what IRIX compilers and compatible
|
|
45
|
+
compilers support on IRIX.
|
|
46
|
+
*/
|
|
47
|
+
int
|
|
48
|
+
_dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist,
|
|
49
|
+
Dwarf_Off ** offsetlist,
|
|
50
|
+
Dwarf_Signed * returncount,
|
|
51
|
+
Dwarf_Error * err)
|
|
52
|
+
{
|
|
53
|
+
int retval = DW_DLV_OK;
|
|
54
|
+
int res = DW_DLV_ERROR;
|
|
55
|
+
Dwarf_Cie *cie_data = 0;
|
|
56
|
+
Dwarf_Signed cie_count = 0;
|
|
57
|
+
Dwarf_Fde *fde_data = 0;
|
|
58
|
+
Dwarf_Signed fde_count = 0;
|
|
59
|
+
Dwarf_Signed i = 0;
|
|
60
|
+
Dwarf_Unsigned u = 0;
|
|
61
|
+
Dwarf_Frame_Op *frame_inst = 0;
|
|
62
|
+
Dwarf_Fde fdep = 0;
|
|
63
|
+
Dwarf_Cie ciep = 0;
|
|
64
|
+
Dwarf_Chain curr_chain = 0;
|
|
65
|
+
Dwarf_Chain head_chain = 0;
|
|
66
|
+
Dwarf_Chain prev_chain = 0;
|
|
67
|
+
Dwarf_Arange arange = 0;
|
|
68
|
+
Dwarf_Unsigned arange_count = 0;
|
|
69
|
+
Dwarf_Addr *arange_addrs = 0;
|
|
70
|
+
Dwarf_Off *arange_offsets = 0;
|
|
71
|
+
|
|
72
|
+
res = dwarf_get_fde_list(dbg, &cie_data, &cie_count,
|
|
73
|
+
&fde_data, &fde_count, err);
|
|
74
|
+
if (res != DW_DLV_OK) {
|
|
75
|
+
return res;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
res = _dwarf_load_section(dbg, &dbg->de_debug_frame, err);
|
|
79
|
+
if (res != DW_DLV_OK) {
|
|
80
|
+
return res;
|
|
81
|
+
}
|
|
82
|
+
if (!dbg->de_debug_frame.dss_size) {
|
|
83
|
+
return (DW_DLV_NO_ENTRY);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (i = 0; i < cie_count; i++) {
|
|
87
|
+
Dwarf_Off instoff = 0;
|
|
88
|
+
Dwarf_Signed initial_instructions_length = 0;
|
|
89
|
+
Dwarf_Small *instr_end = 0;
|
|
90
|
+
Dwarf_Sword icount = 0;
|
|
91
|
+
int j = 0;
|
|
92
|
+
int dw_err;
|
|
93
|
+
|
|
94
|
+
ciep = cie_data[i];
|
|
95
|
+
instoff = ciep->ci_cie_instr_start - dbg->de_debug_frame.dss_data;
|
|
96
|
+
initial_instructions_length = ciep->ci_length +
|
|
97
|
+
ciep->ci_length_size + ciep->ci_extension_size -
|
|
98
|
+
(ciep->ci_cie_instr_start - ciep->ci_cie_start);
|
|
99
|
+
instr_end = ciep->ci_cie_instr_start +
|
|
100
|
+
initial_instructions_length;
|
|
101
|
+
res = _dwarf_exec_frame_instr( /* make_instr */ true,
|
|
102
|
+
&frame_inst,
|
|
103
|
+
/* search_pc= */ false,
|
|
104
|
+
/* search_pc_val= */ 0,
|
|
105
|
+
/* location */ 0,
|
|
106
|
+
ciep->ci_cie_instr_start,
|
|
107
|
+
instr_end,
|
|
108
|
+
/* Dwarf_frame= */ 0,
|
|
109
|
+
/* cie= */ 0,
|
|
110
|
+
dbg,
|
|
111
|
+
DW_FRAME_CFA_COL,
|
|
112
|
+
&icount, &dw_err);
|
|
113
|
+
if (res == DW_DLV_ERROR) {
|
|
114
|
+
_dwarf_error(dbg, err, dw_err);
|
|
115
|
+
return (res);
|
|
116
|
+
} else if (res == DW_DLV_NO_ENTRY) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (j = 0; j < icount; ++j) {
|
|
121
|
+
Dwarf_Frame_Op *finst = frame_inst + j;
|
|
122
|
+
|
|
123
|
+
if (finst->fp_base_op == 0 && finst->fp_extended_op == 1) {
|
|
124
|
+
/* is DW_CFA_set_loc */
|
|
125
|
+
Dwarf_Addr add = (Dwarf_Addr) finst->fp_offset;
|
|
126
|
+
Dwarf_Off off = finst->fp_instr_offset + instoff;
|
|
127
|
+
|
|
128
|
+
arange = (Dwarf_Arange)
|
|
129
|
+
_dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
|
|
130
|
+
if (arange == NULL) {
|
|
131
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
132
|
+
return (DW_DLV_ERROR);
|
|
133
|
+
}
|
|
134
|
+
arange->ar_address = add;
|
|
135
|
+
arange->ar_info_offset = off;
|
|
136
|
+
arange_count++;
|
|
137
|
+
curr_chain = (Dwarf_Chain)
|
|
138
|
+
_dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
|
|
139
|
+
if (curr_chain == NULL) {
|
|
140
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
141
|
+
return (DW_DLV_ERROR);
|
|
142
|
+
}
|
|
143
|
+
curr_chain->ch_item = arange;
|
|
144
|
+
if (head_chain == NULL)
|
|
145
|
+
head_chain = prev_chain = curr_chain;
|
|
146
|
+
else {
|
|
147
|
+
prev_chain->ch_next = curr_chain;
|
|
148
|
+
prev_chain = curr_chain;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK);
|
|
153
|
+
|
|
154
|
+
}
|
|
155
|
+
for (i = 0; i < fde_count; i++) {
|
|
156
|
+
Dwarf_Small *instr_end = 0;
|
|
157
|
+
Dwarf_Sword icount = 0;
|
|
158
|
+
Dwarf_Signed instructions_length = 0;
|
|
159
|
+
Dwarf_Off instoff = 0;
|
|
160
|
+
Dwarf_Off off = 0;
|
|
161
|
+
Dwarf_Addr addr = 0;
|
|
162
|
+
int j = 0;
|
|
163
|
+
int dw_err;
|
|
164
|
+
|
|
165
|
+
fdep = fde_data[i];
|
|
166
|
+
off = fdep->fd_initial_loc_pos - dbg->de_debug_frame.dss_data;
|
|
167
|
+
addr = fdep->fd_initial_location;
|
|
168
|
+
arange = (Dwarf_Arange)
|
|
169
|
+
_dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
|
|
170
|
+
if (arange == NULL) {
|
|
171
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
172
|
+
return (DW_DLV_ERROR);
|
|
173
|
+
}
|
|
174
|
+
arange->ar_address = addr;
|
|
175
|
+
arange->ar_info_offset = off;
|
|
176
|
+
arange_count++;
|
|
177
|
+
curr_chain = (Dwarf_Chain)
|
|
178
|
+
_dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
|
|
179
|
+
if (curr_chain == NULL) {
|
|
180
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
181
|
+
return (DW_DLV_ERROR);
|
|
182
|
+
}
|
|
183
|
+
curr_chain->ch_item = arange;
|
|
184
|
+
if (head_chain == NULL)
|
|
185
|
+
head_chain = prev_chain = curr_chain;
|
|
186
|
+
else {
|
|
187
|
+
prev_chain->ch_next = curr_chain;
|
|
188
|
+
prev_chain = curr_chain;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
instoff = fdep->fd_fde_instr_start - dbg->de_debug_frame.dss_data;
|
|
193
|
+
instructions_length = fdep->fd_length +
|
|
194
|
+
fdep->fd_length_size + fdep->fd_extension_size -
|
|
195
|
+
(fdep->fd_fde_instr_start - fdep->fd_fde_start);
|
|
196
|
+
instr_end = fdep->fd_fde_instr_start + instructions_length;
|
|
197
|
+
res = _dwarf_exec_frame_instr( /* make_instr */ true,
|
|
198
|
+
&frame_inst,
|
|
199
|
+
/* search_pc= */ false,
|
|
200
|
+
/* search_pc_val= */ 0,
|
|
201
|
+
/* location */ 0,
|
|
202
|
+
fdep->fd_fde_instr_start,
|
|
203
|
+
instr_end,
|
|
204
|
+
/* Dwarf_frame= */ 0,
|
|
205
|
+
/* cie= */ 0,
|
|
206
|
+
dbg,
|
|
207
|
+
DW_FRAME_CFA_COL,
|
|
208
|
+
&icount, &dw_err);
|
|
209
|
+
if (res == DW_DLV_ERROR) {
|
|
210
|
+
_dwarf_error(dbg, err, dw_err);
|
|
211
|
+
return (res);
|
|
212
|
+
} else if (res == DW_DLV_NO_ENTRY) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
for (j = 0; j < icount; ++j) {
|
|
217
|
+
Dwarf_Frame_Op *finst2 = frame_inst + j;
|
|
218
|
+
|
|
219
|
+
if (finst2->fp_base_op == 0 && finst2->fp_extended_op == 1) {
|
|
220
|
+
/* is DW_CFA_set_loc */
|
|
221
|
+
Dwarf_Addr add = (Dwarf_Addr) finst2->fp_offset;
|
|
222
|
+
Dwarf_Off off2 = finst2->fp_instr_offset + instoff;
|
|
223
|
+
|
|
224
|
+
arange = (Dwarf_Arange)
|
|
225
|
+
_dwarf_get_alloc(dbg, DW_DLA_ARANGE, 1);
|
|
226
|
+
if (arange == NULL) {
|
|
227
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
228
|
+
return (DW_DLV_ERROR);
|
|
229
|
+
}
|
|
230
|
+
arange->ar_address = add;
|
|
231
|
+
arange->ar_info_offset = off2;
|
|
232
|
+
arange_count++;
|
|
233
|
+
curr_chain = (Dwarf_Chain)
|
|
234
|
+
_dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
|
|
235
|
+
if (curr_chain == NULL) {
|
|
236
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
237
|
+
return (DW_DLV_ERROR);
|
|
238
|
+
}
|
|
239
|
+
curr_chain->ch_item = arange;
|
|
240
|
+
if (head_chain == NULL)
|
|
241
|
+
head_chain = prev_chain = curr_chain;
|
|
242
|
+
else {
|
|
243
|
+
prev_chain->ch_next = curr_chain;
|
|
244
|
+
prev_chain = curr_chain;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
dwarf_dealloc(dbg, frame_inst, DW_DLA_FRAME_BLOCK);
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
dwarf_dealloc(dbg, fde_data, DW_DLA_LIST);
|
|
253
|
+
dwarf_dealloc(dbg, cie_data, DW_DLA_LIST);
|
|
254
|
+
arange_addrs = (Dwarf_Addr *)
|
|
255
|
+
_dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count);
|
|
256
|
+
if (arange_addrs == NULL) {
|
|
257
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
258
|
+
return (DW_DLV_ERROR);
|
|
259
|
+
}
|
|
260
|
+
arange_offsets = (Dwarf_Off *)
|
|
261
|
+
_dwarf_get_alloc(dbg, DW_DLA_ADDR, arange_count);
|
|
262
|
+
if (arange_offsets == NULL) {
|
|
263
|
+
_dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
|
|
264
|
+
return (DW_DLV_ERROR);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
curr_chain = head_chain;
|
|
268
|
+
for (u = 0; u < arange_count; u++) {
|
|
269
|
+
Dwarf_Arange ar = curr_chain->ch_item;
|
|
270
|
+
|
|
271
|
+
arange_addrs[u] = ar->ar_address;
|
|
272
|
+
arange_offsets[u] = ar->ar_info_offset;
|
|
273
|
+
prev_chain = curr_chain;
|
|
274
|
+
curr_chain = curr_chain->ch_next;
|
|
275
|
+
dwarf_dealloc(dbg, ar, DW_DLA_ARANGE);
|
|
276
|
+
dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
|
|
277
|
+
}
|
|
278
|
+
*returncount = arange_count;
|
|
279
|
+
*offsetlist = arange_offsets;
|
|
280
|
+
*addrlist = arange_addrs;
|
|
281
|
+
return retval;
|
|
282
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
|
|
4
|
+
Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
This program is free software; you can redistribute it and/or modify it
|
|
7
|
+
under the terms of version 2.1 of the GNU Lesser General Public License
|
|
8
|
+
as published by the Free Software Foundation.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it would be useful, but
|
|
11
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
13
|
+
|
|
14
|
+
Further, this software is distributed without any warranty that it is
|
|
15
|
+
free of the rightful claim of any third person regarding infringement
|
|
16
|
+
or the like. Any license provided herein, whether implied or
|
|
17
|
+
otherwise, applies only to this software file. Patent licenses, if
|
|
18
|
+
any, provided herein do not apply to combinations of this program with
|
|
19
|
+
other software, or any other product whatsoever.
|
|
20
|
+
|
|
21
|
+
You should have received a copy of the GNU Lesser General Public
|
|
22
|
+
License along with this program; if not, write the Free Software
|
|
23
|
+
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
|
|
24
|
+
USA.
|
|
25
|
+
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#include "config.h"
|
|
29
|
+
#include "dwarf_incl.h"
|
|
30
|
+
#include <stdio.h>
|
|
31
|
+
#include "dwarf_funcs.h"
|
|
32
|
+
#include "dwarf_global.h"
|
|
33
|
+
|
|
34
|
+
int
|
|
35
|
+
dwarf_get_funcs(Dwarf_Debug dbg,
|
|
36
|
+
Dwarf_Func ** funcs,
|
|
37
|
+
Dwarf_Signed * ret_func_count, Dwarf_Error * error)
|
|
38
|
+
{
|
|
39
|
+
int res = _dwarf_load_section(dbg, &dbg->de_debug_funcnames,error);
|
|
40
|
+
if (res != DW_DLV_OK) {
|
|
41
|
+
return res;
|
|
42
|
+
}
|
|
43
|
+
if (!dbg->de_debug_funcnames.dss_size) {
|
|
44
|
+
return (DW_DLV_NO_ENTRY);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
return _dwarf_internal_get_pubnames_like_data(dbg,
|
|
49
|
+
dbg->de_debug_funcnames.dss_data,
|
|
50
|
+
dbg->de_debug_funcnames.dss_size,
|
|
51
|
+
(Dwarf_Global **) funcs, /* Type punning for sections with identical format. */
|
|
52
|
+
ret_func_count,
|
|
53
|
+
error,
|
|
54
|
+
DW_DLA_FUNC_CONTEXT,
|
|
55
|
+
DW_DLA_FUNC,
|
|
56
|
+
DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD,
|
|
57
|
+
DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Deallocating fully requires deallocating the list
|
|
61
|
+
and all entries. But some internal data is
|
|
62
|
+
not exposed, so we need a function with internal knowledge.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
void
|
|
66
|
+
dwarf_funcs_dealloc(Dwarf_Debug dbg, Dwarf_Func * dwgl,
|
|
67
|
+
Dwarf_Signed count)
|
|
68
|
+
{
|
|
69
|
+
_dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl,
|
|
70
|
+
count,
|
|
71
|
+
DW_DLA_FUNC_CONTEXT,
|
|
72
|
+
DW_DLA_FUNC, DW_DLA_LIST);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
int
|
|
79
|
+
dwarf_funcname(Dwarf_Func func_in, char **ret_name, Dwarf_Error * error)
|
|
80
|
+
{
|
|
81
|
+
Dwarf_Global func = (Dwarf_Global) func_in;
|
|
82
|
+
|
|
83
|
+
if (func == NULL) {
|
|
84
|
+
_dwarf_error(NULL, error, DW_DLE_FUNC_NULL);
|
|
85
|
+
return (DW_DLV_ERROR);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
*ret_name = (char *) (func->gl_name);
|
|
89
|
+
return DW_DLV_OK;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
int
|
|
93
|
+
dwarf_func_die_offset(Dwarf_Func func_in,
|
|
94
|
+
Dwarf_Off * return_offset, Dwarf_Error * error)
|
|
95
|
+
{
|
|
96
|
+
Dwarf_Global func = (Dwarf_Global) func_in;
|
|
97
|
+
|
|
98
|
+
return dwarf_global_die_offset(func, return_offset, error);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
int
|
|
103
|
+
dwarf_func_cu_offset(Dwarf_Func func_in,
|
|
104
|
+
Dwarf_Off * return_offset, Dwarf_Error * error)
|
|
105
|
+
{
|
|
106
|
+
Dwarf_Global func = (Dwarf_Global) func_in;
|
|
107
|
+
|
|
108
|
+
return dwarf_global_cu_offset(func, return_offset, error);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
int
|
|
113
|
+
dwarf_func_name_offsets(Dwarf_Func func_in,
|
|
114
|
+
char **ret_func_name,
|
|
115
|
+
Dwarf_Off * die_offset,
|
|
116
|
+
Dwarf_Off * cu_die_offset, Dwarf_Error * error)
|
|
117
|
+
{
|
|
118
|
+
Dwarf_Global func = (Dwarf_Global) func_in;
|
|
119
|
+
|
|
120
|
+
return dwarf_global_name_offsets(func,
|
|
121
|
+
ret_func_name,
|
|
122
|
+
die_offset, cu_die_offset, error);
|
|
123
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2000, 2004 Silicon Graphics, Inc. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
This program is free software; you can redistribute it and/or modify it
|
|
6
|
+
under the terms of version 2.1 of the GNU Lesser General Public License
|
|
7
|
+
as published by the Free Software Foundation.
|
|
8
|
+
|
|
9
|
+
This program is distributed in the hope that it would be useful, but
|
|
10
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
|
|
13
|
+
Further, this software is distributed without any warranty that it is
|
|
14
|
+
free of the rightful claim of any third person regarding infringement
|
|
15
|
+
or the like. Any license provided herein, whether implied or
|
|
16
|
+
otherwise, applies only to this software file. Patent licenses, if
|
|
17
|
+
any, provided herein do not apply to combinations of this program with
|
|
18
|
+
other software, or any other product whatsoever.
|
|
19
|
+
|
|
20
|
+
You should have received a copy of the GNU Lesser General Public
|
|
21
|
+
License along with this program; if not, write the Free Software
|
|
22
|
+
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
|
|
23
|
+
USA.
|
|
24
|
+
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
typedef struct Dwarf_Func_Context_s *Dwarf_Func_Context;
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* struct never completed: see dwarf_global.h */
|
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
Copyright (C) 2014-2014 David Anderson. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
This program is free software; you can redistribute it and/or modify it
|
|
6
|
+
under the terms of version 2.1 of the GNU Lesser General Public License
|
|
7
|
+
as published by the Free Software Foundation.
|
|
8
|
+
|
|
9
|
+
This program is distributed in the hope that it would be useful, but
|
|
10
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
|
|
13
|
+
Further, this software is distributed without any warranty that it is
|
|
14
|
+
free of the rightful claim of any third person regarding infringement
|
|
15
|
+
or the like. Any license provided herein, whether implied or
|
|
16
|
+
otherwise, applies only to this software file. Patent licenses, if
|
|
17
|
+
any, provided herein do not apply to combinations of this program with
|
|
18
|
+
other software, or any other product whatsoever.
|
|
19
|
+
|
|
20
|
+
You should have received a copy of the GNU Lesser General Public
|
|
21
|
+
License along with this program; if not, write the Free Software
|
|
22
|
+
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
|
|
23
|
+
USA.
|
|
24
|
+
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
#include "config.h"
|
|
28
|
+
#include "dwarf_incl.h"
|
|
29
|
+
#include <stdio.h>
|
|
30
|
+
#include <stdlib.h>
|
|
31
|
+
#include "dwarf_gdbindex.h"
|
|
32
|
+
|
|
33
|
+
#define TRUE 1
|
|
34
|
+
#define FALSE 0
|
|
35
|
+
|
|
36
|
+
/* The dwarf_util macro READ_UNALIGNED
|
|
37
|
+
cannot be directly used because
|
|
38
|
+
gdb defines the section contents of
|
|
39
|
+
.gdb_index as little-endian always.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
#if WORDS_BIGENDIAN /* meaning on this host */
|
|
43
|
+
#define READ_GDBINDEX(dest,desttype, source, length) \
|
|
44
|
+
do { \
|
|
45
|
+
BIGGEST_UINT _ltmp = 0; \
|
|
46
|
+
_dwarf_memcpy_swap_bytes((((char *)(&_ltmp)) + sizeof(_ltmp) - length), \
|
|
47
|
+
source, length) ; \
|
|
48
|
+
dest = (desttype)_ltmp; \
|
|
49
|
+
} while (0)
|
|
50
|
+
#else /* little-endian on this host */
|
|
51
|
+
#define READ_GDBINDEX(dest,desttype, source, length) \
|
|
52
|
+
do { \
|
|
53
|
+
BIGGEST_UINT _ltmp = 0; \
|
|
54
|
+
memcpy(((char *)(&_ltmp)) , \
|
|
55
|
+
source, length) ; \
|
|
56
|
+
dest = (desttype)_ltmp; \
|
|
57
|
+
} while (0)
|
|
58
|
+
|
|
59
|
+
#endif
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
struct gi_fileheader_s {
|
|
63
|
+
gdbindex_offset_type headerval[6];
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
struct dwarf_64bitpair {
|
|
67
|
+
gdbindex_64 offset;
|
|
68
|
+
gdbindex_64 length;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
static int
|
|
72
|
+
set_base(Dwarf_Debug dbg,
|
|
73
|
+
struct Dwarf_Gdbindex_array_instance_s * hdr,
|
|
74
|
+
Dwarf_Small *start,
|
|
75
|
+
Dwarf_Small *end,
|
|
76
|
+
/* entrylen is the length of a single struct as seen in the object. */
|
|
77
|
+
Dwarf_Unsigned entrylen,
|
|
78
|
+
/* The size of each field in the struct in the object. */
|
|
79
|
+
Dwarf_Unsigned fieldlen,
|
|
80
|
+
enum gdbindex_type_e type,
|
|
81
|
+
Dwarf_Error * err)
|
|
82
|
+
{
|
|
83
|
+
|
|
84
|
+
if (type == git_std || type == git_cuvec) {
|
|
85
|
+
/* cuvec is sort of a fake as a simple
|
|
86
|
+
section, but a useful one. */
|
|
87
|
+
Dwarf_Unsigned count = 0;
|
|
88
|
+
if( end < start) {
|
|
89
|
+
_dwarf_error(dbg, err,DW_DLE_GDB_INDEX_COUNT_ERROR);
|
|
90
|
+
return DW_DLV_ERROR;
|
|
91
|
+
}
|
|
92
|
+
count = end - start;
|
|
93
|
+
count = count / entrylen;
|
|
94
|
+
hdr->dg_type = type;
|
|
95
|
+
hdr->dg_base = start;
|
|
96
|
+
hdr->dg_count = count;
|
|
97
|
+
hdr->dg_entry_length = entrylen;
|
|
98
|
+
hdr->dg_fieldlen = fieldlen;
|
|
99
|
+
} else {
|
|
100
|
+
/* address area. */
|
|
101
|
+
/* 64bit, 64bit, offset. Then 32bit pad. */
|
|
102
|
+
Dwarf_Unsigned count = 0;
|
|
103
|
+
hdr->dg_base = start;
|
|
104
|
+
if( end < start) {
|
|
105
|
+
_dwarf_error(dbg, err,DW_DLE_GDB_INDEX_COUNT_ADDR_ERROR);
|
|
106
|
+
return DW_DLV_ERROR;
|
|
107
|
+
}
|
|
108
|
+
/* entry length includes pad. */
|
|
109
|
+
hdr->dg_entry_length = 2*sizeof(gdbindex_64) +
|
|
110
|
+
sizeof(gdbindex_offset_type);
|
|
111
|
+
count = end - start;
|
|
112
|
+
count = count / hdr->dg_entry_length;
|
|
113
|
+
hdr->dg_count = count;
|
|
114
|
+
/* The dg_fieldlen is a fake, the fields are not
|
|
115
|
+
all the same length. */
|
|
116
|
+
hdr->dg_fieldlen = sizeof(gdbindex_offset_type);
|
|
117
|
+
hdr->dg_type = type;
|
|
118
|
+
}
|
|
119
|
+
return DW_DLV_OK;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
int
|
|
123
|
+
dwarf_gdbindex_header(Dwarf_Debug dbg,
|
|
124
|
+
Dwarf_Gdbindex * gdbindexptr,
|
|
125
|
+
Dwarf_Unsigned * version,
|
|
126
|
+
Dwarf_Unsigned * cu_list_offset,
|
|
127
|
+
Dwarf_Unsigned * types_cu_list_offset,
|
|
128
|
+
Dwarf_Unsigned * address_area_offset,
|
|
129
|
+
Dwarf_Unsigned * symbol_table_offset,
|
|
130
|
+
Dwarf_Unsigned * constant_pool_offset,
|
|
131
|
+
Dwarf_Unsigned * section_size,
|
|
132
|
+
Dwarf_Unsigned * unused_reserved,
|
|
133
|
+
const char ** section_name,
|
|
134
|
+
Dwarf_Error * error)
|
|
135
|
+
{
|
|
136
|
+
|
|
137
|
+
struct gi_fileheader_s header;
|
|
138
|
+
Dwarf_Gdbindex indexptr = 0;
|
|
139
|
+
int res = DW_DLV_ERROR;
|
|
140
|
+
|
|
141
|
+
if (!dbg->de_debug_gdbindex.dss_size) {
|
|
142
|
+
return DW_DLV_NO_ENTRY;
|
|
143
|
+
}
|
|
144
|
+
if (!dbg->de_debug_gdbindex.dss_data) {
|
|
145
|
+
res = _dwarf_load_section(dbg, &dbg->de_debug_gdbindex,error);
|
|
146
|
+
if (res != DW_DLV_OK) {
|
|
147
|
+
return res;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (dbg->de_debug_gdbindex.dss_size < sizeof(struct gi_fileheader_s) ) {
|
|
152
|
+
_dwarf_error(dbg, error, DW_DLE_ERRONEOUS_GDB_INDEX_SECTION);
|
|
153
|
+
return (DW_DLV_ERROR);
|
|
154
|
+
}
|
|
155
|
+
memcpy(&header,dbg->de_debug_gdbindex.dss_data,
|
|
156
|
+
sizeof(struct gi_fileheader_s));
|
|
157
|
+
indexptr = (Dwarf_Gdbindex)_dwarf_get_alloc(dbg,DW_DLA_GDBINDEX,1);
|
|
158
|
+
if (indexptr == NULL) {
|
|
159
|
+
_dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
|
|
160
|
+
return (DW_DLV_ERROR);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
indexptr->gi_dbg = dbg;
|
|
164
|
+
indexptr->gi_section_data = dbg->de_debug_gdbindex.dss_data;
|
|
165
|
+
indexptr->gi_section_length = dbg->de_debug_gdbindex.dss_size;
|
|
166
|
+
READ_GDBINDEX(indexptr->gi_version ,Dwarf_Unsigned,
|
|
167
|
+
dbg->de_debug_gdbindex.dss_data,
|
|
168
|
+
sizeof(gdbindex_offset_type));
|
|
169
|
+
READ_GDBINDEX(indexptr->gi_cu_list_offset ,Dwarf_Unsigned,
|
|
170
|
+
dbg->de_debug_gdbindex.dss_data + sizeof(gdbindex_offset_type),
|
|
171
|
+
sizeof(gdbindex_offset_type));
|
|
172
|
+
READ_GDBINDEX(indexptr->gi_types_cu_list_offset ,Dwarf_Unsigned,
|
|
173
|
+
dbg->de_debug_gdbindex.dss_data + 2*sizeof(gdbindex_offset_type),
|
|
174
|
+
sizeof(gdbindex_offset_type));
|
|
175
|
+
READ_GDBINDEX(indexptr->gi_address_area_offset ,Dwarf_Unsigned,
|
|
176
|
+
dbg->de_debug_gdbindex.dss_data + 3*sizeof(gdbindex_offset_type),
|
|
177
|
+
sizeof(gdbindex_offset_type));
|
|
178
|
+
READ_GDBINDEX(indexptr->gi_symbol_table_offset ,Dwarf_Unsigned,
|
|
179
|
+
dbg->de_debug_gdbindex.dss_data + 4*sizeof(gdbindex_offset_type),
|
|
180
|
+
sizeof(gdbindex_offset_type));
|
|
181
|
+
READ_GDBINDEX(indexptr->gi_constant_pool_offset ,Dwarf_Unsigned,
|
|
182
|
+
dbg->de_debug_gdbindex.dss_data + 5*sizeof(gdbindex_offset_type),
|
|
183
|
+
sizeof(gdbindex_offset_type));
|
|
184
|
+
|
|
185
|
+
res = set_base(dbg,&indexptr->gi_culisthdr,
|
|
186
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_cu_list_offset,
|
|
187
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_types_cu_list_offset,
|
|
188
|
+
2*sizeof(gdbindex_64),
|
|
189
|
+
sizeof(gdbindex_64),
|
|
190
|
+
git_std,error);
|
|
191
|
+
res = set_base(dbg,&indexptr->gi_typesculisthdr,
|
|
192
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_types_cu_list_offset,
|
|
193
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_address_area_offset,
|
|
194
|
+
3*sizeof(gdbindex_64),
|
|
195
|
+
sizeof(gdbindex_64),
|
|
196
|
+
git_std,error);
|
|
197
|
+
res = set_base(dbg,&indexptr->gi_addressareahdr,
|
|
198
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_address_area_offset,
|
|
199
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_symbol_table_offset,
|
|
200
|
+
3*sizeof(gdbindex_64),
|
|
201
|
+
sizeof(gdbindex_64),
|
|
202
|
+
git_address,error);
|
|
203
|
+
res = set_base(dbg,&indexptr->gi_symboltablehdr,
|
|
204
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_symbol_table_offset,
|
|
205
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_constant_pool_offset,
|
|
206
|
+
2*sizeof(gdbindex_offset_type),
|
|
207
|
+
sizeof(gdbindex_offset_type),
|
|
208
|
+
git_std,error);
|
|
209
|
+
res = set_base(dbg,&indexptr->gi_cuvectorhdr,
|
|
210
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_constant_pool_offset,
|
|
211
|
+
/* There is no real single vector size.
|
|
212
|
+
but we'll use the entire rest as if there was. */
|
|
213
|
+
dbg->de_debug_gdbindex.dss_data + indexptr->gi_section_length,
|
|
214
|
+
sizeof(gdbindex_offset_type),
|
|
215
|
+
sizeof(gdbindex_offset_type),
|
|
216
|
+
git_cuvec,error);
|
|
217
|
+
|
|
218
|
+
/* Really just pointing to constant pool area. */
|
|
219
|
+
indexptr->gi_string_pool = dbg->de_debug_gdbindex.dss_data +
|
|
220
|
+
indexptr->gi_constant_pool_offset;
|
|
221
|
+
|
|
222
|
+
*gdbindexptr = indexptr;
|
|
223
|
+
*version = indexptr->gi_version;
|
|
224
|
+
*cu_list_offset = indexptr->gi_cu_list_offset;
|
|
225
|
+
*types_cu_list_offset = indexptr->gi_types_cu_list_offset;
|
|
226
|
+
*address_area_offset = indexptr->gi_address_area_offset;
|
|
227
|
+
*symbol_table_offset = indexptr->gi_symbol_table_offset;
|
|
228
|
+
*constant_pool_offset = indexptr->gi_constant_pool_offset;
|
|
229
|
+
*section_size = indexptr->gi_section_length;
|
|
230
|
+
*unused_reserved = 0;
|
|
231
|
+
*section_name = dbg->de_debug_gdbindex.dss_name;
|
|
232
|
+
|
|
233
|
+
return DW_DLV_OK;
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
int
|
|
240
|
+
dwarf_gdbindex_culist_array(Dwarf_Gdbindex gdbindexptr,
|
|
241
|
+
Dwarf_Unsigned * list_length,
|
|
242
|
+
Dwarf_Error * error)
|
|
243
|
+
{
|
|
244
|
+
*list_length = gdbindexptr->gi_culisthdr.dg_count;
|
|
245
|
+
return DW_DLV_OK;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/* entryindex: 0 to list_length-1 */
|
|
249
|
+
int
|
|
250
|
+
dwarf_gdbindex_culist_entry(Dwarf_Gdbindex gdbindexptr,
|
|
251
|
+
Dwarf_Unsigned entryindex,
|
|
252
|
+
Dwarf_Unsigned * cu_offset,
|
|
253
|
+
Dwarf_Unsigned * cu_length,
|
|
254
|
+
Dwarf_Error * error)
|
|
255
|
+
{
|
|
256
|
+
Dwarf_Unsigned max = gdbindexptr->gi_culisthdr.dg_count;
|
|
257
|
+
Dwarf_Small * base = 0;
|
|
258
|
+
Dwarf_Unsigned offset = 0;
|
|
259
|
+
Dwarf_Unsigned length = 0;
|
|
260
|
+
unsigned fieldlen = gdbindexptr->gi_culisthdr.dg_fieldlen;
|
|
261
|
+
|
|
262
|
+
if (entryindex >= max) {
|
|
263
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
264
|
+
return DW_DLV_ERROR;
|
|
265
|
+
}
|
|
266
|
+
base = gdbindexptr->gi_culisthdr.dg_base;
|
|
267
|
+
base += entryindex*gdbindexptr->gi_culisthdr.dg_entry_length;
|
|
268
|
+
|
|
269
|
+
READ_GDBINDEX(offset ,Dwarf_Unsigned,
|
|
270
|
+
base,
|
|
271
|
+
fieldlen);
|
|
272
|
+
READ_GDBINDEX(length ,Dwarf_Unsigned,
|
|
273
|
+
base+ fieldlen,
|
|
274
|
+
fieldlen);
|
|
275
|
+
*cu_offset = offset;
|
|
276
|
+
*cu_length = length;
|
|
277
|
+
return DW_DLV_OK;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
int
|
|
281
|
+
dwarf_gdbindex_types_culist_array(Dwarf_Gdbindex gdbindexptr,
|
|
282
|
+
Dwarf_Unsigned * list_length,
|
|
283
|
+
Dwarf_Error * error)
|
|
284
|
+
{
|
|
285
|
+
*list_length = gdbindexptr->gi_typesculisthdr.dg_count;
|
|
286
|
+
return DW_DLV_OK;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* entryindex: 0 to list_length-1 */
|
|
290
|
+
int
|
|
291
|
+
dwarf_gdbindex_types_culist_entry(Dwarf_Gdbindex gdbindexptr,
|
|
292
|
+
Dwarf_Unsigned entryindex,
|
|
293
|
+
Dwarf_Unsigned * t_offset,
|
|
294
|
+
Dwarf_Unsigned * t_length,
|
|
295
|
+
Dwarf_Unsigned * t_signature,
|
|
296
|
+
Dwarf_Error * error)
|
|
297
|
+
{
|
|
298
|
+
Dwarf_Unsigned max = gdbindexptr->gi_typesculisthdr.dg_count;
|
|
299
|
+
Dwarf_Small * base = 0;
|
|
300
|
+
Dwarf_Unsigned offset = 0;
|
|
301
|
+
Dwarf_Unsigned length = 0;
|
|
302
|
+
Dwarf_Unsigned signature = 0;
|
|
303
|
+
unsigned fieldlen = gdbindexptr->gi_typesculisthdr.dg_fieldlen;
|
|
304
|
+
|
|
305
|
+
if (entryindex >= max) {
|
|
306
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
307
|
+
return DW_DLV_ERROR;
|
|
308
|
+
}
|
|
309
|
+
base = gdbindexptr->gi_typesculisthdr.dg_base;
|
|
310
|
+
base += entryindex*gdbindexptr->gi_typesculisthdr.dg_entry_length;
|
|
311
|
+
|
|
312
|
+
READ_GDBINDEX(offset ,Dwarf_Unsigned,
|
|
313
|
+
base,
|
|
314
|
+
fieldlen);
|
|
315
|
+
READ_GDBINDEX(length ,Dwarf_Unsigned,
|
|
316
|
+
base+ (1*fieldlen),
|
|
317
|
+
fieldlen);
|
|
318
|
+
READ_GDBINDEX(signature ,Dwarf_Unsigned,
|
|
319
|
+
base+ (2*fieldlen),
|
|
320
|
+
fieldlen);
|
|
321
|
+
*t_offset = offset;
|
|
322
|
+
*t_length = length;
|
|
323
|
+
*t_signature = signature;
|
|
324
|
+
return DW_DLV_OK;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
int
|
|
328
|
+
dwarf_gdbindex_addressarea(Dwarf_Gdbindex gdbindexptr,
|
|
329
|
+
Dwarf_Unsigned * list_length,
|
|
330
|
+
Dwarf_Error * error)
|
|
331
|
+
{
|
|
332
|
+
*list_length = gdbindexptr->gi_addressareahdr.dg_count;
|
|
333
|
+
return DW_DLV_OK;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* entryindex: 0 to addressarea_list_length-1 */
|
|
337
|
+
int
|
|
338
|
+
dwarf_gdbindex_addressarea_entry(
|
|
339
|
+
Dwarf_Gdbindex gdbindexptr,
|
|
340
|
+
Dwarf_Unsigned entryindex,
|
|
341
|
+
Dwarf_Unsigned * low_address,
|
|
342
|
+
Dwarf_Unsigned * high_address,
|
|
343
|
+
Dwarf_Unsigned * cu_index,
|
|
344
|
+
Dwarf_Error * error)
|
|
345
|
+
{
|
|
346
|
+
Dwarf_Unsigned max = gdbindexptr->gi_addressareahdr.dg_count;
|
|
347
|
+
Dwarf_Small * base = 0;
|
|
348
|
+
Dwarf_Unsigned lowaddr = 0;
|
|
349
|
+
Dwarf_Unsigned highaddr = 0;
|
|
350
|
+
Dwarf_Unsigned cuindex = 0;
|
|
351
|
+
|
|
352
|
+
if (entryindex >= max) {
|
|
353
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
354
|
+
return DW_DLV_ERROR;
|
|
355
|
+
}
|
|
356
|
+
base = gdbindexptr->gi_addressareahdr.dg_base;
|
|
357
|
+
base += entryindex*gdbindexptr->gi_addressareahdr.dg_entry_length;
|
|
358
|
+
|
|
359
|
+
READ_GDBINDEX(lowaddr ,Dwarf_Unsigned,
|
|
360
|
+
base,
|
|
361
|
+
sizeof(gdbindex_64));
|
|
362
|
+
READ_GDBINDEX(highaddr ,Dwarf_Unsigned,
|
|
363
|
+
base+ (1*sizeof(gdbindex_64)),
|
|
364
|
+
sizeof(gdbindex_64));
|
|
365
|
+
READ_GDBINDEX(cuindex ,Dwarf_Unsigned,
|
|
366
|
+
base+ (2*sizeof(gdbindex_64)),
|
|
367
|
+
sizeof(gdbindex_offset_type));
|
|
368
|
+
*low_address = lowaddr;
|
|
369
|
+
*high_address = highaddr;
|
|
370
|
+
*cu_index = cuindex;
|
|
371
|
+
return DW_DLV_OK;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
int
|
|
375
|
+
dwarf_gdbindex_symboltable_array(Dwarf_Gdbindex gdbindexptr,
|
|
376
|
+
Dwarf_Unsigned * list_length,
|
|
377
|
+
Dwarf_Error * error)
|
|
378
|
+
{
|
|
379
|
+
*list_length = gdbindexptr->gi_symboltablehdr.dg_count;
|
|
380
|
+
return DW_DLV_OK;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/* entryindex: 0 to symtab_list_length-1 */
|
|
384
|
+
int
|
|
385
|
+
dwarf_gdbindex_symboltable_entry(
|
|
386
|
+
Dwarf_Gdbindex gdbindexptr,
|
|
387
|
+
Dwarf_Unsigned entryindex,
|
|
388
|
+
Dwarf_Unsigned * string_offset,
|
|
389
|
+
Dwarf_Unsigned * cu_vector_offset,
|
|
390
|
+
Dwarf_Error * error)
|
|
391
|
+
{
|
|
392
|
+
Dwarf_Unsigned max = gdbindexptr->gi_symboltablehdr.dg_count;
|
|
393
|
+
Dwarf_Small * base = 0;
|
|
394
|
+
Dwarf_Unsigned symoffset = 0;
|
|
395
|
+
Dwarf_Unsigned cuoffset = 0;
|
|
396
|
+
unsigned fieldlen = gdbindexptr->gi_symboltablehdr.dg_fieldlen;
|
|
397
|
+
|
|
398
|
+
if (entryindex >= max) {
|
|
399
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
400
|
+
return DW_DLV_ERROR;
|
|
401
|
+
}
|
|
402
|
+
base = gdbindexptr->gi_symboltablehdr.dg_base;
|
|
403
|
+
base += entryindex*gdbindexptr->gi_symboltablehdr.dg_entry_length;
|
|
404
|
+
|
|
405
|
+
READ_GDBINDEX(symoffset ,Dwarf_Unsigned,
|
|
406
|
+
base,
|
|
407
|
+
fieldlen);
|
|
408
|
+
READ_GDBINDEX(cuoffset ,Dwarf_Unsigned,
|
|
409
|
+
base + fieldlen,
|
|
410
|
+
fieldlen);
|
|
411
|
+
*string_offset = symoffset;
|
|
412
|
+
*cu_vector_offset = cuoffset;
|
|
413
|
+
return DW_DLV_OK;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
int
|
|
417
|
+
dwarf_gdbindex_cuvector_length(Dwarf_Gdbindex gdbindex,
|
|
418
|
+
Dwarf_Unsigned cuvector_offset,
|
|
419
|
+
Dwarf_Unsigned * innercount,
|
|
420
|
+
Dwarf_Error * error)
|
|
421
|
+
{
|
|
422
|
+
Dwarf_Small *base = gdbindex->gi_cuvectorhdr.dg_base;
|
|
423
|
+
Dwarf_Small *end = gdbindex->gi_section_data + gdbindex->gi_section_length;
|
|
424
|
+
Dwarf_Unsigned val = 0;
|
|
425
|
+
unsigned fieldlen = gdbindex->gi_cuvectorhdr.dg_entry_length;
|
|
426
|
+
|
|
427
|
+
base += cuvector_offset;
|
|
428
|
+
if ((base + fieldlen) >= end) {
|
|
429
|
+
_dwarf_error(gdbindex->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
430
|
+
return DW_DLV_ERROR;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
READ_GDBINDEX(val,Dwarf_Unsigned,
|
|
434
|
+
base,
|
|
435
|
+
fieldlen);
|
|
436
|
+
*innercount = val;
|
|
437
|
+
return DW_DLV_OK;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
int
|
|
441
|
+
dwarf_gdbindex_cuvector_inner_attributes(Dwarf_Gdbindex gdbindexptr,
|
|
442
|
+
Dwarf_Unsigned cuvector_offset,
|
|
443
|
+
Dwarf_Unsigned innerindex,
|
|
444
|
+
/* The attr_value is a field of bits. For expanded version
|
|
445
|
+
use dwarf_gdbindex_instance_expand_value() */
|
|
446
|
+
Dwarf_Unsigned * attributes,
|
|
447
|
+
Dwarf_Error * error)
|
|
448
|
+
{
|
|
449
|
+
Dwarf_Small *base = gdbindexptr->gi_cuvectorhdr.dg_base;
|
|
450
|
+
Dwarf_Small *end = gdbindexptr->gi_section_data +
|
|
451
|
+
gdbindexptr->gi_section_length;
|
|
452
|
+
Dwarf_Unsigned val = 0;
|
|
453
|
+
unsigned fieldlen = gdbindexptr->gi_cuvectorhdr.dg_entry_length;
|
|
454
|
+
|
|
455
|
+
base += cuvector_offset;
|
|
456
|
+
if ((base+fieldlen) >= end) {
|
|
457
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
458
|
+
return DW_DLV_ERROR;
|
|
459
|
+
}
|
|
460
|
+
base += fieldlen;
|
|
461
|
+
base += innerindex*fieldlen;
|
|
462
|
+
|
|
463
|
+
READ_GDBINDEX(val ,Dwarf_Unsigned,
|
|
464
|
+
base,
|
|
465
|
+
fieldlen);
|
|
466
|
+
*attributes = val;
|
|
467
|
+
return DW_DLV_OK;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
int
|
|
472
|
+
dwarf_gdbindex_cuvector_instance_expand_value(Dwarf_Gdbindex gdbindexptr,
|
|
473
|
+
Dwarf_Unsigned value,
|
|
474
|
+
Dwarf_Unsigned * cu_index,
|
|
475
|
+
Dwarf_Unsigned * reserved1,
|
|
476
|
+
Dwarf_Unsigned * symbol_kind,
|
|
477
|
+
Dwarf_Unsigned * is_static,
|
|
478
|
+
Dwarf_Error * error)
|
|
479
|
+
{
|
|
480
|
+
*cu_index = value & 0xffffff;
|
|
481
|
+
*reserved1 = (value >> 24) & 0xf;
|
|
482
|
+
*symbol_kind = (value >> 28) & 0x7;
|
|
483
|
+
*is_static = (value >> 31) & 1;
|
|
484
|
+
return DW_DLV_OK;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
/* The strings in the pool follow (in memory) the cu index
|
|
489
|
+
set and are NUL terminated. */
|
|
490
|
+
int
|
|
491
|
+
dwarf_gdbindex_string_by_offset(Dwarf_Gdbindex gdbindexptr,
|
|
492
|
+
Dwarf_Unsigned stringoffsetinpool,
|
|
493
|
+
const char ** string_ptr,
|
|
494
|
+
Dwarf_Error * error)
|
|
495
|
+
{
|
|
496
|
+
Dwarf_Small *pooldata = gdbindexptr->gi_section_data +
|
|
497
|
+
gdbindexptr->gi_constant_pool_offset;
|
|
498
|
+
Dwarf_Small *section_end = gdbindexptr->gi_section_data +
|
|
499
|
+
gdbindexptr->gi_section_length;
|
|
500
|
+
|
|
501
|
+
Dwarf_Small *stringitself = pooldata + stringoffsetinpool;
|
|
502
|
+
if (stringitself > section_end) {
|
|
503
|
+
_dwarf_error(gdbindexptr->gi_dbg, error,DW_DLE_GDB_INDEX_INDEX_ERROR);
|
|
504
|
+
return DW_DLV_ERROR;
|
|
505
|
+
}
|
|
506
|
+
*string_ptr = (const char *)stringitself;
|
|
507
|
+
return DW_DLV_OK;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
void
|
|
514
|
+
dwarf_gdbindex_free(Dwarf_Gdbindex indexptr)
|
|
515
|
+
{
|
|
516
|
+
if(indexptr) {
|
|
517
|
+
Dwarf_Debug dbg = indexptr->gi_dbg;
|
|
518
|
+
dwarf_dealloc(dbg,indexptr,DW_DLA_GDBINDEX);
|
|
519
|
+
}
|
|
520
|
+
}
|