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