1*7fd79137SRobert Mustacchi /*
2*7fd79137SRobert Mustacchi
3*7fd79137SRobert Mustacchi Copyright (C) 2000,2002,2003,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
4*7fd79137SRobert Mustacchi Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved.
5*7fd79137SRobert Mustacchi Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
6*7fd79137SRobert Mustacchi
7*7fd79137SRobert Mustacchi This program is free software; you can redistribute it and/or modify it
8*7fd79137SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
9*7fd79137SRobert Mustacchi as published by the Free Software Foundation.
10*7fd79137SRobert Mustacchi
11*7fd79137SRobert Mustacchi This program is distributed in the hope that it would be useful, but
12*7fd79137SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
13*7fd79137SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14*7fd79137SRobert Mustacchi
15*7fd79137SRobert Mustacchi Further, this software is distributed without any warranty that it is
16*7fd79137SRobert Mustacchi free of the rightful claim of any third person regarding infringement
17*7fd79137SRobert Mustacchi or the like. Any license provided herein, whether implied or
18*7fd79137SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
19*7fd79137SRobert Mustacchi any, provided herein do not apply to combinations of this program with
20*7fd79137SRobert Mustacchi other software, or any other product whatsoever.
21*7fd79137SRobert Mustacchi
22*7fd79137SRobert Mustacchi You should have received a copy of the GNU Lesser General Public
23*7fd79137SRobert Mustacchi License along with this program; if not, write the Free Software
24*7fd79137SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25*7fd79137SRobert Mustacchi USA.
26*7fd79137SRobert Mustacchi
27*7fd79137SRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
28*7fd79137SRobert Mustacchi Mountain View, CA 94043, or:
29*7fd79137SRobert Mustacchi
30*7fd79137SRobert Mustacchi http://www.sgi.com
31*7fd79137SRobert Mustacchi
32*7fd79137SRobert Mustacchi For further information regarding this notice, see:
33*7fd79137SRobert Mustacchi
34*7fd79137SRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan
35*7fd79137SRobert Mustacchi
36*7fd79137SRobert Mustacchi */
37*7fd79137SRobert Mustacchi
38*7fd79137SRobert Mustacchi #include "config.h"
39*7fd79137SRobert Mustacchi #include "dwarf_incl.h"
40*7fd79137SRobert Mustacchi
41*7fd79137SRobert Mustacchi #include <stdio.h>
42*7fd79137SRobert Mustacchi #include <sys/stat.h>
43*7fd79137SRobert Mustacchi #include <sys/types.h>
44*7fd79137SRobert Mustacchi #include <string.h>
45*7fd79137SRobert Mustacchi #include <stdlib.h>
46*7fd79137SRobert Mustacchi
47*7fd79137SRobert Mustacchi #include "dwarf_incl.h"
48*7fd79137SRobert Mustacchi #include "malloc_check.h"
49*7fd79137SRobert Mustacchi
50*7fd79137SRobert Mustacchi #define DWARF_DBG_ERROR(dbg,errval,retval) \
51*7fd79137SRobert Mustacchi _dwarf_error(dbg, error, errval); return(retval);
52*7fd79137SRobert Mustacchi
53*7fd79137SRobert Mustacchi #define FALSE 0
54*7fd79137SRobert Mustacchi #define TRUE 1
55*7fd79137SRobert Mustacchi
56*7fd79137SRobert Mustacchi
57*7fd79137SRobert Mustacchi
58*7fd79137SRobert Mustacchi /* This static is copied to the dbg on dbg init
59*7fd79137SRobert Mustacchi so that the static need not be referenced at
60*7fd79137SRobert Mustacchi run time, preserving better locality of
61*7fd79137SRobert Mustacchi reference.
62*7fd79137SRobert Mustacchi Value is 0 means do the string check.
63*7fd79137SRobert Mustacchi Value non-zero means do not do the check.
64*7fd79137SRobert Mustacchi */
65*7fd79137SRobert Mustacchi static Dwarf_Small _dwarf_assume_string_bad;
66*7fd79137SRobert Mustacchi static Dwarf_Small _dwarf_apply_relocs = 1;
67*7fd79137SRobert Mustacchi
68*7fd79137SRobert Mustacchi /* Call this after calling dwarf_init but before doing anything else.
69*7fd79137SRobert Mustacchi * It applies to all objects, not just the current object.
70*7fd79137SRobert Mustacchi */
71*7fd79137SRobert Mustacchi int
dwarf_set_reloc_application(int apply)72*7fd79137SRobert Mustacchi dwarf_set_reloc_application(int apply)
73*7fd79137SRobert Mustacchi {
74*7fd79137SRobert Mustacchi int oldval = _dwarf_apply_relocs;
75*7fd79137SRobert Mustacchi _dwarf_apply_relocs = apply;
76*7fd79137SRobert Mustacchi return oldval;
77*7fd79137SRobert Mustacchi }
78*7fd79137SRobert Mustacchi
79*7fd79137SRobert Mustacchi int
dwarf_set_stringcheck(int newval)80*7fd79137SRobert Mustacchi dwarf_set_stringcheck(int newval)
81*7fd79137SRobert Mustacchi {
82*7fd79137SRobert Mustacchi int oldval = _dwarf_assume_string_bad;
83*7fd79137SRobert Mustacchi
84*7fd79137SRobert Mustacchi _dwarf_assume_string_bad = newval;
85*7fd79137SRobert Mustacchi return oldval;
86*7fd79137SRobert Mustacchi }
87*7fd79137SRobert Mustacchi
88*7fd79137SRobert Mustacchi /* Unifies the basic duplicate/empty testing and section
89*7fd79137SRobert Mustacchi * data setting to one place. */
90*7fd79137SRobert Mustacchi static int
get_basic_section_data(Dwarf_Debug dbg,struct Dwarf_Section_s * secdata,struct Dwarf_Obj_Access_Section_s * doas,Dwarf_Half section_index,Dwarf_Error * error,int duperr,int emptyerr)91*7fd79137SRobert Mustacchi get_basic_section_data(Dwarf_Debug dbg,
92*7fd79137SRobert Mustacchi struct Dwarf_Section_s *secdata,
93*7fd79137SRobert Mustacchi struct Dwarf_Obj_Access_Section_s *doas,
94*7fd79137SRobert Mustacchi Dwarf_Half section_index,
95*7fd79137SRobert Mustacchi Dwarf_Error* error,
96*7fd79137SRobert Mustacchi int duperr, int emptyerr )
97*7fd79137SRobert Mustacchi {
98*7fd79137SRobert Mustacchi if (secdata->dss_index != 0) {
99*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, duperr, DW_DLV_ERROR);
100*7fd79137SRobert Mustacchi }
101*7fd79137SRobert Mustacchi if (doas->size == 0) {
102*7fd79137SRobert Mustacchi if (emptyerr == 0 ) {
103*7fd79137SRobert Mustacchi /* Allow empty section. */
104*7fd79137SRobert Mustacchi return DW_DLV_OK;
105*7fd79137SRobert Mustacchi }
106*7fd79137SRobert Mustacchi /* Know no reason to allow section */
107*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, emptyerr, DW_DLV_ERROR);
108*7fd79137SRobert Mustacchi }
109*7fd79137SRobert Mustacchi secdata->dss_index = section_index;
110*7fd79137SRobert Mustacchi secdata->dss_size = doas->size;
111*7fd79137SRobert Mustacchi secdata->dss_addr = doas->addr;
112*7fd79137SRobert Mustacchi secdata->dss_link = doas->link;
113*7fd79137SRobert Mustacchi return DW_DLV_OK;
114*7fd79137SRobert Mustacchi }
115*7fd79137SRobert Mustacchi
116*7fd79137SRobert Mustacchi
117*7fd79137SRobert Mustacchi static void
add_rela_data(struct Dwarf_Section_s * secdata,struct Dwarf_Obj_Access_Section_s * doas,Dwarf_Half section_index)118*7fd79137SRobert Mustacchi add_rela_data( struct Dwarf_Section_s *secdata,
119*7fd79137SRobert Mustacchi struct Dwarf_Obj_Access_Section_s *doas,
120*7fd79137SRobert Mustacchi Dwarf_Half section_index)
121*7fd79137SRobert Mustacchi {
122*7fd79137SRobert Mustacchi secdata->dss_reloc_index = section_index;
123*7fd79137SRobert Mustacchi secdata->dss_reloc_size = doas->size;
124*7fd79137SRobert Mustacchi secdata->dss_reloc_addr = doas->addr;
125*7fd79137SRobert Mustacchi secdata->dss_reloc_symtab = doas->link;
126*7fd79137SRobert Mustacchi secdata->dss_reloc_link = doas->link;
127*7fd79137SRobert Mustacchi }
128*7fd79137SRobert Mustacchi
129*7fd79137SRobert Mustacchi /*
130*7fd79137SRobert Mustacchi Given an Elf ptr, set up dbg with pointers
131*7fd79137SRobert Mustacchi to all the Dwarf data sections.
132*7fd79137SRobert Mustacchi Return NULL on error.
133*7fd79137SRobert Mustacchi
134*7fd79137SRobert Mustacchi This function is also responsible for determining
135*7fd79137SRobert Mustacchi whether the given object contains Dwarf information
136*7fd79137SRobert Mustacchi or not. The test currently used is that it contains
137*7fd79137SRobert Mustacchi either a .debug_info or a .debug_frame section. If
138*7fd79137SRobert Mustacchi not, it returns DW_DLV_NO_ENTRY causing dwarf_init() also to
139*7fd79137SRobert Mustacchi return DW_DLV_NO_ENTRY. Earlier, we had thought of using only
140*7fd79137SRobert Mustacchi the presence/absence of .debug_info to test, but we
141*7fd79137SRobert Mustacchi added .debug_frame since there could be stripped objects
142*7fd79137SRobert Mustacchi that have only a .debug_frame section for exception
143*7fd79137SRobert Mustacchi processing.
144*7fd79137SRobert Mustacchi DW_DLV_NO_ENTRY or DW_DLV_OK or DW_DLV_ERROR
145*7fd79137SRobert Mustacchi */
146*7fd79137SRobert Mustacchi static int
_dwarf_setup(Dwarf_Debug dbg,Dwarf_Error * error)147*7fd79137SRobert Mustacchi _dwarf_setup(Dwarf_Debug dbg, Dwarf_Error * error)
148*7fd79137SRobert Mustacchi {
149*7fd79137SRobert Mustacchi const char *scn_name = 0;
150*7fd79137SRobert Mustacchi int foundDwarf = 0;
151*7fd79137SRobert Mustacchi struct Dwarf_Obj_Access_Interface_s * obj = 0;
152*7fd79137SRobert Mustacchi
153*7fd79137SRobert Mustacchi Dwarf_Endianness endianness;
154*7fd79137SRobert Mustacchi
155*7fd79137SRobert Mustacchi Dwarf_Unsigned section_size = 0;
156*7fd79137SRobert Mustacchi Dwarf_Unsigned section_count = 0;
157*7fd79137SRobert Mustacchi Dwarf_Half section_index = 0;
158*7fd79137SRobert Mustacchi Dwarf_Addr section_addr = 0;
159*7fd79137SRobert Mustacchi
160*7fd79137SRobert Mustacchi foundDwarf = FALSE;
161*7fd79137SRobert Mustacchi
162*7fd79137SRobert Mustacchi dbg->de_assume_string_in_bounds = _dwarf_assume_string_bad;
163*7fd79137SRobert Mustacchi
164*7fd79137SRobert Mustacchi dbg->de_same_endian = 1;
165*7fd79137SRobert Mustacchi dbg->de_copy_word = memcpy;
166*7fd79137SRobert Mustacchi obj = dbg->de_obj_file;
167*7fd79137SRobert Mustacchi endianness = obj->methods->get_byte_order(obj->object);
168*7fd79137SRobert Mustacchi #ifdef WORDS_BIGENDIAN
169*7fd79137SRobert Mustacchi dbg->de_big_endian_object = 1;
170*7fd79137SRobert Mustacchi if (endianness == DW_OBJECT_LSB ) {
171*7fd79137SRobert Mustacchi dbg->de_same_endian = 0;
172*7fd79137SRobert Mustacchi dbg->de_big_endian_object = 0;
173*7fd79137SRobert Mustacchi dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
174*7fd79137SRobert Mustacchi }
175*7fd79137SRobert Mustacchi #else /* little endian */
176*7fd79137SRobert Mustacchi dbg->de_big_endian_object = 0;
177*7fd79137SRobert Mustacchi if (endianness == DW_OBJECT_MSB ) {
178*7fd79137SRobert Mustacchi dbg->de_same_endian = 0;
179*7fd79137SRobert Mustacchi dbg->de_big_endian_object = 1;
180*7fd79137SRobert Mustacchi dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
181*7fd79137SRobert Mustacchi }
182*7fd79137SRobert Mustacchi #endif /* !WORDS_BIGENDIAN */
183*7fd79137SRobert Mustacchi
184*7fd79137SRobert Mustacchi
185*7fd79137SRobert Mustacchi /* The following de_length_size is Not Too Significant. Only used
186*7fd79137SRobert Mustacchi one calculation, and an approximate one at that. */
187*7fd79137SRobert Mustacchi dbg->de_length_size = obj->methods->get_length_size(obj->object);
188*7fd79137SRobert Mustacchi dbg->de_pointer_size = obj->methods->get_pointer_size(obj->object);
189*7fd79137SRobert Mustacchi
190*7fd79137SRobert Mustacchi section_count = obj->methods->get_section_count(obj->object);
191*7fd79137SRobert Mustacchi
192*7fd79137SRobert Mustacchi /* We can skip index 0 when considering ELF files, but not other
193*7fd79137SRobert Mustacchi object types. */
194*7fd79137SRobert Mustacchi for (section_index = 0; section_index < section_count;
195*7fd79137SRobert Mustacchi ++section_index) {
196*7fd79137SRobert Mustacchi
197*7fd79137SRobert Mustacchi struct Dwarf_Obj_Access_Section_s doas;
198*7fd79137SRobert Mustacchi int res = DW_DLV_ERROR;
199*7fd79137SRobert Mustacchi int err;
200*7fd79137SRobert Mustacchi
201*7fd79137SRobert Mustacchi res = obj->methods->get_section_info(obj->object,
202*7fd79137SRobert Mustacchi section_index,
203*7fd79137SRobert Mustacchi &doas, &err);
204*7fd79137SRobert Mustacchi if(res == DW_DLV_ERROR){
205*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
206*7fd79137SRobert Mustacchi }
207*7fd79137SRobert Mustacchi
208*7fd79137SRobert Mustacchi section_addr = doas.addr;
209*7fd79137SRobert Mustacchi section_size = doas.size;
210*7fd79137SRobert Mustacchi scn_name = doas.name;
211*7fd79137SRobert Mustacchi
212*7fd79137SRobert Mustacchi if (strncmp(scn_name, ".debug_", 7)
213*7fd79137SRobert Mustacchi && strcmp(scn_name, ".eh_frame")
214*7fd79137SRobert Mustacchi && strcmp(scn_name, ".symtab")
215*7fd79137SRobert Mustacchi && strcmp(scn_name, ".strtab")
216*7fd79137SRobert Mustacchi && strncmp(scn_name, ".rela.",6)) {
217*7fd79137SRobert Mustacchi continue;
218*7fd79137SRobert Mustacchi }
219*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_info") == 0) {
220*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_info, &doas,
221*7fd79137SRobert Mustacchi section_index,error,
222*7fd79137SRobert Mustacchi DW_DLE_DEBUG_INFO_DUPLICATE,DW_DLE_DEBUG_INFO_NULL);
223*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
224*7fd79137SRobert Mustacchi return res;
225*7fd79137SRobert Mustacchi }
226*7fd79137SRobert Mustacchi foundDwarf = TRUE;
227*7fd79137SRobert Mustacchi }
228*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_abbrev") == 0) {
229*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_abbrev, &doas,
230*7fd79137SRobert Mustacchi section_index,error,
231*7fd79137SRobert Mustacchi DW_DLE_DEBUG_ABBREV_DUPLICATE,DW_DLE_DEBUG_ABBREV_NULL);
232*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
233*7fd79137SRobert Mustacchi return res;
234*7fd79137SRobert Mustacchi }
235*7fd79137SRobert Mustacchi }
236*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_aranges") == 0) {
237*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_aranges, &doas,
238*7fd79137SRobert Mustacchi section_index,error,
239*7fd79137SRobert Mustacchi DW_DLE_DEBUG_ARANGES_DUPLICATE,0);
240*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
241*7fd79137SRobert Mustacchi return res;
242*7fd79137SRobert Mustacchi }
243*7fd79137SRobert Mustacchi }
244*7fd79137SRobert Mustacchi
245*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_line") == 0) {
246*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_line, &doas,
247*7fd79137SRobert Mustacchi section_index,error,
248*7fd79137SRobert Mustacchi DW_DLE_DEBUG_LINE_DUPLICATE,0);
249*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
250*7fd79137SRobert Mustacchi return res;
251*7fd79137SRobert Mustacchi }
252*7fd79137SRobert Mustacchi }
253*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_frame") == 0) {
254*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_frame, &doas,
255*7fd79137SRobert Mustacchi section_index,error,
256*7fd79137SRobert Mustacchi DW_DLE_DEBUG_FRAME_DUPLICATE,0);
257*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
258*7fd79137SRobert Mustacchi return res;
259*7fd79137SRobert Mustacchi }
260*7fd79137SRobert Mustacchi foundDwarf = TRUE;
261*7fd79137SRobert Mustacchi } else if (strcmp(scn_name, ".eh_frame") == 0) {
262*7fd79137SRobert Mustacchi /* gnu egcs-1.1.2 data */
263*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_frame_eh_gnu, &doas,
264*7fd79137SRobert Mustacchi section_index,error,
265*7fd79137SRobert Mustacchi DW_DLE_DEBUG_FRAME_DUPLICATE,0);
266*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
267*7fd79137SRobert Mustacchi return res;
268*7fd79137SRobert Mustacchi }
269*7fd79137SRobert Mustacchi foundDwarf = TRUE;
270*7fd79137SRobert Mustacchi }
271*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_loc") == 0) {
272*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_loc, &doas,
273*7fd79137SRobert Mustacchi section_index,error,
274*7fd79137SRobert Mustacchi DW_DLE_DEBUG_LOC_DUPLICATE,0);
275*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
276*7fd79137SRobert Mustacchi return res;
277*7fd79137SRobert Mustacchi }
278*7fd79137SRobert Mustacchi }
279*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_pubnames") == 0) {
280*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_pubnames, &doas,
281*7fd79137SRobert Mustacchi section_index,error,
282*7fd79137SRobert Mustacchi DW_DLE_DEBUG_PUBNAMES_DUPLICATE,0);
283*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
284*7fd79137SRobert Mustacchi return res;
285*7fd79137SRobert Mustacchi }
286*7fd79137SRobert Mustacchi }
287*7fd79137SRobert Mustacchi
288*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_str") == 0) {
289*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_str, &doas,
290*7fd79137SRobert Mustacchi section_index,error,
291*7fd79137SRobert Mustacchi DW_DLE_DEBUG_STR_DUPLICATE,0);
292*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
293*7fd79137SRobert Mustacchi return res;
294*7fd79137SRobert Mustacchi }
295*7fd79137SRobert Mustacchi }
296*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_funcnames") == 0) {
297*7fd79137SRobert Mustacchi /* SGI IRIX-only. */
298*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_funcnames, &doas,
299*7fd79137SRobert Mustacchi section_index,error,
300*7fd79137SRobert Mustacchi DW_DLE_DEBUG_FUNCNAMES_DUPLICATE,0);
301*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
302*7fd79137SRobert Mustacchi return res;
303*7fd79137SRobert Mustacchi }
304*7fd79137SRobert Mustacchi }
305*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_typenames") == 0) {
306*7fd79137SRobert Mustacchi /* SGI IRIX-only, created years before DWARF3. Content
307*7fd79137SRobert Mustacchi essentially identical to .debug_pubtypes. */
308*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_typenames, &doas,
309*7fd79137SRobert Mustacchi section_index,error,
310*7fd79137SRobert Mustacchi DW_DLE_DEBUG_TYPENAMES_DUPLICATE,0);
311*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
312*7fd79137SRobert Mustacchi return res;
313*7fd79137SRobert Mustacchi }
314*7fd79137SRobert Mustacchi } else if (strcmp(scn_name, ".debug_pubtypes") == 0) {
315*7fd79137SRobert Mustacchi /* Section new in DWARF3. */
316*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_pubtypes, &doas,
317*7fd79137SRobert Mustacchi section_index,error,
318*7fd79137SRobert Mustacchi DW_DLE_DEBUG_PUBTYPES_DUPLICATE,0);
319*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
320*7fd79137SRobert Mustacchi return res;
321*7fd79137SRobert Mustacchi }
322*7fd79137SRobert Mustacchi }
323*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_varnames") == 0) {
324*7fd79137SRobert Mustacchi /* SGI IRIX-only. */
325*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_varnames, &doas,
326*7fd79137SRobert Mustacchi section_index,error,
327*7fd79137SRobert Mustacchi DW_DLE_DEBUG_VARNAMES_DUPLICATE,0);
328*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
329*7fd79137SRobert Mustacchi return res;
330*7fd79137SRobert Mustacchi }
331*7fd79137SRobert Mustacchi }
332*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_weaknames") == 0) {
333*7fd79137SRobert Mustacchi /* SGI IRIX-only. */
334*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_weaknames, &doas,
335*7fd79137SRobert Mustacchi section_index,error,
336*7fd79137SRobert Mustacchi DW_DLE_DEBUG_WEAKNAMES_DUPLICATE,0);
337*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
338*7fd79137SRobert Mustacchi return res;
339*7fd79137SRobert Mustacchi }
340*7fd79137SRobert Mustacchi } else if (strcmp(scn_name, ".debug_macinfo") == 0) {
341*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_macinfo, &doas,
342*7fd79137SRobert Mustacchi section_index,error,
343*7fd79137SRobert Mustacchi DW_DLE_DEBUG_MACINFO_DUPLICATE,0);
344*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
345*7fd79137SRobert Mustacchi return res;
346*7fd79137SRobert Mustacchi }
347*7fd79137SRobert Mustacchi }
348*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".debug_ranges") == 0) {
349*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_debug_ranges, &doas,
350*7fd79137SRobert Mustacchi section_index,error,
351*7fd79137SRobert Mustacchi DW_DLE_DEBUG_RANGES_DUPLICATE,0);
352*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
353*7fd79137SRobert Mustacchi return res;
354*7fd79137SRobert Mustacchi }
355*7fd79137SRobert Mustacchi foundDwarf = TRUE;
356*7fd79137SRobert Mustacchi }
357*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".symtab") == 0) {
358*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_elf_symtab, &doas,
359*7fd79137SRobert Mustacchi section_index,error,
360*7fd79137SRobert Mustacchi DW_DLE_DEBUG_SYMTAB_ERR,0);
361*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
362*7fd79137SRobert Mustacchi return res;
363*7fd79137SRobert Mustacchi }
364*7fd79137SRobert Mustacchi }
365*7fd79137SRobert Mustacchi else if (strcmp(scn_name, ".strtab") == 0) {
366*7fd79137SRobert Mustacchi res = get_basic_section_data(dbg,&dbg->de_elf_strtab, &doas,
367*7fd79137SRobert Mustacchi section_index,error,
368*7fd79137SRobert Mustacchi DW_DLE_DEBUG_STRTAB_ERR,0);
369*7fd79137SRobert Mustacchi if(res != DW_DLV_OK) {
370*7fd79137SRobert Mustacchi return res;
371*7fd79137SRobert Mustacchi }
372*7fd79137SRobert Mustacchi }
373*7fd79137SRobert Mustacchi else if (strncmp(scn_name, ".rela.debug_",12) == 0) {
374*7fd79137SRobert Mustacchi const char *rcn_name = scn_name + 5;
375*7fd79137SRobert Mustacchi if (strcmp(rcn_name, ".debug_info") == 0) {
376*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_info,&doas,section_index);
377*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_abbrev") == 0) {
378*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_abbrev,&doas,section_index);
379*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_aranges") == 0) {
380*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_aranges,&doas,section_index);
381*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_line") == 0) {
382*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_line,&doas,section_index);
383*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_frame") == 0) {
384*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_frame,&doas,section_index);
385*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".eh_frame") == 0) {
386*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_frame_eh_gnu,&doas,section_index);
387*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_loc") == 0) {
388*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_loc,&doas,section_index);
389*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_pubnames") == 0) {
390*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_pubnames,&doas,section_index);
391*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_str") == 0) {
392*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_str,&doas,section_index);
393*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_funcnames") == 0) {
394*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_funcnames,&doas,section_index);
395*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_typenames") == 0) {
396*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_typenames,&doas,section_index);
397*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_pubtypes") == 0) {
398*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_pubtypes,&doas,section_index);
399*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_varnames") == 0) {
400*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_varnames,&doas,section_index);
401*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_weaknames") == 0) {
402*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_weaknames,&doas,section_index);
403*7fd79137SRobert Mustacchi } else if (strcmp(rcn_name, ".debug_macinfo") == 0) {
404*7fd79137SRobert Mustacchi add_rela_data(&dbg->de_debug_macinfo,&doas,section_index);
405*7fd79137SRobert Mustacchi }
406*7fd79137SRobert Mustacchi }
407*7fd79137SRobert Mustacchi }
408*7fd79137SRobert Mustacchi if (foundDwarf) {
409*7fd79137SRobert Mustacchi return DW_DLV_OK;
410*7fd79137SRobert Mustacchi }
411*7fd79137SRobert Mustacchi return DW_DLV_NO_ENTRY;
412*7fd79137SRobert Mustacchi }
413*7fd79137SRobert Mustacchi
414*7fd79137SRobert Mustacchi
415*7fd79137SRobert Mustacchi /*
416*7fd79137SRobert Mustacchi Use a Dwarf_Obj_Access_Interface to kick things off. All other
417*7fd79137SRobert Mustacchi init routines eventually use this one.
418*7fd79137SRobert Mustacchi The returned Dwarf_Debug contains a copy of *obj
419*7fd79137SRobert Mustacchi the callers copy of *obj may be freed whenever the caller
420*7fd79137SRobert Mustacchi wishes.
421*7fd79137SRobert Mustacchi */
422*7fd79137SRobert Mustacchi int
dwarf_object_init(Dwarf_Obj_Access_Interface * obj,Dwarf_Handler errhand,Dwarf_Ptr errarg,Dwarf_Debug * ret_dbg,Dwarf_Error * error)423*7fd79137SRobert Mustacchi dwarf_object_init(Dwarf_Obj_Access_Interface* obj, Dwarf_Handler errhand,
424*7fd79137SRobert Mustacchi Dwarf_Ptr errarg, Dwarf_Debug* ret_dbg,
425*7fd79137SRobert Mustacchi Dwarf_Error* error)
426*7fd79137SRobert Mustacchi {
427*7fd79137SRobert Mustacchi Dwarf_Debug dbg = 0;
428*7fd79137SRobert Mustacchi int setup_result = DW_DLV_OK;
429*7fd79137SRobert Mustacchi
430*7fd79137SRobert Mustacchi dbg = _dwarf_get_debug();
431*7fd79137SRobert Mustacchi if (dbg == NULL) {
432*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
433*7fd79137SRobert Mustacchi }
434*7fd79137SRobert Mustacchi dbg->de_errhand = errhand;
435*7fd79137SRobert Mustacchi dbg->de_errarg = errarg;
436*7fd79137SRobert Mustacchi dbg->de_frame_rule_initial_value = DW_FRAME_REG_INITIAL_VALUE;
437*7fd79137SRobert Mustacchi dbg->de_frame_reg_rules_entry_count = DW_FRAME_LAST_REG_NUM;
438*7fd79137SRobert Mustacchi #ifdef HAVE_OLD_FRAME_CFA_COL
439*7fd79137SRobert Mustacchi /* DW_FRAME_CFA_COL is really only suitable for old libdwarf frame
440*7fd79137SRobert Mustacchi interfaces and its value of 0 there is only usable where
441*7fd79137SRobert Mustacchi (as in MIPS) register 0 has no value other than 0 so
442*7fd79137SRobert Mustacchi we can use the frame table column 0 for the CFA value
443*7fd79137SRobert Mustacchi (and rely on client software to know when 'register 0'
444*7fd79137SRobert Mustacchi is the cfa and when to just use a value 0 for register 0).
445*7fd79137SRobert Mustacchi */
446*7fd79137SRobert Mustacchi dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL;
447*7fd79137SRobert Mustacchi #else
448*7fd79137SRobert Mustacchi dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL3;
449*7fd79137SRobert Mustacchi #endif
450*7fd79137SRobert Mustacchi dbg->de_frame_same_value_number = DW_FRAME_SAME_VAL;
451*7fd79137SRobert Mustacchi dbg->de_frame_undefined_value_number = DW_FRAME_UNDEFINED_VAL;
452*7fd79137SRobert Mustacchi
453*7fd79137SRobert Mustacchi dbg->de_obj_file = obj;
454*7fd79137SRobert Mustacchi
455*7fd79137SRobert Mustacchi setup_result = _dwarf_setup(dbg, error);
456*7fd79137SRobert Mustacchi if (setup_result != DW_DLV_OK) {
457*7fd79137SRobert Mustacchi /* The status we want to return here is of _dwarf_setup,
458*7fd79137SRobert Mustacchi not of the _dwarf_free_all_of_one_debug(dbg) call.
459*7fd79137SRobert Mustacchi So use a local status variable for the free. */
460*7fd79137SRobert Mustacchi int freeresult = _dwarf_free_all_of_one_debug(dbg);
461*7fd79137SRobert Mustacchi if (freeresult == DW_DLV_ERROR) {
462*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
463*7fd79137SRobert Mustacchi }
464*7fd79137SRobert Mustacchi dwarf_malloc_check_complete("After Final free");
465*7fd79137SRobert Mustacchi return setup_result;
466*7fd79137SRobert Mustacchi }
467*7fd79137SRobert Mustacchi
468*7fd79137SRobert Mustacchi dwarf_harmless_init(&dbg->de_harmless_errors,
469*7fd79137SRobert Mustacchi DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE);
470*7fd79137SRobert Mustacchi
471*7fd79137SRobert Mustacchi /* This call cannot fail: allocates nothing, releases nothing */
472*7fd79137SRobert Mustacchi _dwarf_setup_debug(dbg);
473*7fd79137SRobert Mustacchi
474*7fd79137SRobert Mustacchi
475*7fd79137SRobert Mustacchi *ret_dbg = dbg;
476*7fd79137SRobert Mustacchi return DW_DLV_OK;
477*7fd79137SRobert Mustacchi }
478*7fd79137SRobert Mustacchi
479*7fd79137SRobert Mustacchi
480*7fd79137SRobert Mustacchi /*
481*7fd79137SRobert Mustacchi A finish routine that is completely unaware of ELF.
482*7fd79137SRobert Mustacchi
483*7fd79137SRobert Mustacchi Frees all memory that was not previously freed by
484*7fd79137SRobert Mustacchi dwarf_dealloc.
485*7fd79137SRobert Mustacchi Aside frmo certain categories.
486*7fd79137SRobert Mustacchi */
487*7fd79137SRobert Mustacchi int
dwarf_object_finish(Dwarf_Debug dbg,Dwarf_Error * error)488*7fd79137SRobert Mustacchi dwarf_object_finish(Dwarf_Debug dbg, Dwarf_Error * error)
489*7fd79137SRobert Mustacchi {
490*7fd79137SRobert Mustacchi int res = DW_DLV_OK;
491*7fd79137SRobert Mustacchi
492*7fd79137SRobert Mustacchi res = _dwarf_free_all_of_one_debug(dbg);
493*7fd79137SRobert Mustacchi if (res == DW_DLV_ERROR) {
494*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
495*7fd79137SRobert Mustacchi }
496*7fd79137SRobert Mustacchi dwarf_malloc_check_complete("After Final free");
497*7fd79137SRobert Mustacchi
498*7fd79137SRobert Mustacchi return res;
499*7fd79137SRobert Mustacchi }
500*7fd79137SRobert Mustacchi
501*7fd79137SRobert Mustacchi
502*7fd79137SRobert Mustacchi /*
503*7fd79137SRobert Mustacchi Load the ELF section with the specified index and set the
504*7fd79137SRobert Mustacchi pointer pointed to by section_data to the memory where it
505*7fd79137SRobert Mustacchi was loaded.
506*7fd79137SRobert Mustacchi */
507*7fd79137SRobert Mustacchi int
_dwarf_load_section(Dwarf_Debug dbg,struct Dwarf_Section_s * section,Dwarf_Error * error)508*7fd79137SRobert Mustacchi _dwarf_load_section(Dwarf_Debug dbg,
509*7fd79137SRobert Mustacchi struct Dwarf_Section_s *section,
510*7fd79137SRobert Mustacchi Dwarf_Error * error)
511*7fd79137SRobert Mustacchi {
512*7fd79137SRobert Mustacchi int res = DW_DLV_ERROR;
513*7fd79137SRobert Mustacchi int err = 0;
514*7fd79137SRobert Mustacchi struct Dwarf_Obj_Access_Interface_s *o = 0;
515*7fd79137SRobert Mustacchi
516*7fd79137SRobert Mustacchi /* check to see if the section is already loaded */
517*7fd79137SRobert Mustacchi if (section->dss_data != NULL) {
518*7fd79137SRobert Mustacchi return DW_DLV_OK;
519*7fd79137SRobert Mustacchi }
520*7fd79137SRobert Mustacchi o = dbg->de_obj_file;
521*7fd79137SRobert Mustacchi res = o->methods->load_section(
522*7fd79137SRobert Mustacchi o->object, section->dss_index,
523*7fd79137SRobert Mustacchi §ion->dss_data, &err);
524*7fd79137SRobert Mustacchi if(res == DW_DLV_ERROR){
525*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
526*7fd79137SRobert Mustacchi }
527*7fd79137SRobert Mustacchi if(_dwarf_apply_relocs == 0) {
528*7fd79137SRobert Mustacchi return res;
529*7fd79137SRobert Mustacchi }
530*7fd79137SRobert Mustacchi if(section->dss_reloc_size == 0) {
531*7fd79137SRobert Mustacchi return res;
532*7fd79137SRobert Mustacchi }
533*7fd79137SRobert Mustacchi if(!o->methods->relocate_a_section) {
534*7fd79137SRobert Mustacchi return res;
535*7fd79137SRobert Mustacchi }
536*7fd79137SRobert Mustacchi /*apply relocations */
537*7fd79137SRobert Mustacchi res = o->methods->relocate_a_section( o->object, section->dss_index,
538*7fd79137SRobert Mustacchi dbg, &err);
539*7fd79137SRobert Mustacchi if(res == DW_DLV_ERROR) {
540*7fd79137SRobert Mustacchi DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
541*7fd79137SRobert Mustacchi }
542*7fd79137SRobert Mustacchi return res;
543*7fd79137SRobert Mustacchi }
544*7fd79137SRobert Mustacchi
545*7fd79137SRobert Mustacchi /* This is a hack so clients can verify offsets.
546*7fd79137SRobert Mustacchi Added April 2005 so that debugger can detect broken offsets
547*7fd79137SRobert Mustacchi (which happened in an IRIX -64 executable larger than 2GB
548*7fd79137SRobert Mustacchi using MIPSpro 7.3.1.3 compilers. A couple .debug_pubnames
549*7fd79137SRobert Mustacchi offsets were wrong.).
550*7fd79137SRobert Mustacchi */
551*7fd79137SRobert Mustacchi int
dwarf_get_section_max_offsets(Dwarf_Debug dbg,Dwarf_Unsigned * debug_info_size,Dwarf_Unsigned * debug_abbrev_size,Dwarf_Unsigned * debug_line_size,Dwarf_Unsigned * debug_loc_size,Dwarf_Unsigned * debug_aranges_size,Dwarf_Unsigned * debug_macinfo_size,Dwarf_Unsigned * debug_pubnames_size,Dwarf_Unsigned * debug_str_size,Dwarf_Unsigned * debug_frame_size,Dwarf_Unsigned * debug_ranges_size,Dwarf_Unsigned * debug_typenames_size)552*7fd79137SRobert Mustacchi dwarf_get_section_max_offsets(Dwarf_Debug dbg,
553*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_info_size,
554*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_abbrev_size,
555*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_line_size,
556*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_loc_size,
557*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_aranges_size,
558*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_macinfo_size,
559*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_pubnames_size,
560*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_str_size,
561*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_frame_size,
562*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_ranges_size,
563*7fd79137SRobert Mustacchi Dwarf_Unsigned * debug_typenames_size)
564*7fd79137SRobert Mustacchi {
565*7fd79137SRobert Mustacchi *debug_info_size = dbg->de_debug_info.dss_size;
566*7fd79137SRobert Mustacchi *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
567*7fd79137SRobert Mustacchi *debug_line_size = dbg->de_debug_line.dss_size;
568*7fd79137SRobert Mustacchi *debug_loc_size = dbg->de_debug_loc.dss_size;
569*7fd79137SRobert Mustacchi *debug_aranges_size = dbg->de_debug_aranges.dss_size;
570*7fd79137SRobert Mustacchi *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
571*7fd79137SRobert Mustacchi *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
572*7fd79137SRobert Mustacchi *debug_str_size = dbg->de_debug_str.dss_size;
573*7fd79137SRobert Mustacchi *debug_frame_size = dbg->de_debug_frame.dss_size;
574*7fd79137SRobert Mustacchi *debug_ranges_size = dbg->de_debug_ranges.dss_size;
575*7fd79137SRobert Mustacchi *debug_typenames_size = dbg->de_debug_typenames.dss_size;
576*7fd79137SRobert Mustacchi return DW_DLV_OK;
577*7fd79137SRobert Mustacchi }
578