xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_init_finish.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000,2002,2003,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
3bc1f688bSRobert Mustacchi   Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2009-2019 David Anderson. All Rights Reserved.
5*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
6bc1f688bSRobert Mustacchi 
7bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
8bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
9bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
10bc1f688bSRobert Mustacchi 
11bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
12bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
13bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14bc1f688bSRobert Mustacchi 
15bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
16bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
17bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
18bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
19bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
20bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
21bc1f688bSRobert Mustacchi 
22bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
23bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
24bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25bc1f688bSRobert Mustacchi   USA.
26bc1f688bSRobert Mustacchi 
27bc1f688bSRobert Mustacchi */
28bc1f688bSRobert Mustacchi 
29bc1f688bSRobert Mustacchi #include "config.h"
30bc1f688bSRobert Mustacchi #include <stdio.h>
31bc1f688bSRobert Mustacchi #include <sys/stat.h>
32bc1f688bSRobert Mustacchi #include <sys/types.h>
33bc1f688bSRobert Mustacchi #include <string.h>
34*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
35bc1f688bSRobert Mustacchi #include <stdlib.h>
36*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
37*4d9fdb46SRobert Mustacchi #ifdef HAVE_MALLOC_H
38*4d9fdb46SRobert Mustacchi /* Useful include for some Windows compilers. */
39*4d9fdb46SRobert Mustacchi #include <malloc.h>
40*4d9fdb46SRobert Mustacchi #endif /* HAVE_MALLOC_H */
41bc1f688bSRobert Mustacchi #include "dwarf_incl.h"
42*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
43*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
44*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
45*4d9fdb46SRobert Mustacchi #include "memcpy_swap.h"
46*4d9fdb46SRobert Mustacchi #include "dwarf_harmless.h"
47*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
48*4d9fdb46SRobert Mustacchi 
49*4d9fdb46SRobert Mustacchi /* For consistency, use the HAVE_LIBELF_H symbol */
50*4d9fdb46SRobert Mustacchi #ifdef HAVE_LIBELF_H
51*4d9fdb46SRobert Mustacchi #include <libelf.h>
52*4d9fdb46SRobert Mustacchi #else
53*4d9fdb46SRobert Mustacchi #ifdef HAVE_LIBELF_LIBELF_H
54*4d9fdb46SRobert Mustacchi #include <libelf/libelf.h>
55*4d9fdb46SRobert Mustacchi #endif
56*4d9fdb46SRobert Mustacchi #endif
57*4d9fdb46SRobert Mustacchi #ifdef HAVE_ZLIB
58*4d9fdb46SRobert Mustacchi #include "zlib.h"
59*4d9fdb46SRobert Mustacchi #endif
60*4d9fdb46SRobert Mustacchi 
61*4d9fdb46SRobert Mustacchi #ifndef ELFCOMPRESS_ZLIB
62*4d9fdb46SRobert Mustacchi #define ELFCOMPRESS_ZLIB 1
63*4d9fdb46SRobert Mustacchi #endif
64*4d9fdb46SRobert Mustacchi 
65*4d9fdb46SRobert Mustacchi /*  If your mingw elf.h is missing SHT_RELA and you do not
66*4d9fdb46SRobert Mustacchi     need SHT_RELA support
67*4d9fdb46SRobert Mustacchi     this define should work for you.
68*4d9fdb46SRobert Mustacchi     It is the elf value, hopefully it will
69*4d9fdb46SRobert Mustacchi     not cause trouble. If does not work, try -1
70*4d9fdb46SRobert Mustacchi     or something else
71*4d9fdb46SRobert Mustacchi     and let us know what works.  */
72*4d9fdb46SRobert Mustacchi #ifndef SHT_RELA
73*4d9fdb46SRobert Mustacchi #define SHT_RELA 4
74*4d9fdb46SRobert Mustacchi #endif
75*4d9fdb46SRobert Mustacchi #ifndef SHT_REL
76*4d9fdb46SRobert Mustacchi #define SHT_REL 9
77*4d9fdb46SRobert Mustacchi # endif
78*4d9fdb46SRobert Mustacchi /*  For COMDAT GROUPS. Guarantees we can compile. We hope. */
79*4d9fdb46SRobert Mustacchi #ifndef SHT_GROUP
80*4d9fdb46SRobert Mustacchi #define SHT_GROUP 17
81*4d9fdb46SRobert Mustacchi #endif
82*4d9fdb46SRobert Mustacchi 
83*4d9fdb46SRobert Mustacchi #ifndef SHF_COMPRESSED
84*4d9fdb46SRobert Mustacchi /*  This from ubuntu xenial. Is in top of trunk binutils
85*4d9fdb46SRobert Mustacchi     as of February 2016. Elf Section Flag */
86*4d9fdb46SRobert Mustacchi #define SHF_COMPRESSED (1 << 11)
87*4d9fdb46SRobert Mustacchi #endif
88*4d9fdb46SRobert Mustacchi 
89bc1f688bSRobert Mustacchi 
90bc1f688bSRobert Mustacchi #define DWARF_DBG_ERROR(dbg,errval,retval) \
91bc1f688bSRobert Mustacchi     _dwarf_error(dbg, error, errval); return(retval);
92bc1f688bSRobert Mustacchi 
93bc1f688bSRobert Mustacchi #define FALSE 0
94bc1f688bSRobert Mustacchi #define TRUE  1
95bc1f688bSRobert Mustacchi 
96*4d9fdb46SRobert Mustacchi /*  Global definition of the function pointer type, typedef
97*4d9fdb46SRobert Mustacchi     in dwarf_opaque.h */
98*4d9fdb46SRobert Mustacchi _dwarf_get_elf_flags_func_ptr_type _dwarf_get_elf_flags_func_ptr;
99bc1f688bSRobert Mustacchi 
100bc1f688bSRobert Mustacchi /* This static is copied to the dbg on dbg init
101bc1f688bSRobert Mustacchi    so that the static need not be referenced at
102bc1f688bSRobert Mustacchi    run time, preserving better locality of
103bc1f688bSRobert Mustacchi    reference.
104bc1f688bSRobert Mustacchi    Value is 0 means do the string check.
105bc1f688bSRobert Mustacchi    Value non-zero means do not do the check.
106bc1f688bSRobert Mustacchi */
107*4d9fdb46SRobert Mustacchi static Dwarf_Small _dwarf_assume_string_in_bounds;
108bc1f688bSRobert Mustacchi static Dwarf_Small _dwarf_apply_relocs = 1;
109bc1f688bSRobert Mustacchi 
110bc1f688bSRobert Mustacchi /*  Call this after calling dwarf_init but before doing anything else.
111*4d9fdb46SRobert Mustacchi     It applies to all objects, not just the current object.  */
112bc1f688bSRobert Mustacchi int
dwarf_set_reloc_application(int apply)113bc1f688bSRobert Mustacchi dwarf_set_reloc_application(int apply)
114bc1f688bSRobert Mustacchi {
115bc1f688bSRobert Mustacchi     int oldval = _dwarf_apply_relocs;
116bc1f688bSRobert Mustacchi     _dwarf_apply_relocs = apply;
117bc1f688bSRobert Mustacchi     return oldval;
118bc1f688bSRobert Mustacchi }
119bc1f688bSRobert Mustacchi 
120bc1f688bSRobert Mustacchi int
dwarf_set_stringcheck(int newval)121bc1f688bSRobert Mustacchi dwarf_set_stringcheck(int newval)
122bc1f688bSRobert Mustacchi {
123*4d9fdb46SRobert Mustacchi     int oldval = _dwarf_assume_string_in_bounds;
124bc1f688bSRobert Mustacchi 
125*4d9fdb46SRobert Mustacchi     _dwarf_assume_string_in_bounds = newval;
126bc1f688bSRobert Mustacchi     return oldval;
127bc1f688bSRobert Mustacchi }
128bc1f688bSRobert Mustacchi 
129*4d9fdb46SRobert Mustacchi static int
startswith(const char * input,char * ckfor)130*4d9fdb46SRobert Mustacchi startswith(const char * input, char* ckfor)
131*4d9fdb46SRobert Mustacchi {
132*4d9fdb46SRobert Mustacchi     size_t cklen = strlen(ckfor);
133*4d9fdb46SRobert Mustacchi 
134*4d9fdb46SRobert Mustacchi     if (! strncmp(input,ckfor,cklen)) {
135*4d9fdb46SRobert Mustacchi         return TRUE;
136*4d9fdb46SRobert Mustacchi     }
137*4d9fdb46SRobert Mustacchi     return FALSE;
138*4d9fdb46SRobert Mustacchi }
139*4d9fdb46SRobert Mustacchi #if 0
140*4d9fdb46SRobert Mustacchi static int
141*4d9fdb46SRobert Mustacchi endswith(const char * input, char* ckfor)
142*4d9fdb46SRobert Mustacchi {
143*4d9fdb46SRobert Mustacchi     size_t inlen = strlen(input);
144*4d9fdb46SRobert Mustacchi     size_t endlen = strlen(ckfor);
145*4d9fdb46SRobert Mustacchi     const char * endck = 0;
146*4d9fdb46SRobert Mustacchi 
147*4d9fdb46SRobert Mustacchi     if (endlen > inlen) {
148*4d9fdb46SRobert Mustacchi         return FALSE;
149*4d9fdb46SRobert Mustacchi     }
150*4d9fdb46SRobert Mustacchi     endck = input+inlen - endlen;
151*4d9fdb46SRobert Mustacchi 
152*4d9fdb46SRobert Mustacchi     if (! strcmp(endck,ckfor) ) {
153*4d9fdb46SRobert Mustacchi         return TRUE;
154*4d9fdb46SRobert Mustacchi     }
155*4d9fdb46SRobert Mustacchi     return FALSE;
156*4d9fdb46SRobert Mustacchi }
157*4d9fdb46SRobert Mustacchi #endif
158*4d9fdb46SRobert Mustacchi 
159bc1f688bSRobert Mustacchi /* Unifies the basic duplicate/empty testing and section
160*4d9fdb46SRobert Mustacchi    data setting to one place. */
161bc1f688bSRobert 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,unsigned group_number,Dwarf_Error * error,int duperr,int emptyerr)162bc1f688bSRobert Mustacchi get_basic_section_data(Dwarf_Debug dbg,
163bc1f688bSRobert Mustacchi     struct Dwarf_Section_s *secdata,
164bc1f688bSRobert Mustacchi     struct Dwarf_Obj_Access_Section_s *doas,
165bc1f688bSRobert Mustacchi     Dwarf_Half section_index,
166*4d9fdb46SRobert Mustacchi     unsigned group_number,
167bc1f688bSRobert Mustacchi     Dwarf_Error* error,
168bc1f688bSRobert Mustacchi     int duperr, int emptyerr )
169bc1f688bSRobert Mustacchi {
170*4d9fdb46SRobert Mustacchi     /*  There is an elf convention that section index 0  is reserved,
171*4d9fdb46SRobert Mustacchi         and that section is always empty.
172*4d9fdb46SRobert Mustacchi         Non-elf object formats must honor that by ensuring that
173*4d9fdb46SRobert Mustacchi         (when they assign numbers to 'sections' or 'section-like-things')
174*4d9fdb46SRobert Mustacchi         they never assign a real section section-number  0 to dss_index. */
175bc1f688bSRobert Mustacchi     if (secdata->dss_index != 0) {
176bc1f688bSRobert Mustacchi         DWARF_DBG_ERROR(dbg, duperr, DW_DLV_ERROR);
177bc1f688bSRobert Mustacchi     }
178bc1f688bSRobert Mustacchi     if (doas->size == 0) {
179*4d9fdb46SRobert Mustacchi         /*  As of 2018 it seems impossible to detect
180*4d9fdb46SRobert Mustacchi             (via dwarfdump) whether emptyerr has any
181*4d9fdb46SRobert Mustacchi             practical effect, whether TRUE or FALSE.  */
182bc1f688bSRobert Mustacchi         if (emptyerr == 0 ) {
183bc1f688bSRobert Mustacchi             /*  Allow empty section. */
184bc1f688bSRobert Mustacchi             return DW_DLV_OK;
185bc1f688bSRobert Mustacchi         }
186bc1f688bSRobert Mustacchi         /* Know no reason to allow section */
187bc1f688bSRobert Mustacchi         DWARF_DBG_ERROR(dbg, emptyerr, DW_DLV_ERROR);
188bc1f688bSRobert Mustacchi     }
189bc1f688bSRobert Mustacchi     secdata->dss_index = section_index;
190bc1f688bSRobert Mustacchi     secdata->dss_size = doas->size;
191*4d9fdb46SRobert Mustacchi     secdata->dss_group_number = group_number;
192bc1f688bSRobert Mustacchi     secdata->dss_addr = doas->addr;
193bc1f688bSRobert Mustacchi     secdata->dss_link = doas->link;
194*4d9fdb46SRobert Mustacchi     secdata->dss_entrysize = doas->entrysize;
195*4d9fdb46SRobert Mustacchi     if (_dwarf_get_elf_flags_func_ptr) {
196*4d9fdb46SRobert Mustacchi         /*  We do this so we do not need to update the public struct
197*4d9fdb46SRobert Mustacchi             Dwarf_Obj_Access_Section_s and thereby cause
198*4d9fdb46SRobert Mustacchi             binary and source incompatibility. */
199*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned flags = 0;
200*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned addralign = 0;
201*4d9fdb46SRobert Mustacchi         int res = 0;
202*4d9fdb46SRobert Mustacchi         int interr = 0;
203*4d9fdb46SRobert Mustacchi         struct Dwarf_Obj_Access_Interface_s *o = 0;
204*4d9fdb46SRobert Mustacchi 
205*4d9fdb46SRobert Mustacchi         o = dbg->de_obj_file;
206*4d9fdb46SRobert Mustacchi         res = _dwarf_get_elf_flags_func_ptr(
207*4d9fdb46SRobert Mustacchi             o->object, section_index,
208*4d9fdb46SRobert Mustacchi             &flags,&addralign,
209*4d9fdb46SRobert Mustacchi             &interr);
210*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_ERROR) {
211*4d9fdb46SRobert Mustacchi             /*  Should never get here. */
212*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, interr, DW_DLV_ERROR);
213*4d9fdb46SRobert Mustacchi         }
214*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_NO_ENTRY) {
215*4d9fdb46SRobert Mustacchi             return res;
216*4d9fdb46SRobert Mustacchi         }
217*4d9fdb46SRobert Mustacchi         secdata->dss_flags = flags;
218*4d9fdb46SRobert Mustacchi         secdata->dss_addralign = addralign;
219*4d9fdb46SRobert Mustacchi         if (flags & SHF_COMPRESSED) {
220*4d9fdb46SRobert Mustacchi             secdata->dss_shf_compressed = TRUE;
221*4d9fdb46SRobert Mustacchi         }
222*4d9fdb46SRobert Mustacchi         /*  We are not looking at section bytes so we
223*4d9fdb46SRobert Mustacchi             do not know if the first 4 bytes are ZLIB */
224*4d9fdb46SRobert Mustacchi     }
225bc1f688bSRobert Mustacchi     return DW_DLV_OK;
226bc1f688bSRobert Mustacchi }
227bc1f688bSRobert Mustacchi 
228bc1f688bSRobert Mustacchi 
229bc1f688bSRobert Mustacchi static void
add_relx_data_to_secdata(struct Dwarf_Section_s * secdata,struct Dwarf_Obj_Access_Section_s * doas,Dwarf_Half section_index,int is_rela)230*4d9fdb46SRobert Mustacchi add_relx_data_to_secdata( struct Dwarf_Section_s *secdata,
231bc1f688bSRobert Mustacchi     struct Dwarf_Obj_Access_Section_s *doas,
232*4d9fdb46SRobert Mustacchi     Dwarf_Half section_index,int is_rela)
233bc1f688bSRobert Mustacchi {
234bc1f688bSRobert Mustacchi     secdata->dss_reloc_index = section_index;
235bc1f688bSRobert Mustacchi     secdata->dss_reloc_size = doas->size;
236*4d9fdb46SRobert Mustacchi     secdata->dss_reloc_entrysize = doas->entrysize;
237bc1f688bSRobert Mustacchi     secdata->dss_reloc_addr = doas->addr;
238bc1f688bSRobert Mustacchi     secdata->dss_reloc_symtab = doas->link;
239bc1f688bSRobert Mustacchi     secdata->dss_reloc_link = doas->link;
240*4d9fdb46SRobert Mustacchi     secdata->dss_is_rela = is_rela;
241bc1f688bSRobert Mustacchi }
242bc1f688bSRobert Mustacchi 
243*4d9fdb46SRobert Mustacchi 
244*4d9fdb46SRobert Mustacchi 
245*4d9fdb46SRobert Mustacchi /*  Used to add the specific information for a debug related section
246*4d9fdb46SRobert Mustacchi     Called on each section of interest by section name.
247*4d9fdb46SRobert Mustacchi     DWARF_MAX_DEBUG_SECTIONS must be large enough to allow
248*4d9fdb46SRobert Mustacchi     that all sections of interest fit in the table.
249*4d9fdb46SRobert Mustacchi     returns DW_DLV_ERROR or DW_DLV_OK.
250*4d9fdb46SRobert Mustacchi     */
251*4d9fdb46SRobert Mustacchi static int
add_debug_section_info(Dwarf_Debug dbg,const char * name,const char * standard_section_name,unsigned obj_sec_num,struct Dwarf_Section_s * secdata,unsigned groupnum,int duperr,int emptyerr,int have_dwarf,int havezdebug,int * err)252*4d9fdb46SRobert Mustacchi add_debug_section_info(Dwarf_Debug dbg,
253*4d9fdb46SRobert Mustacchi     /* Name as seen in object file. */
254*4d9fdb46SRobert Mustacchi     const char *name,
255*4d9fdb46SRobert Mustacchi     const char *standard_section_name,
256*4d9fdb46SRobert Mustacchi     unsigned obj_sec_num,
257*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *secdata,
258*4d9fdb46SRobert Mustacchi     unsigned groupnum,
259*4d9fdb46SRobert Mustacchi     /*  The have_dwarf flag is a somewhat imprecise
260*4d9fdb46SRobert Mustacchi         way to determine if there is at least one 'meaningful'
261*4d9fdb46SRobert Mustacchi         DWARF information section present in the object file.
262*4d9fdb46SRobert Mustacchi         If not set on some section we claim (later) that there
263*4d9fdb46SRobert Mustacchi         is no DWARF info present. see 'foundDwarf' in this file */
264*4d9fdb46SRobert Mustacchi     int duperr,int emptyerr,int have_dwarf,
265*4d9fdb46SRobert Mustacchi     int havezdebug,
266*4d9fdb46SRobert Mustacchi     int *err)
267*4d9fdb46SRobert Mustacchi {
268*4d9fdb46SRobert Mustacchi     unsigned total_entries = dbg->de_debug_sections_total_entries;
269*4d9fdb46SRobert Mustacchi     if (secdata->dss_is_in_use) {
270*4d9fdb46SRobert Mustacchi         *err = duperr;
271*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
272*4d9fdb46SRobert Mustacchi     }
273*4d9fdb46SRobert Mustacchi     if (total_entries < DWARF_MAX_DEBUG_SECTIONS) {
274*4d9fdb46SRobert Mustacchi         struct Dwarf_dbg_sect_s *debug_section =
275*4d9fdb46SRobert Mustacchi             &dbg->de_debug_sections[total_entries];
276*4d9fdb46SRobert Mustacchi         secdata->dss_is_in_use = TRUE;
277*4d9fdb46SRobert Mustacchi         debug_section->ds_name = name;
278*4d9fdb46SRobert Mustacchi         debug_section->ds_number = obj_sec_num;
279*4d9fdb46SRobert Mustacchi         debug_section->ds_secdata = secdata;
280*4d9fdb46SRobert Mustacchi         debug_section->ds_groupnumber =  groupnum;
281*4d9fdb46SRobert Mustacchi         secdata->dss_name = name; /* Actual name from object file. */
282*4d9fdb46SRobert Mustacchi         secdata->dss_standard_name = standard_section_name;
283*4d9fdb46SRobert Mustacchi         secdata->dss_number = obj_sec_num;
284*4d9fdb46SRobert Mustacchi         secdata->dss_zdebug_requires_decompress = havezdebug;
285*4d9fdb46SRobert Mustacchi         /* We don't yet know about SHF_COMPRESSED */
286*4d9fdb46SRobert Mustacchi         debug_section->ds_duperr = duperr;
287*4d9fdb46SRobert Mustacchi         debug_section->ds_emptyerr = emptyerr;
288*4d9fdb46SRobert Mustacchi         debug_section->ds_have_dwarf = have_dwarf;
289*4d9fdb46SRobert Mustacchi         debug_section->ds_have_zdebug = havezdebug;
290*4d9fdb46SRobert Mustacchi         ++dbg->de_debug_sections_total_entries;
291*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
292*4d9fdb46SRobert Mustacchi     }
293*4d9fdb46SRobert Mustacchi     /*  This represents a bug in libdwarf.
294*4d9fdb46SRobert Mustacchi         Mis-setup-DWARF_MAX_DEBUG_SECTIONS.
295*4d9fdb46SRobert Mustacchi         Or possibly a use of section groups that is
296*4d9fdb46SRobert Mustacchi         not supported.  */
297*4d9fdb46SRobert Mustacchi     *err = DW_DLE_TOO_MANY_DEBUG;
298*4d9fdb46SRobert Mustacchi     return DW_DLV_ERROR;
299*4d9fdb46SRobert Mustacchi }
300*4d9fdb46SRobert Mustacchi 
301*4d9fdb46SRobert Mustacchi 
302*4d9fdb46SRobert Mustacchi #if 0
303*4d9fdb46SRobert Mustacchi static void
304*4d9fdb46SRobert Mustacchi dump_bytes(const char *msg,Dwarf_Small * start, long len)
305*4d9fdb46SRobert Mustacchi {
306*4d9fdb46SRobert Mustacchi     Dwarf_Small *end = start + len;
307*4d9fdb46SRobert Mustacchi     Dwarf_Small *cur = start;
308*4d9fdb46SRobert Mustacchi 
309*4d9fdb46SRobert Mustacchi     printf("dump_bytes: %s ",msg);
310*4d9fdb46SRobert Mustacchi     for (; cur < end; cur++) {
311*4d9fdb46SRobert Mustacchi         printf("%02x",*cur);
312*4d9fdb46SRobert Mustacchi     }
313*4d9fdb46SRobert Mustacchi     printf("\n");
314*4d9fdb46SRobert Mustacchi }
315*4d9fdb46SRobert Mustacchi 
316*4d9fdb46SRobert Mustacchi static int
317*4d9fdb46SRobert Mustacchi all_sig8_bits_zero(Dwarf_Sig8 *val)
318*4d9fdb46SRobert Mustacchi {
319*4d9fdb46SRobert Mustacchi     unsigned u = 0;
320*4d9fdb46SRobert Mustacchi     for(  ; u < sizeof(*val); ++u) {
321*4d9fdb46SRobert Mustacchi         if (val->signature[u] != 0) {
322*4d9fdb46SRobert Mustacchi             return FALSE;
323*4d9fdb46SRobert Mustacchi         }
324*4d9fdb46SRobert Mustacchi     }
325*4d9fdb46SRobert Mustacchi     return TRUE;
326*4d9fdb46SRobert Mustacchi }
327*4d9fdb46SRobert Mustacchi #endif
328*4d9fdb46SRobert Mustacchi 
329*4d9fdb46SRobert Mustacchi 
330*4d9fdb46SRobert Mustacchi /* Return DW_DLV_OK etc. */
331*4d9fdb46SRobert Mustacchi static int
set_up_section(Dwarf_Debug dbg,const char * secname,const char * sec_standard_name,unsigned obj_sec_num,const char * targname,unsigned groupnum_of_sec,struct Dwarf_Section_s * secdata,int duperr,int emptyerr,int have_dwarf,int * err)332*4d9fdb46SRobert Mustacchi set_up_section(Dwarf_Debug dbg,
333*4d9fdb46SRobert Mustacchi     /*  Section name from object format.
334*4d9fdb46SRobert Mustacchi         Might start with .zdebug not .debug if compressed section. */
335*4d9fdb46SRobert Mustacchi     const char *secname,
336*4d9fdb46SRobert Mustacchi     /*  Standard section name, such as .debug_info */
337*4d9fdb46SRobert Mustacchi     const char *sec_standard_name,
338*4d9fdb46SRobert Mustacchi     /*  Section number from object format  */
339*4d9fdb46SRobert Mustacchi     unsigned obj_sec_num,
340*4d9fdb46SRobert Mustacchi     /*  The name associated with this secdata in libdwarf */
341*4d9fdb46SRobert Mustacchi     const char *targname,
342*4d9fdb46SRobert Mustacchi     /*  DW_GROUPNUMBER_ANY or BASE or DWO or some other group num */
343*4d9fdb46SRobert Mustacchi     unsigned  groupnum_of_sec,
344*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *secdata,
345*4d9fdb46SRobert Mustacchi     int duperr,int emptyerr,int have_dwarf,
346*4d9fdb46SRobert Mustacchi     int *err)
347*4d9fdb46SRobert Mustacchi {
348*4d9fdb46SRobert Mustacchi     /*  Here accomodate the .debug or .zdebug version, (and of
349*4d9fdb46SRobert Mustacchi         course non- .debug too, but those never zlib) .
350*4d9fdb46SRobert Mustacchi         SECNAMEMAX should be a little bigger than any section
351*4d9fdb46SRobert Mustacchi         name we care about as possibly compressed, which
352*4d9fdb46SRobert Mustacchi         is to say bigger than any standard section name. */
353*4d9fdb46SRobert Mustacchi #define SECNAMEMAX 30
354*4d9fdb46SRobert Mustacchi     int secnamelen = strlen(secname);
355*4d9fdb46SRobert Mustacchi     /* static const char *dprefix = ".debug_"; */
356*4d9fdb46SRobert Mustacchi #define DPREFIXLEN 7
357*4d9fdb46SRobert Mustacchi     static const char *zprefix = ".zdebug_";
358*4d9fdb46SRobert Mustacchi #define ZPREFIXLEN 8
359*4d9fdb46SRobert Mustacchi     int havezdebug = FALSE;
360*4d9fdb46SRobert Mustacchi     int namesmatch = FALSE;
361*4d9fdb46SRobert Mustacchi 
362*4d9fdb46SRobert Mustacchi     /*  For example, if the secname is .zdebug_info
363*4d9fdb46SRobert Mustacchi         we update the finaltargname to .debug_info
364*4d9fdb46SRobert Mustacchi         to match with the particular (known, predefined)
365*4d9fdb46SRobert Mustacchi         object section name.
366*4d9fdb46SRobert Mustacchi         We add one character, so check
367*4d9fdb46SRobert Mustacchi         to see if it will, in the end, fit.
368*4d9fdb46SRobert Mustacchi         See the SET_UP_SECTION macro.  */
369*4d9fdb46SRobert Mustacchi 
370*4d9fdb46SRobert Mustacchi     if(secnamelen >= SECNAMEMAX) {
371*4d9fdb46SRobert Mustacchi         /*  This is not the target section.
372*4d9fdb46SRobert Mustacchi             our caller will keep looking. */
373*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
374*4d9fdb46SRobert Mustacchi     }
375*4d9fdb46SRobert Mustacchi     if((secnamelen+1) < SECNAMEMAX &&
376*4d9fdb46SRobert Mustacchi         !strncmp(secname,zprefix,ZPREFIXLEN) &&
377*4d9fdb46SRobert Mustacchi         !strcmp(secname+ZPREFIXLEN,targname+DPREFIXLEN)) {
378*4d9fdb46SRobert Mustacchi             /*  zprefix version matches the object section
379*4d9fdb46SRobert Mustacchi                 name so the section is compressed and is
380*4d9fdb46SRobert Mustacchi                 the section this targname applies to. */
381*4d9fdb46SRobert Mustacchi             havezdebug = TRUE;
382*4d9fdb46SRobert Mustacchi             namesmatch = TRUE;
383*4d9fdb46SRobert Mustacchi     } else if (!strcmp(secname,targname)) {
384*4d9fdb46SRobert Mustacchi         namesmatch = TRUE;
385*4d9fdb46SRobert Mustacchi     }
386*4d9fdb46SRobert Mustacchi #undef ZPREFIXLEN
387*4d9fdb46SRobert Mustacchi #undef DPREFIXLEN
388*4d9fdb46SRobert Mustacchi #undef SECNAMEMAX
389*4d9fdb46SRobert Mustacchi     if(!namesmatch) {
390*4d9fdb46SRobert Mustacchi         /*  This is not the target section.
391*4d9fdb46SRobert Mustacchi             our caller will keep looking. */
392*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
393*4d9fdb46SRobert Mustacchi     }
394*4d9fdb46SRobert Mustacchi 
395*4d9fdb46SRobert Mustacchi     /* SETUP_SECTION. See also BUILDING_SECTIONS, BUILDING_MAP  */
396*4d9fdb46SRobert Mustacchi     {
397*4d9fdb46SRobert Mustacchi         /*  The section name is a match with targname, or
398*4d9fdb46SRobert Mustacchi             the .zdebug version of targname. */
399*4d9fdb46SRobert Mustacchi         int sectionerr = 0;
400*4d9fdb46SRobert Mustacchi 
401*4d9fdb46SRobert Mustacchi         sectionerr = add_debug_section_info(dbg,secname,
402*4d9fdb46SRobert Mustacchi             sec_standard_name,
403*4d9fdb46SRobert Mustacchi             obj_sec_num,
404*4d9fdb46SRobert Mustacchi             secdata,
405*4d9fdb46SRobert Mustacchi             groupnum_of_sec,
406*4d9fdb46SRobert Mustacchi             duperr,emptyerr, have_dwarf,
407*4d9fdb46SRobert Mustacchi             havezdebug,err);
408*4d9fdb46SRobert Mustacchi         if (sectionerr != DW_DLV_OK) {
409*4d9fdb46SRobert Mustacchi             /* *err is set already */
410*4d9fdb46SRobert Mustacchi             return sectionerr;
411*4d9fdb46SRobert Mustacchi         }
412*4d9fdb46SRobert Mustacchi     }
413*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
414*4d9fdb46SRobert Mustacchi }
415*4d9fdb46SRobert Mustacchi 
416*4d9fdb46SRobert Mustacchi #define SET_UP_SECTION(mdbg,mname,mtarg,mgrp,minfo,me1,me2,mdw,mer) \
417*4d9fdb46SRobert Mustacchi     {                                           \
418*4d9fdb46SRobert Mustacchi     int lerr = 0;                               \
419*4d9fdb46SRobert Mustacchi     lerr =  set_up_section(mdbg,                \
420*4d9fdb46SRobert Mustacchi         mname,  /* actual section name */       \
421*4d9fdb46SRobert Mustacchi         mtarg,    /* std section name */        \
422*4d9fdb46SRobert Mustacchi         /* scn_number from macro use context */ \
423*4d9fdb46SRobert Mustacchi         scn_number,mtarg,mgrp,                  \
424*4d9fdb46SRobert Mustacchi         minfo,                                  \
425*4d9fdb46SRobert Mustacchi         me1,me2,mdw,mer);                       \
426*4d9fdb46SRobert Mustacchi     if (lerr != DW_DLV_NO_ENTRY) {              \
427*4d9fdb46SRobert Mustacchi         return lerr;                            \
428*4d9fdb46SRobert Mustacchi     }    /* else fall through. */               \
429*4d9fdb46SRobert Mustacchi     }
430*4d9fdb46SRobert Mustacchi 
431*4d9fdb46SRobert Mustacchi /*  If running this long set of tests is slow
432*4d9fdb46SRobert Mustacchi     enough to matter one could set up a local
433*4d9fdb46SRobert Mustacchi     tsearch tree with all this content and search
434*4d9fdb46SRobert Mustacchi     it instead of this set of sequential tests.
435*4d9fdb46SRobert Mustacchi     Or use a switch(){} here with a search tree
436*4d9fdb46SRobert Mustacchi     to to turn name into index for the switch(). */
437*4d9fdb46SRobert Mustacchi static int
enter_section_in_de_debug_sections_array(Dwarf_Debug dbg,const char * scn_name,unsigned scn_number,unsigned group_number,int * err)438*4d9fdb46SRobert Mustacchi enter_section_in_de_debug_sections_array(Dwarf_Debug dbg,
439*4d9fdb46SRobert Mustacchi     const char *scn_name,
440*4d9fdb46SRobert Mustacchi     /* This is the number of the section in the object file. */
441*4d9fdb46SRobert Mustacchi     unsigned scn_number,
442*4d9fdb46SRobert Mustacchi     unsigned group_number,
443*4d9fdb46SRobert Mustacchi     int *err)
444*4d9fdb46SRobert Mustacchi {
445*4d9fdb46SRobert Mustacchi     /*  Setup the table that contains the basic information about the
446*4d9fdb46SRobert Mustacchi         sections that are DWARF related. The entries are very unlikely
447*4d9fdb46SRobert Mustacchi         to change very often. */
448*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_info",
449*4d9fdb46SRobert Mustacchi         group_number,
450*4d9fdb46SRobert Mustacchi         &dbg->de_debug_info,
451*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_INFO_DUPLICATE,DW_DLE_DEBUG_INFO_NULL,
452*4d9fdb46SRobert Mustacchi         TRUE,err);
453*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_info.dwo",
454*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
455*4d9fdb46SRobert Mustacchi         &dbg->de_debug_info,
456*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_INFO_DUPLICATE,DW_DLE_DEBUG_INFO_NULL,
457*4d9fdb46SRobert Mustacchi         TRUE,err);
458*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_types",
459*4d9fdb46SRobert Mustacchi         group_number,
460*4d9fdb46SRobert Mustacchi         &dbg->de_debug_types,
461*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_TYPES_DUPLICATE,DW_DLE_DEBUG_TYPES_NULL,
462*4d9fdb46SRobert Mustacchi         TRUE,err);
463*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_types.dwo",
464*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
465*4d9fdb46SRobert Mustacchi         &dbg->de_debug_types,
466*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_TYPES_DUPLICATE,DW_DLE_DEBUG_TYPES_NULL,
467*4d9fdb46SRobert Mustacchi         TRUE,err);
468*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_abbrev",
469*4d9fdb46SRobert Mustacchi         group_number,
470*4d9fdb46SRobert Mustacchi         &dbg->de_debug_abbrev, /*03*/
471*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_ABBREV_DUPLICATE,DW_DLE_DEBUG_ABBREV_NULL,
472*4d9fdb46SRobert Mustacchi         TRUE,err);
473*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_abbrev.dwo",
474*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
475*4d9fdb46SRobert Mustacchi         &dbg->de_debug_abbrev, /*03*/
476*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_ABBREV_DUPLICATE,DW_DLE_DEBUG_ABBREV_NULL,
477*4d9fdb46SRobert Mustacchi         TRUE,err);
478*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_aranges",
479*4d9fdb46SRobert Mustacchi         group_number,
480*4d9fdb46SRobert Mustacchi         &dbg->de_debug_aranges,
481*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_ARANGES_DUPLICATE,0,
482*4d9fdb46SRobert Mustacchi         FALSE,err);
483*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_line",
484*4d9fdb46SRobert Mustacchi         group_number,
485*4d9fdb46SRobert Mustacchi         &dbg->de_debug_line,
486*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_LINE_DUPLICATE,0,
487*4d9fdb46SRobert Mustacchi         TRUE,err);
488*4d9fdb46SRobert Mustacchi     /* DWARF5 */
489*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_line_str",
490*4d9fdb46SRobert Mustacchi         group_number,
491*4d9fdb46SRobert Mustacchi         &dbg->de_debug_line_str,
492*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_LINE_DUPLICATE,0,
493*4d9fdb46SRobert Mustacchi         FALSE,err);
494*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_line.dwo",
495*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
496*4d9fdb46SRobert Mustacchi         &dbg->de_debug_line,
497*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_LINE_DUPLICATE,0,
498*4d9fdb46SRobert Mustacchi         TRUE,err);
499*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_frame",
500*4d9fdb46SRobert Mustacchi         group_number,
501*4d9fdb46SRobert Mustacchi         &dbg->de_debug_frame,
502*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_FRAME_DUPLICATE,0,
503*4d9fdb46SRobert Mustacchi         TRUE,err);
504*4d9fdb46SRobert Mustacchi     /* gnu egcs-1.1.2 data */
505*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".eh_frame",
506*4d9fdb46SRobert Mustacchi         group_number,
507*4d9fdb46SRobert Mustacchi         &dbg->de_debug_frame_eh_gnu,
508*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_FRAME_DUPLICATE,0,
509*4d9fdb46SRobert Mustacchi         TRUE,err);
510*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_loc",
511*4d9fdb46SRobert Mustacchi         group_number,
512*4d9fdb46SRobert Mustacchi         &dbg->de_debug_loc,
513*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_LOC_DUPLICATE,0,
514*4d9fdb46SRobert Mustacchi         FALSE,err);
515*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_loc.dwo",
516*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
517*4d9fdb46SRobert Mustacchi         &dbg->de_debug_loc,
518*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_LOC_DUPLICATE,0,
519*4d9fdb46SRobert Mustacchi         FALSE,err);
520*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_pubnames",
521*4d9fdb46SRobert Mustacchi         group_number,
522*4d9fdb46SRobert Mustacchi         &dbg->de_debug_pubnames,
523*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_PUBNAMES_DUPLICATE,0,
524*4d9fdb46SRobert Mustacchi         FALSE,err);
525*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_str",
526*4d9fdb46SRobert Mustacchi         group_number,
527*4d9fdb46SRobert Mustacchi         &dbg->de_debug_str,
528*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_STR_DUPLICATE,0,
529*4d9fdb46SRobert Mustacchi         FALSE,err);
530*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_str.dwo",
531*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
532*4d9fdb46SRobert Mustacchi         &dbg->de_debug_str,
533*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_STR_DUPLICATE,0,
534*4d9fdb46SRobert Mustacchi         FALSE,err);
535*4d9fdb46SRobert Mustacchi     /* Section new in DWARF3.  */
536*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_pubtypes",
537*4d9fdb46SRobert Mustacchi         group_number,
538*4d9fdb46SRobert Mustacchi         &dbg->de_debug_pubtypes,
539*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_PUBTYPES_DUPLICATE,0,
540*4d9fdb46SRobert Mustacchi         FALSE,err);
541*4d9fdb46SRobert Mustacchi     /* DWARF5 */
542*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_names",
543*4d9fdb46SRobert Mustacchi         group_number,
544*4d9fdb46SRobert Mustacchi         &dbg->de_debug_names,
545*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_NAMES_DUPLICATE,0,
546*4d9fdb46SRobert Mustacchi         FALSE,err);
547*4d9fdb46SRobert Mustacchi     /* DWARF5 */
548*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_loclists",
549*4d9fdb46SRobert Mustacchi         group_number,
550*4d9fdb46SRobert Mustacchi         &dbg->de_debug_loclists,
551*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_LOClISTS_DUPLICATE,0,
552*4d9fdb46SRobert Mustacchi         FALSE,err);
553*4d9fdb46SRobert Mustacchi     /* DWARF5 */
554*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_loclists.dwo",
555*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
556*4d9fdb46SRobert Mustacchi         &dbg->de_debug_loclists,
557*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_LOClISTS_DUPLICATE,0,
558*4d9fdb46SRobert Mustacchi         FALSE,err);
559*4d9fdb46SRobert Mustacchi     /* DWARF5 */
560*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_rnglists",
561*4d9fdb46SRobert Mustacchi         group_number,
562*4d9fdb46SRobert Mustacchi         &dbg->de_debug_rnglists,
563*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_RNGLISTS_DUPLICATE,0,
564*4d9fdb46SRobert Mustacchi         FALSE,err);
565*4d9fdb46SRobert Mustacchi     /* DWARF5 */
566*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_rnglists.dwo",
567*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
568*4d9fdb46SRobert Mustacchi         &dbg->de_debug_rnglists,
569*4d9fdb46SRobert Mustacchi         /*13*/ DW_DLE_DEBUG_RNGLISTS_DUPLICATE,0,
570*4d9fdb46SRobert Mustacchi         FALSE,err);
571*4d9fdb46SRobert Mustacchi     /* DWARF5 */
572*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_str_offsets",
573*4d9fdb46SRobert Mustacchi         group_number,
574*4d9fdb46SRobert Mustacchi         &dbg->de_debug_str_offsets,
575*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_STR_OFFSETS_DUPLICATE,0,
576*4d9fdb46SRobert Mustacchi         FALSE,err);
577*4d9fdb46SRobert Mustacchi     /* DWARF5 */
578*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_str_offsets.dwo",
579*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
580*4d9fdb46SRobert Mustacchi         &dbg->de_debug_str_offsets,
581*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_STR_OFFSETS_DUPLICATE,0,
582*4d9fdb46SRobert Mustacchi         FALSE,err);
583*4d9fdb46SRobert Mustacchi 
584*4d9fdb46SRobert Mustacchi     /* SGI IRIX-only. */
585*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_funcnames",
586*4d9fdb46SRobert Mustacchi         group_number,
587*4d9fdb46SRobert Mustacchi         &dbg->de_debug_funcnames,
588*4d9fdb46SRobert Mustacchi         /*11*/ DW_DLE_DEBUG_FUNCNAMES_DUPLICATE,0,
589*4d9fdb46SRobert Mustacchi         FALSE,err);
590*4d9fdb46SRobert Mustacchi     /*  SGI IRIX-only, created years before DWARF3. Content
591*4d9fdb46SRobert Mustacchi         essentially identical to .debug_pubtypes.  */
592*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_typenames",
593*4d9fdb46SRobert Mustacchi         group_number,
594*4d9fdb46SRobert Mustacchi         &dbg->de_debug_typenames,
595*4d9fdb46SRobert Mustacchi         /*12*/ DW_DLE_DEBUG_TYPENAMES_DUPLICATE,0,
596*4d9fdb46SRobert Mustacchi         FALSE,err);
597*4d9fdb46SRobert Mustacchi     /* SGI IRIX-only.  */
598*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_varnames",
599*4d9fdb46SRobert Mustacchi         group_number,
600*4d9fdb46SRobert Mustacchi         &dbg->de_debug_varnames,
601*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_VARNAMES_DUPLICATE,0,
602*4d9fdb46SRobert Mustacchi         FALSE,err);
603*4d9fdb46SRobert Mustacchi     /* SGI IRIX-only. */
604*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_weaknames",
605*4d9fdb46SRobert Mustacchi         group_number,
606*4d9fdb46SRobert Mustacchi         &dbg->de_debug_weaknames,
607*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_WEAKNAMES_DUPLICATE,0,
608*4d9fdb46SRobert Mustacchi         FALSE,err);
609*4d9fdb46SRobert Mustacchi 
610*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_macinfo",
611*4d9fdb46SRobert Mustacchi         group_number,
612*4d9fdb46SRobert Mustacchi         &dbg->de_debug_macinfo,
613*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_MACINFO_DUPLICATE,0,
614*4d9fdb46SRobert Mustacchi         TRUE,err);
615*4d9fdb46SRobert Mustacchi     /*  ".debug_macinfo.dwo" is not allowed.  */
616*4d9fdb46SRobert Mustacchi 
617*4d9fdb46SRobert Mustacchi 
618*4d9fdb46SRobert Mustacchi     /* DWARF5 */
619*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_macro",
620*4d9fdb46SRobert Mustacchi         group_number,
621*4d9fdb46SRobert Mustacchi         &dbg->de_debug_macro,
622*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_MACRO_DUPLICATE,0,
623*4d9fdb46SRobert Mustacchi         TRUE,err);
624*4d9fdb46SRobert Mustacchi     /* DWARF5 */
625*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_macro.dwo",
626*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
627*4d9fdb46SRobert Mustacchi         &dbg->de_debug_macro,
628*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_MACRO_DUPLICATE,0,
629*4d9fdb46SRobert Mustacchi         TRUE,err);
630*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_ranges",
631*4d9fdb46SRobert Mustacchi         group_number,
632*4d9fdb46SRobert Mustacchi         &dbg->de_debug_ranges,
633*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_RANGES_DUPLICATE,0,
634*4d9fdb46SRobert Mustacchi         TRUE,err);
635*4d9fdb46SRobert Mustacchi     /*  No .debug_ranges.dwo allowed. */
636*4d9fdb46SRobert Mustacchi 
637*4d9fdb46SRobert Mustacchi     /* New DWARF5 */
638*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_sup",
639*4d9fdb46SRobert Mustacchi         group_number,
640*4d9fdb46SRobert Mustacchi         &dbg->de_debug_sup,
641*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_SUP_DUPLICATE,0,
642*4d9fdb46SRobert Mustacchi         TRUE,err);
643*4d9fdb46SRobert Mustacchi     /* No .debug_sup.dwo allowed. */
644*4d9fdb46SRobert Mustacchi 
645*4d9fdb46SRobert Mustacchi     /*  .symtab and .strtab have to be in any group.  */
646*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".symtab",
647*4d9fdb46SRobert Mustacchi         group_number,
648*4d9fdb46SRobert Mustacchi         &dbg->de_elf_symtab,
649*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_SYMTAB_ERR,0,
650*4d9fdb46SRobert Mustacchi         FALSE,err);
651*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".strtab",
652*4d9fdb46SRobert Mustacchi         group_number,
653*4d9fdb46SRobert Mustacchi         &dbg->de_elf_strtab,
654*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_STRTAB_ERR,0,
655*4d9fdb46SRobert Mustacchi         FALSE,err);
656*4d9fdb46SRobert Mustacchi 
657*4d9fdb46SRobert Mustacchi     /* New DWARF5 */
658*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_addr",
659*4d9fdb46SRobert Mustacchi         group_number,
660*4d9fdb46SRobert Mustacchi         &dbg->de_debug_addr,
661*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_ADDR_DUPLICATE,0,
662*4d9fdb46SRobert Mustacchi         TRUE,err);
663*4d9fdb46SRobert Mustacchi     /*  No .debug_addr.dwo allowed.  */
664*4d9fdb46SRobert Mustacchi 
665*4d9fdb46SRobert Mustacchi     /* gdb added this. */
666*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".gdb_index",
667*4d9fdb46SRobert Mustacchi         group_number,
668*4d9fdb46SRobert Mustacchi         &dbg->de_debug_gdbindex,
669*4d9fdb46SRobert Mustacchi         DW_DLE_DUPLICATE_GDB_INDEX,0,
670*4d9fdb46SRobert Mustacchi         FALSE,err);
671*4d9fdb46SRobert Mustacchi 
672*4d9fdb46SRobert Mustacchi     /* New DWARF5 */
673*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_names",
674*4d9fdb46SRobert Mustacchi         group_number,
675*4d9fdb46SRobert Mustacchi         &dbg->de_debug_names,
676*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_NAMES_DUPLICATE,0,
677*4d9fdb46SRobert Mustacchi         FALSE,err);
678*4d9fdb46SRobert Mustacchi     /* No .debug_names.dwo allowed. */
679*4d9fdb46SRobert Mustacchi 
680*4d9fdb46SRobert Mustacchi     /* gdb added this in DW4. It is in standard DWARF5  */
681*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_cu_index",
682*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
683*4d9fdb46SRobert Mustacchi         &dbg->de_debug_cu_index,
684*4d9fdb46SRobert Mustacchi         DW_DLE_DUPLICATE_CU_INDEX,0,
685*4d9fdb46SRobert Mustacchi         FALSE,err);
686*4d9fdb46SRobert Mustacchi     /* gdb added this in DW4. It is in standard DWARF5 */
687*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".debug_tu_index",
688*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
689*4d9fdb46SRobert Mustacchi         &dbg->de_debug_tu_index,
690*4d9fdb46SRobert Mustacchi         DW_DLE_DUPLICATE_TU_INDEX,0,
691*4d9fdb46SRobert Mustacchi         FALSE,err);
692*4d9fdb46SRobert Mustacchi 
693*4d9fdb46SRobert Mustacchi     /* GNU added this. It is not part of DWARF */
694*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".gnu_debuglink",
695*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
696*4d9fdb46SRobert Mustacchi         &dbg->de_gnu_debuglink,
697*4d9fdb46SRobert Mustacchi         DW_DLE_DUPLICATE_GNU_DEBUGLINK,0,
698*4d9fdb46SRobert Mustacchi         FALSE,err);
699*4d9fdb46SRobert Mustacchi 
700*4d9fdb46SRobert Mustacchi     /* GNU added this. It is not part of DWARF */
701*4d9fdb46SRobert Mustacchi     SET_UP_SECTION(dbg,scn_name,".note.gnu.build-id",
702*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_DWO,
703*4d9fdb46SRobert Mustacchi         &dbg->de_note_gnu_buildid,
704*4d9fdb46SRobert Mustacchi         DW_DLE_DUPLICATE_GNU_DEBUGLINK,0,
705*4d9fdb46SRobert Mustacchi         FALSE,err);
706*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
707*4d9fdb46SRobert Mustacchi }
708*4d9fdb46SRobert Mustacchi static int
is_section_name_known_already(Dwarf_Debug dbg,const char * scn_name)709*4d9fdb46SRobert Mustacchi is_section_name_known_already(Dwarf_Debug dbg, const char *scn_name)
710*4d9fdb46SRobert Mustacchi {
711*4d9fdb46SRobert Mustacchi     unsigned i = 0;
712*4d9fdb46SRobert Mustacchi     for ( ; i < dbg->de_debug_sections_total_entries; ++i) {
713*4d9fdb46SRobert Mustacchi         struct Dwarf_dbg_sect_s *section = &dbg->de_debug_sections[i];
714*4d9fdb46SRobert Mustacchi         if (!strcmp(scn_name, section->ds_name)) {
715*4d9fdb46SRobert Mustacchi             /*  The caller will declare this a duplicate, an error. */
716*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
717*4d9fdb46SRobert Mustacchi         }
718*4d9fdb46SRobert Mustacchi     }
719*4d9fdb46SRobert Mustacchi     /* This is normal, we expect we've not accepted scn_name already. */
720*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
721*4d9fdb46SRobert Mustacchi }
722*4d9fdb46SRobert Mustacchi 
723*4d9fdb46SRobert Mustacchi /*  Given an Elf ptr, set up dbg with pointers
724bc1f688bSRobert Mustacchi     to all the Dwarf data sections.
725bc1f688bSRobert Mustacchi     Return NULL on error.
726bc1f688bSRobert Mustacchi 
727bc1f688bSRobert Mustacchi     This function is also responsible for determining
728bc1f688bSRobert Mustacchi     whether the given object contains Dwarf information
729bc1f688bSRobert Mustacchi     or not.  The test currently used is that it contains
730bc1f688bSRobert Mustacchi     either a .debug_info or a .debug_frame section.  If
731bc1f688bSRobert Mustacchi     not, it returns DW_DLV_NO_ENTRY causing dwarf_init() also to
732bc1f688bSRobert Mustacchi     return DW_DLV_NO_ENTRY.  Earlier, we had thought of using only
733bc1f688bSRobert Mustacchi     the presence/absence of .debug_info to test, but we
734bc1f688bSRobert Mustacchi     added .debug_frame since there could be stripped objects
735bc1f688bSRobert Mustacchi     that have only a .debug_frame section for exception
736bc1f688bSRobert Mustacchi     processing.
737bc1f688bSRobert Mustacchi     DW_DLV_NO_ENTRY or DW_DLV_OK or DW_DLV_ERROR
738*4d9fdb46SRobert Mustacchi 
739*4d9fdb46SRobert Mustacchi     This does not allow for section-groups in object files,
740*4d9fdb46SRobert Mustacchi     for which many .debug_info (and other DWARF) sections may exist.
741*4d9fdb46SRobert Mustacchi 
742*4d9fdb46SRobert Mustacchi     We process. .rela (SHT_RELA) and .rel (SHT_REL)
743*4d9fdb46SRobert Mustacchi     sections because with .rela the referencing section
744*4d9fdb46SRobert Mustacchi     offset value is zero whereas with .rel the
745*4d9fdb46SRobert Mustacchi     referencing section value is already correct for
746*4d9fdb46SRobert Mustacchi     the object itself.  In other words, we do it because
747*4d9fdb46SRobert Mustacchi     of the definition of .rela relocations in Elf.
748*4d9fdb46SRobert Mustacchi 
749*4d9fdb46SRobert Mustacchi     However!  In some cases clang emits  a .rel section (at least
750*4d9fdb46SRobert Mustacchi     for .rel.debug_info) where symtab entries have an st_value
751*4d9fdb46SRobert Mustacchi     that must be treated like an addend: the compiler did not
752*4d9fdb46SRobert Mustacchi     bother to backpatch the DWARF information for these.
753bc1f688bSRobert Mustacchi */
754*4d9fdb46SRobert Mustacchi 
755*4d9fdb46SRobert Mustacchi 
756*4d9fdb46SRobert Mustacchi /*  These help us ignore some sections that are
757*4d9fdb46SRobert Mustacchi     irrelevant to libdwarf.  Maybe should use a hash
758*4d9fdb46SRobert Mustacchi     table instead of sequential search? */
759*4d9fdb46SRobert Mustacchi int
_dwarf_ignorethissection(const char * scn_name)760*4d9fdb46SRobert Mustacchi _dwarf_ignorethissection(const char *scn_name) {
761*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".bss")) {
762*4d9fdb46SRobert Mustacchi         return TRUE;
763*4d9fdb46SRobert Mustacchi     }
764*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".comment")) {
765*4d9fdb46SRobert Mustacchi         return TRUE;
766*4d9fdb46SRobert Mustacchi     }
767*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".sbss")) {
768*4d9fdb46SRobert Mustacchi         return TRUE;
769*4d9fdb46SRobert Mustacchi     }
770*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".jcr")) {
771*4d9fdb46SRobert Mustacchi         return TRUE;
772*4d9fdb46SRobert Mustacchi     }
773*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".init")) {
774*4d9fdb46SRobert Mustacchi         return TRUE;
775*4d9fdb46SRobert Mustacchi     }
776*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".fini_array")) {
777*4d9fdb46SRobert Mustacchi         return TRUE;
778*4d9fdb46SRobert Mustacchi     }
779*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".fini")) {
780*4d9fdb46SRobert Mustacchi         return TRUE;
781*4d9fdb46SRobert Mustacchi     }
782*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".fini_array")) {
783*4d9fdb46SRobert Mustacchi         return TRUE;
784*4d9fdb46SRobert Mustacchi     }
785*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".interp")) {
786*4d9fdb46SRobert Mustacchi         return TRUE;
787*4d9fdb46SRobert Mustacchi     }
788*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".text")) {
789*4d9fdb46SRobert Mustacchi         return TRUE;
790*4d9fdb46SRobert Mustacchi     }
791*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rela.text")) {
792*4d9fdb46SRobert Mustacchi         return TRUE;
793*4d9fdb46SRobert Mustacchi     }
794*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rel.text")) {
795*4d9fdb46SRobert Mustacchi         return TRUE;
796*4d9fdb46SRobert Mustacchi     }
797*4d9fdb46SRobert Mustacchi 
798*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".plt")) {
799*4d9fdb46SRobert Mustacchi         return TRUE;
800*4d9fdb46SRobert Mustacchi     }
801*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rela.plt")) {
802*4d9fdb46SRobert Mustacchi         return TRUE;
803*4d9fdb46SRobert Mustacchi     }
804*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rel.plt")) {
805*4d9fdb46SRobert Mustacchi         return TRUE;
806*4d9fdb46SRobert Mustacchi     }
807*4d9fdb46SRobert Mustacchi 
808*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".data")) {
809*4d9fdb46SRobert Mustacchi         return TRUE;
810*4d9fdb46SRobert Mustacchi     }
811*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rel.data")) {
812*4d9fdb46SRobert Mustacchi         return TRUE;
813*4d9fdb46SRobert Mustacchi     }
814*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rela.data")) {
815*4d9fdb46SRobert Mustacchi         return TRUE;
816*4d9fdb46SRobert Mustacchi     }
817*4d9fdb46SRobert Mustacchi 
818*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".got")) {
819*4d9fdb46SRobert Mustacchi         return TRUE;
820*4d9fdb46SRobert Mustacchi     }
821*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rela.got")) {
822*4d9fdb46SRobert Mustacchi         return TRUE;
823*4d9fdb46SRobert Mustacchi     }
824*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name,".rel.got")) {
825*4d9fdb46SRobert Mustacchi         return TRUE;
826*4d9fdb46SRobert Mustacchi     }
827*4d9fdb46SRobert Mustacchi 
828*4d9fdb46SRobert Mustacchi     return FALSE;
829*4d9fdb46SRobert Mustacchi }
830*4d9fdb46SRobert Mustacchi /*  For an object file with an incorrect rela section name,
831*4d9fdb46SRobert Mustacchi     readelf prints correct debug information,
832*4d9fdb46SRobert Mustacchi     as the tool takes the section type instead
833*4d9fdb46SRobert Mustacchi     of the section name. So check the
834*4d9fdb46SRobert Mustacchi     section name but test section type. */
835*4d9fdb46SRobert Mustacchi static int
is_a_relx_section(const char * scn_name,int type,int * is_rela)836*4d9fdb46SRobert Mustacchi is_a_relx_section(const char *scn_name,int type,int *is_rela)
837*4d9fdb46SRobert Mustacchi {
838*4d9fdb46SRobert Mustacchi     if(startswith(scn_name,".rela.")) {
839*4d9fdb46SRobert Mustacchi 
840*4d9fdb46SRobert Mustacchi         *is_rela = TRUE;
841*4d9fdb46SRobert Mustacchi         return TRUE;
842*4d9fdb46SRobert Mustacchi     }
843*4d9fdb46SRobert Mustacchi     if(startswith(scn_name,".rel.")) {
844*4d9fdb46SRobert Mustacchi         *is_rela = FALSE;
845*4d9fdb46SRobert Mustacchi         return TRUE;
846*4d9fdb46SRobert Mustacchi     }
847*4d9fdb46SRobert Mustacchi     if (type == SHT_RELA) {
848*4d9fdb46SRobert Mustacchi         *is_rela = TRUE;
849*4d9fdb46SRobert Mustacchi         return TRUE;
850*4d9fdb46SRobert Mustacchi     }
851*4d9fdb46SRobert Mustacchi     if (type == SHT_REL) {
852*4d9fdb46SRobert Mustacchi         *is_rela = FALSE;
853*4d9fdb46SRobert Mustacchi         return TRUE;
854*4d9fdb46SRobert Mustacchi     }
855*4d9fdb46SRobert Mustacchi     *is_rela = FALSE;
856*4d9fdb46SRobert Mustacchi     return FALSE;
857*4d9fdb46SRobert Mustacchi }
858*4d9fdb46SRobert Mustacchi 
859*4d9fdb46SRobert Mustacchi /*  ASSERT: names like .debug_ or .zdebug_ never passed in here! */
860*4d9fdb46SRobert Mustacchi static int
is_a_special_section_semi_dwarf(const char * scn_name)861*4d9fdb46SRobert Mustacchi is_a_special_section_semi_dwarf(const char *scn_name)
862*4d9fdb46SRobert Mustacchi {
863*4d9fdb46SRobert Mustacchi     if (!strcmp(scn_name,".strtab") ||
864*4d9fdb46SRobert Mustacchi         !strcmp(scn_name,".symtab")) {
865*4d9fdb46SRobert Mustacchi         return TRUE;
866*4d9fdb46SRobert Mustacchi     }
867*4d9fdb46SRobert Mustacchi     /*  It's not one of these special sections referenced in
868*4d9fdb46SRobert Mustacchi         the test. */
869*4d9fdb46SRobert Mustacchi     return FALSE;
870*4d9fdb46SRobert Mustacchi }
871*4d9fdb46SRobert Mustacchi 
872*4d9fdb46SRobert Mustacchi static int
this_section_dwarf_relevant(const char * scn_name,int type,int * is_rela)873*4d9fdb46SRobert Mustacchi this_section_dwarf_relevant(const char *scn_name,int type, int *is_rela)
874*4d9fdb46SRobert Mustacchi {
875*4d9fdb46SRobert Mustacchi     /* A small helper function for _dwarf_setup(). */
876*4d9fdb46SRobert Mustacchi     if (startswith(scn_name, ".zdebug_") ||
877*4d9fdb46SRobert Mustacchi         startswith(scn_name, ".debug_")) {
878*4d9fdb46SRobert Mustacchi         /* standard debug */
879*4d9fdb46SRobert Mustacchi         return TRUE;
880*4d9fdb46SRobert Mustacchi     }
881*4d9fdb46SRobert Mustacchi     if (_dwarf_ignorethissection(scn_name)) {
882*4d9fdb46SRobert Mustacchi         return FALSE;
883*4d9fdb46SRobert Mustacchi     }
884*4d9fdb46SRobert Mustacchi     /* Now check if a special section could be
885*4d9fdb46SRobert Mustacchi         in a section_group, but though seems unlikely. */
886*4d9fdb46SRobert Mustacchi     if (!strcmp(scn_name, ".eh_frame")) {
887*4d9fdb46SRobert Mustacchi         /*  This is not really a group related file, but
888*4d9fdb46SRobert Mustacchi             it is harmless to consider it such. */
889*4d9fdb46SRobert Mustacchi         return TRUE;
890*4d9fdb46SRobert Mustacchi     }
891*4d9fdb46SRobert Mustacchi     if (!strcmp(scn_name, ".gnu_debuglink")) {
892*4d9fdb46SRobert Mustacchi         /*  This is not a group or DWARF related file, but
893*4d9fdb46SRobert Mustacchi             it is useful for split dwarf. */
894*4d9fdb46SRobert Mustacchi         return TRUE;
895*4d9fdb46SRobert Mustacchi     }
896*4d9fdb46SRobert Mustacchi     if (!strcmp(scn_name, ".note.gnu.build-id")) {
897*4d9fdb46SRobert Mustacchi         /*  This is not a group or DWARF related file, but
898*4d9fdb46SRobert Mustacchi             it is useful for split dwarf. */
899*4d9fdb46SRobert Mustacchi         return TRUE;
900*4d9fdb46SRobert Mustacchi     }
901*4d9fdb46SRobert Mustacchi     if(!strcmp(scn_name, ".gdb_index")) {
902*4d9fdb46SRobert Mustacchi         return TRUE;
903*4d9fdb46SRobert Mustacchi     }
904*4d9fdb46SRobert Mustacchi     if(is_a_special_section_semi_dwarf(scn_name)) {
905*4d9fdb46SRobert Mustacchi         return TRUE;
906*4d9fdb46SRobert Mustacchi     }
907*4d9fdb46SRobert Mustacchi     if(is_a_relx_section(scn_name,type,is_rela)) {
908*4d9fdb46SRobert Mustacchi         return TRUE;
909*4d9fdb46SRobert Mustacchi     }
910*4d9fdb46SRobert Mustacchi     /*  All sorts of sections are of no interest: .text
911*4d9fdb46SRobert Mustacchi         .rel. and many others. */
912*4d9fdb46SRobert Mustacchi     return FALSE;
913*4d9fdb46SRobert Mustacchi }
914*4d9fdb46SRobert Mustacchi 
915*4d9fdb46SRobert Mustacchi /*  This assumes any non-Elf object files have no SHT_GROUP
916*4d9fdb46SRobert Mustacchi     sections. So this code will not be invoked on non-Elf objects.
917*4d9fdb46SRobert Mustacchi     One supposes this is unlikely to match any non-Elf
918*4d9fdb46SRobert Mustacchi     version of COMDAT. */
919*4d9fdb46SRobert Mustacchi static int
insert_sht_list_in_group_map(Dwarf_Debug dbg,struct Dwarf_Obj_Access_Section_s * doas,unsigned comdat_group_number,unsigned section_number,Dwarf_Unsigned section_count,struct Dwarf_Obj_Access_Interface_s * obj,unsigned * did_add_map,Dwarf_Error * error)920*4d9fdb46SRobert Mustacchi insert_sht_list_in_group_map(Dwarf_Debug dbg,
921*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Section_s *doas,
922*4d9fdb46SRobert Mustacchi     unsigned comdat_group_number,
923*4d9fdb46SRobert Mustacchi     unsigned section_number,
924*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_count,
925*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s * obj,
926*4d9fdb46SRobert Mustacchi     unsigned *did_add_map,
927*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
928*4d9fdb46SRobert Mustacchi {
929*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s secdata;
930*4d9fdb46SRobert Mustacchi     Dwarf_Small * data = 0;
931*4d9fdb46SRobert Mustacchi     int           res = 0;
932*4d9fdb46SRobert Mustacchi     Dwarf_Small*  secend = 0;
933*4d9fdb46SRobert Mustacchi 
934*4d9fdb46SRobert Mustacchi     memset(&secdata,0,sizeof(secdata));
935*4d9fdb46SRobert Mustacchi     secdata.dss_size = doas->size;
936*4d9fdb46SRobert Mustacchi     secdata.dss_entrysize = doas->entrysize;
937*4d9fdb46SRobert Mustacchi     secdata.dss_group_number = 1; /* arbitrary. */
938*4d9fdb46SRobert Mustacchi     secdata.dss_index = section_number;
939*4d9fdb46SRobert Mustacchi     secdata.dss_name = ".group";
940*4d9fdb46SRobert Mustacchi     secdata.dss_standard_name = ".group";
941*4d9fdb46SRobert Mustacchi     secdata.dss_number = section_number;
942*4d9fdb46SRobert Mustacchi     secdata.dss_ignore_reloc_group_sec = TRUE;
943*4d9fdb46SRobert Mustacchi     res = _dwarf_load_section(dbg,&secdata,error);
944*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
945*4d9fdb46SRobert Mustacchi         if (secdata.dss_data_was_malloc) {
946*4d9fdb46SRobert Mustacchi             free(secdata.dss_data);
947*4d9fdb46SRobert Mustacchi         }
948*4d9fdb46SRobert Mustacchi         return res;
949*4d9fdb46SRobert Mustacchi     }
950*4d9fdb46SRobert Mustacchi     if (!secdata.dss_data) {
951*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
952*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
953*4d9fdb46SRobert Mustacchi     }
954*4d9fdb46SRobert Mustacchi     if (doas->entrysize != 4) {
955*4d9fdb46SRobert Mustacchi         if (secdata.dss_data_was_malloc) {
956*4d9fdb46SRobert Mustacchi             free(secdata.dss_data);
957*4d9fdb46SRobert Mustacchi         }
958*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
959*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
960*4d9fdb46SRobert Mustacchi     }
961*4d9fdb46SRobert Mustacchi     /*  So now pick up the data in dss_data.
962*4d9fdb46SRobert Mustacchi         It is an array of 32 bit fields.
963*4d9fdb46SRobert Mustacchi         Entry zero is just a constant 1.
964*4d9fdb46SRobert Mustacchi         Each additional is a section number. */
965*4d9fdb46SRobert Mustacchi     data = secdata.dss_data;
966*4d9fdb46SRobert Mustacchi     secend = data + secdata.dss_size;
967*4d9fdb46SRobert Mustacchi     {
968*4d9fdb46SRobert Mustacchi         unsigned i = 1;
969*4d9fdb46SRobert Mustacchi         unsigned count = doas->size/doas->entrysize;
970*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned  fval = 0;
971*4d9fdb46SRobert Mustacchi 
972*4d9fdb46SRobert Mustacchi         /*  The fields treatments with  regard
973*4d9fdb46SRobert Mustacchi             to endianness is unclear.  In any case a single
974*4d9fdb46SRobert Mustacchi             bit should be on, as 0x01000000
975*4d9fdb46SRobert Mustacchi             without any endiannes swapping.
976*4d9fdb46SRobert Mustacchi             Or so it seems given limited evidence.
977*4d9fdb46SRobert Mustacchi             We read with length checking and allow the
978*4d9fdb46SRobert Mustacchi             reader to byte swap and then fix things.
979*4d9fdb46SRobert Mustacchi             At least one test case has big-endian
980*4d9fdb46SRobert Mustacchi             data but little-endian SHT_GROUP data. */
981*4d9fdb46SRobert Mustacchi         if ((data+DWARF_32BIT_SIZE) > secend) {
982*4d9fdb46SRobert Mustacchi             /* Duplicates the check in READ_UNALIGNED_CK
983*4d9fdb46SRobert Mustacchi                 so we can free allocated memory bere. */
984*4d9fdb46SRobert Mustacchi             free(secdata.dss_data);
985*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
986*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
987*4d9fdb46SRobert Mustacchi         }
988*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,fval,Dwarf_Unsigned,
989*4d9fdb46SRobert Mustacchi             data,
990*4d9fdb46SRobert Mustacchi             DWARF_32BIT_SIZE,
991*4d9fdb46SRobert Mustacchi             error,
992*4d9fdb46SRobert Mustacchi             secend);
993*4d9fdb46SRobert Mustacchi         if (fval != 1 && fval != 0x1000000) {
994*4d9fdb46SRobert Mustacchi             /*  Could be corrupted elf object. */
995*4d9fdb46SRobert Mustacchi             if (secdata.dss_data_was_malloc) {
996*4d9fdb46SRobert Mustacchi                 free(secdata.dss_data);
997*4d9fdb46SRobert Mustacchi             }
998*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
999*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1000*4d9fdb46SRobert Mustacchi         }
1001*4d9fdb46SRobert Mustacchi 
1002*4d9fdb46SRobert Mustacchi         data = data + doas->entrysize;
1003*4d9fdb46SRobert Mustacchi         for (i = 1 ; i < count ; ++i) {
1004*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned  val = 0;
1005*4d9fdb46SRobert Mustacchi 
1006*4d9fdb46SRobert Mustacchi             if ((data+DWARF_32BIT_SIZE) > secend) {
1007*4d9fdb46SRobert Mustacchi                 /* Duplicates the check in READ_UNALIGNED_CK
1008*4d9fdb46SRobert Mustacchi                     so we can free allocated memory bere. */
1009*4d9fdb46SRobert Mustacchi                 if (secdata.dss_data_was_malloc) {
1010*4d9fdb46SRobert Mustacchi                     free(secdata.dss_data);
1011*4d9fdb46SRobert Mustacchi                 }
1012*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
1013*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
1014*4d9fdb46SRobert Mustacchi             }
1015*4d9fdb46SRobert Mustacchi             READ_UNALIGNED_CK(dbg,val,Dwarf_Unsigned,
1016*4d9fdb46SRobert Mustacchi                 data,
1017*4d9fdb46SRobert Mustacchi                 DWARF_32BIT_SIZE,
1018*4d9fdb46SRobert Mustacchi                 error,
1019*4d9fdb46SRobert Mustacchi                 secend);
1020*4d9fdb46SRobert Mustacchi             if (val > section_count) {
1021*4d9fdb46SRobert Mustacchi                 /*  Might be confused endianness by
1022*4d9fdb46SRobert Mustacchi                     the compiler generating the SHT_GROUP.
1023*4d9fdb46SRobert Mustacchi                     This is pretty horrible. */
1024*4d9fdb46SRobert Mustacchi                 Dwarf_Unsigned valr = 0;
1025*4d9fdb46SRobert Mustacchi                 _dwarf_memcpy_swap_bytes(&valr,&val,
1026*4d9fdb46SRobert Mustacchi                     DWARF_32BIT_SIZE);
1027*4d9fdb46SRobert Mustacchi                 if (valr > section_count) {
1028*4d9fdb46SRobert Mustacchi                     if (secdata.dss_data_was_malloc) {
1029*4d9fdb46SRobert Mustacchi                         free(secdata.dss_data);
1030*4d9fdb46SRobert Mustacchi                     }
1031*4d9fdb46SRobert Mustacchi                     _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
1032*4d9fdb46SRobert Mustacchi                     return DW_DLV_ERROR;
1033*4d9fdb46SRobert Mustacchi                 }
1034*4d9fdb46SRobert Mustacchi                 /* Ok. Yes, ugly. */
1035*4d9fdb46SRobert Mustacchi                 val = valr;
1036*4d9fdb46SRobert Mustacchi             }
1037*4d9fdb46SRobert Mustacchi             {
1038*4d9fdb46SRobert Mustacchi                 /*  Ensure this group entry DWARF relevant before
1039*4d9fdb46SRobert Mustacchi                     adding to group map */
1040*4d9fdb46SRobert Mustacchi                 struct Dwarf_Obj_Access_Section_s doasx;
1041*4d9fdb46SRobert Mustacchi                 int resx = DW_DLV_ERROR;
1042*4d9fdb46SRobert Mustacchi                 int err = 0;
1043*4d9fdb46SRobert Mustacchi                 int is_rela = FALSE;
1044*4d9fdb46SRobert Mustacchi 
1045*4d9fdb46SRobert Mustacchi                 memset(&doasx,0,sizeof(doasx));
1046*4d9fdb46SRobert Mustacchi                 resx = obj->methods->get_section_info(obj->object,
1047*4d9fdb46SRobert Mustacchi                     val,
1048*4d9fdb46SRobert Mustacchi                     &doasx, &err);
1049*4d9fdb46SRobert Mustacchi                 if (resx == DW_DLV_NO_ENTRY){
1050*4d9fdb46SRobert Mustacchi                     /*  Should we really ignore this? */
1051*4d9fdb46SRobert Mustacchi                     continue;
1052*4d9fdb46SRobert Mustacchi                 } else if (resx == DW_DLV_ERROR){
1053*4d9fdb46SRobert Mustacchi                     if (secdata.dss_data_was_malloc) {
1054*4d9fdb46SRobert Mustacchi                         free(secdata.dss_data);
1055*4d9fdb46SRobert Mustacchi                     }
1056*4d9fdb46SRobert Mustacchi                     _dwarf_error(dbg,error,err);
1057*4d9fdb46SRobert Mustacchi                     return resx;
1058*4d9fdb46SRobert Mustacchi                 }
1059*4d9fdb46SRobert Mustacchi                 if (!this_section_dwarf_relevant(doasx.name,
1060*4d9fdb46SRobert Mustacchi                     doasx.type,&is_rela) ) {
1061*4d9fdb46SRobert Mustacchi                     continue;
1062*4d9fdb46SRobert Mustacchi                 }
1063*4d9fdb46SRobert Mustacchi                 data += DWARF_32BIT_SIZE;
1064*4d9fdb46SRobert Mustacchi                 *did_add_map = TRUE;
1065*4d9fdb46SRobert Mustacchi                 res = _dwarf_insert_in_group_map(dbg,
1066*4d9fdb46SRobert Mustacchi                     comdat_group_number,val,
1067*4d9fdb46SRobert Mustacchi                     doasx.name,
1068*4d9fdb46SRobert Mustacchi                     error);
1069*4d9fdb46SRobert Mustacchi                 if (res != DW_DLV_OK) {
1070*4d9fdb46SRobert Mustacchi                     free(secdata.dss_data);
1071*4d9fdb46SRobert Mustacchi                     return res;
1072*4d9fdb46SRobert Mustacchi                 }
1073*4d9fdb46SRobert Mustacchi             }
1074*4d9fdb46SRobert Mustacchi         }
1075*4d9fdb46SRobert Mustacchi     }
1076*4d9fdb46SRobert Mustacchi     if (secdata.dss_data_was_malloc) {
1077*4d9fdb46SRobert Mustacchi         free(secdata.dss_data);
1078*4d9fdb46SRobert Mustacchi     }
1079*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1080*4d9fdb46SRobert Mustacchi }
1081*4d9fdb46SRobert Mustacchi 
1082*4d9fdb46SRobert Mustacchi 
1083*4d9fdb46SRobert Mustacchi 
1084*4d9fdb46SRobert Mustacchi /*  Split dwarf CUs can be in an object with non-split
1085*4d9fdb46SRobert Mustacchi     or split may be in a separate object.
1086*4d9fdb46SRobert Mustacchi     If all in one object the default is to deal with group_number
1087*4d9fdb46SRobert Mustacchi     and ignore DW_GROUPNUMBER_DWO.
1088*4d9fdb46SRobert Mustacchi     If only .dwo the default is DW_GROUPNUMBER_DWO(2).
1089*4d9fdb46SRobert Mustacchi     Otherwise use DW_GROUP_NUMBER_BASE(1).
1090*4d9fdb46SRobert Mustacchi 
1091*4d9fdb46SRobert Mustacchi     If there are COMDAT SHT_GROUP sections, these
1092*4d9fdb46SRobert Mustacchi     are assigned group numbers 3-N as needed.
1093*4d9fdb46SRobert Mustacchi 
1094*4d9fdb46SRobert Mustacchi     At present this makes the assumption that COMDAT group
1095*4d9fdb46SRobert Mustacchi     (ie, SHT_GROUP) sections
1096*4d9fdb46SRobert Mustacchi     have lower section numbers than the sections COMDAT refers to.
1097*4d9fdb46SRobert Mustacchi     It is not clear whether this is guaranteed, COMDAT is not
1098*4d9fdb46SRobert Mustacchi     an official Elf thing and documentation is scarce.
1099*4d9fdb46SRobert Mustacchi     In the 1990's SGI folks and others formed a committee
1100*4d9fdb46SRobert Mustacchi     and attempted to get COMDAT and a feature allowing section
1101*4d9fdb46SRobert Mustacchi     numbers  greater than 16 bits into Elf, but there was no
1102*4d9fdb46SRobert Mustacchi     group that was able to approve such things.
1103*4d9fdb46SRobert Mustacchi 
1104*4d9fdb46SRobert Mustacchi     This is called once at dbg init  time.
1105*4d9fdb46SRobert Mustacchi */
1106*4d9fdb46SRobert Mustacchi 
1107*4d9fdb46SRobert Mustacchi static int
determine_target_group(Dwarf_Unsigned section_count,struct Dwarf_Obj_Access_Interface_s * obj,unsigned * group_number_out,Dwarf_Debug dbg,Dwarf_Error * error)1108*4d9fdb46SRobert Mustacchi determine_target_group(Dwarf_Unsigned section_count,
1109*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s * obj,
1110*4d9fdb46SRobert Mustacchi     unsigned *group_number_out,
1111*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg,
1112*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1113*4d9fdb46SRobert Mustacchi {
1114*4d9fdb46SRobert Mustacchi     unsigned obj_section_index = 0;
1115*4d9fdb46SRobert Mustacchi     int found_group_one = 0;
1116*4d9fdb46SRobert Mustacchi     int found_group_two = 0;
1117*4d9fdb46SRobert Mustacchi     struct Dwarf_Group_Data_s *grp = 0;
1118*4d9fdb46SRobert Mustacchi     unsigned comdat_group_next = 3;
1119*4d9fdb46SRobert Mustacchi     unsigned lowest_comdat_groupnum = 0;
1120*4d9fdb46SRobert Mustacchi 
1121*4d9fdb46SRobert Mustacchi     grp = &dbg->de_groupnumbers;
1122*4d9fdb46SRobert Mustacchi     grp->gd_number_of_groups = 0;
1123*4d9fdb46SRobert Mustacchi     grp->gd_number_of_sections = section_count;
1124*4d9fdb46SRobert Mustacchi     if (grp->gd_map) {
1125*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_GROUP_INTERNAL_ERROR);
1126*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
1127*4d9fdb46SRobert Mustacchi     }
1128*4d9fdb46SRobert Mustacchi     for (obj_section_index = 0; obj_section_index < section_count;
1129*4d9fdb46SRobert Mustacchi         ++obj_section_index) {
1130*4d9fdb46SRobert Mustacchi 
1131*4d9fdb46SRobert Mustacchi         struct Dwarf_Obj_Access_Section_s doas;
1132*4d9fdb46SRobert Mustacchi         int res = DW_DLV_ERROR;
1133*4d9fdb46SRobert Mustacchi         int err = 0;
1134*4d9fdb46SRobert Mustacchi         const char *scn_name = 0;
1135*4d9fdb46SRobert Mustacchi         unsigned groupnumber = 0;
1136*4d9fdb46SRobert Mustacchi         unsigned mapgroupnumber = 0;
1137*4d9fdb46SRobert Mustacchi         int is_rela = FALSE;
1138*4d9fdb46SRobert Mustacchi 
1139*4d9fdb46SRobert Mustacchi         memset(&doas,0,sizeof(doas));
1140*4d9fdb46SRobert Mustacchi         res = obj->methods->get_section_info(obj->object,
1141*4d9fdb46SRobert Mustacchi             obj_section_index,
1142*4d9fdb46SRobert Mustacchi             &doas, &err);
1143*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_NO_ENTRY){
1144*4d9fdb46SRobert Mustacchi             return res;
1145*4d9fdb46SRobert Mustacchi         } else if (res == DW_DLV_ERROR){
1146*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error,err);
1147*4d9fdb46SRobert Mustacchi             return res;
1148*4d9fdb46SRobert Mustacchi         }
1149*4d9fdb46SRobert Mustacchi 
1150*4d9fdb46SRobert Mustacchi         if (doas.type == SHT_GROUP) {
1151*4d9fdb46SRobert Mustacchi             /*  See assumptions in function comment above. */
1152*4d9fdb46SRobert Mustacchi             unsigned did_add_map = 0;
1153*4d9fdb46SRobert Mustacchi             /*  Add to our map. Here we
1154*4d9fdb46SRobert Mustacchi                 are assuming SHT_GROUP records come first.
1155*4d9fdb46SRobert Mustacchi                 Till proven wrong. */
1156*4d9fdb46SRobert Mustacchi             res = insert_sht_list_in_group_map(dbg,&doas,
1157*4d9fdb46SRobert Mustacchi                 comdat_group_next,
1158*4d9fdb46SRobert Mustacchi                 obj_section_index,
1159*4d9fdb46SRobert Mustacchi                 section_count,
1160*4d9fdb46SRobert Mustacchi                 obj,
1161*4d9fdb46SRobert Mustacchi                 &did_add_map,error);
1162*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
1163*4d9fdb46SRobert Mustacchi                 return res;
1164*4d9fdb46SRobert Mustacchi             }
1165*4d9fdb46SRobert Mustacchi             if (!lowest_comdat_groupnum) {
1166*4d9fdb46SRobert Mustacchi                 lowest_comdat_groupnum = comdat_group_next;
1167*4d9fdb46SRobert Mustacchi             }
1168*4d9fdb46SRobert Mustacchi             if (did_add_map) {
1169*4d9fdb46SRobert Mustacchi                 ++grp->gd_number_of_groups;
1170*4d9fdb46SRobert Mustacchi                 ++comdat_group_next;
1171*4d9fdb46SRobert Mustacchi             }
1172*4d9fdb46SRobert Mustacchi             continue;
1173*4d9fdb46SRobert Mustacchi         }
1174*4d9fdb46SRobert Mustacchi         scn_name = doas.name;
1175*4d9fdb46SRobert Mustacchi         if (!this_section_dwarf_relevant(scn_name,doas.type,&is_rela) ) {
1176*4d9fdb46SRobert Mustacchi             continue;
1177*4d9fdb46SRobert Mustacchi         }
1178*4d9fdb46SRobert Mustacchi 
1179*4d9fdb46SRobert Mustacchi         /*  Now at a 'normal' section, though we do not
1180*4d9fdb46SRobert Mustacchi             quite know what group it is. */
1181*4d9fdb46SRobert Mustacchi 
1182*4d9fdb46SRobert Mustacchi         res = _dwarf_section_get_target_group_from_map(dbg,
1183*4d9fdb46SRobert Mustacchi             obj_section_index,&groupnumber,error);
1184*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_OK ) {
1185*4d9fdb46SRobert Mustacchi             /*  groupnumber is set. Fall through.
1186*4d9fdb46SRobert Mustacchi                 All COMDAT group should get here. */
1187*4d9fdb46SRobert Mustacchi             mapgroupnumber = groupnumber;
1188*4d9fdb46SRobert Mustacchi         } else if (res == DW_DLV_ERROR) {
1189*4d9fdb46SRobert Mustacchi             return res;
1190*4d9fdb46SRobert Mustacchi         } else { /* DW_DLV_NO_ENTRY */
1191*4d9fdb46SRobert Mustacchi             /* Normal non-COMDAT. groupnumber is zero.  */
1192*4d9fdb46SRobert Mustacchi         }
1193*4d9fdb46SRobert Mustacchi 
1194*4d9fdb46SRobert Mustacchi 
1195*4d9fdb46SRobert Mustacchi         /* BUILDING_MAP.  See also BUILDING_SECTIONS, SETUP_SECTION */
1196*4d9fdb46SRobert Mustacchi         if (!groupnumber) {
1197*4d9fdb46SRobert Mustacchi             res =_dwarf_dwo_groupnumber_given_name(scn_name,
1198*4d9fdb46SRobert Mustacchi                 &groupnumber);
1199*4d9fdb46SRobert Mustacchi             /* DW_DLV_ERROR impossible here. */
1200*4d9fdb46SRobert Mustacchi             if (res == DW_DLV_OK) {
1201*4d9fdb46SRobert Mustacchi                 /* groupnumber set 2 */
1202*4d9fdb46SRobert Mustacchi             } else {
1203*4d9fdb46SRobert Mustacchi                 /*  This is what it has to be.
1204*4d9fdb46SRobert Mustacchi                     .rela in here too.  */
1205*4d9fdb46SRobert Mustacchi                 groupnumber = DW_GROUPNUMBER_BASE;
1206*4d9fdb46SRobert Mustacchi             }
1207*4d9fdb46SRobert Mustacchi         }
1208*4d9fdb46SRobert Mustacchi         if (is_a_relx_section(scn_name,doas.type,&is_rela)) {
1209*4d9fdb46SRobert Mustacchi             continue;
1210*4d9fdb46SRobert Mustacchi         }
1211*4d9fdb46SRobert Mustacchi 
1212*4d9fdb46SRobert Mustacchi         /*  ASSERT: groupnumber non-zero now */
1213*4d9fdb46SRobert Mustacchi         if (!is_a_special_section_semi_dwarf(scn_name)) {
1214*4d9fdb46SRobert Mustacchi             if (mapgroupnumber) {
1215*4d9fdb46SRobert Mustacchi                 /* Already in group map */
1216*4d9fdb46SRobert Mustacchi                 continue;
1217*4d9fdb46SRobert Mustacchi             }
1218*4d9fdb46SRobert Mustacchi             /* !mapgroupnumber */
1219*4d9fdb46SRobert Mustacchi             res = _dwarf_insert_in_group_map(dbg,
1220*4d9fdb46SRobert Mustacchi                 groupnumber,obj_section_index,
1221*4d9fdb46SRobert Mustacchi                 scn_name,
1222*4d9fdb46SRobert Mustacchi                 error);
1223*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
1224*4d9fdb46SRobert Mustacchi                 return res;
1225*4d9fdb46SRobert Mustacchi             }
1226*4d9fdb46SRobert Mustacchi             if (groupnumber == 1) {
1227*4d9fdb46SRobert Mustacchi                 found_group_one++;
1228*4d9fdb46SRobert Mustacchi             } else if (groupnumber == 2) {
1229*4d9fdb46SRobert Mustacchi                 found_group_two++;
1230*4d9fdb46SRobert Mustacchi             }
1231*4d9fdb46SRobert Mustacchi             continue;
1232*4d9fdb46SRobert Mustacchi         }
1233*4d9fdb46SRobert Mustacchi     }
1234*4d9fdb46SRobert Mustacchi     if (found_group_two) {
1235*4d9fdb46SRobert Mustacchi         ++grp->gd_number_of_groups;
1236*4d9fdb46SRobert Mustacchi     }
1237*4d9fdb46SRobert Mustacchi     if (found_group_one) {
1238*4d9fdb46SRobert Mustacchi         *group_number_out = DW_GROUPNUMBER_BASE;
1239*4d9fdb46SRobert Mustacchi         ++grp->gd_number_of_groups;
1240*4d9fdb46SRobert Mustacchi     } else {
1241*4d9fdb46SRobert Mustacchi         if (found_group_two) {
1242*4d9fdb46SRobert Mustacchi             *group_number_out = DW_GROUPNUMBER_DWO;
1243*4d9fdb46SRobert Mustacchi         } else {
1244*4d9fdb46SRobert Mustacchi             if (lowest_comdat_groupnum) {
1245*4d9fdb46SRobert Mustacchi                 *group_number_out = lowest_comdat_groupnum;
1246*4d9fdb46SRobert Mustacchi             } else {
1247*4d9fdb46SRobert Mustacchi                 *group_number_out = DW_GROUPNUMBER_BASE;
1248*4d9fdb46SRobert Mustacchi             }
1249*4d9fdb46SRobert Mustacchi         }
1250*4d9fdb46SRobert Mustacchi     }
1251*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1252*4d9fdb46SRobert Mustacchi }
1253*4d9fdb46SRobert Mustacchi 
1254*4d9fdb46SRobert Mustacchi 
1255*4d9fdb46SRobert Mustacchi 
1256bc1f688bSRobert Mustacchi static int
_dwarf_setup(Dwarf_Debug dbg,Dwarf_Error * error)1257bc1f688bSRobert Mustacchi _dwarf_setup(Dwarf_Debug dbg, Dwarf_Error * error)
1258bc1f688bSRobert Mustacchi {
1259bc1f688bSRobert Mustacchi     const char *scn_name = 0;
1260bc1f688bSRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s * obj = 0;
1261*4d9fdb46SRobert Mustacchi     int resn = 0;
1262*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s **sections = 0;
1263bc1f688bSRobert Mustacchi     Dwarf_Endianness endianness;
1264bc1f688bSRobert Mustacchi     Dwarf_Unsigned section_count = 0;
1265*4d9fdb46SRobert Mustacchi     unsigned default_group_number = 0;
1266*4d9fdb46SRobert Mustacchi     unsigned foundDwarf = FALSE;
1267*4d9fdb46SRobert Mustacchi     unsigned obj_section_index = 0;
1268bc1f688bSRobert Mustacchi 
1269*4d9fdb46SRobert Mustacchi     dbg->de_assume_string_in_bounds =
1270*4d9fdb46SRobert Mustacchi         _dwarf_assume_string_in_bounds;
1271*4d9fdb46SRobert Mustacchi     /* First make an arbitrary assumption. */
1272bc1f688bSRobert Mustacchi     dbg->de_same_endian = 1;
1273*4d9fdb46SRobert Mustacchi     dbg->de_copy_word = _dwarf_memcpy_noswap_bytes;
1274bc1f688bSRobert Mustacchi     obj = dbg->de_obj_file;
1275bc1f688bSRobert Mustacchi     endianness = obj->methods->get_byte_order(obj->object);
1276*4d9fdb46SRobert Mustacchi     /* Then adjust any changes we need. */
1277bc1f688bSRobert Mustacchi #ifdef WORDS_BIGENDIAN
1278bc1f688bSRobert Mustacchi     dbg->de_big_endian_object = 1;
1279bc1f688bSRobert Mustacchi     if (endianness == DW_OBJECT_LSB ) {
1280bc1f688bSRobert Mustacchi         dbg->de_same_endian = 0;
1281bc1f688bSRobert Mustacchi         dbg->de_big_endian_object = 0;
1282bc1f688bSRobert Mustacchi         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
1283bc1f688bSRobert Mustacchi     }
1284bc1f688bSRobert Mustacchi #else /* little endian */
1285bc1f688bSRobert Mustacchi     dbg->de_big_endian_object = 0;
1286bc1f688bSRobert Mustacchi     if (endianness == DW_OBJECT_MSB ) {
1287bc1f688bSRobert Mustacchi         dbg->de_same_endian = 0;
1288bc1f688bSRobert Mustacchi         dbg->de_big_endian_object = 1;
1289bc1f688bSRobert Mustacchi         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
1290bc1f688bSRobert Mustacchi     }
1291bc1f688bSRobert Mustacchi #endif /* !WORDS_BIGENDIAN */
1292bc1f688bSRobert Mustacchi 
1293bc1f688bSRobert Mustacchi 
1294bc1f688bSRobert Mustacchi     /*  The following de_length_size is Not Too Significant. Only used
1295bc1f688bSRobert Mustacchi         one calculation, and an approximate one at that. */
1296bc1f688bSRobert Mustacchi     dbg->de_length_size = obj->methods->get_length_size(obj->object);
1297bc1f688bSRobert Mustacchi     dbg->de_pointer_size = obj->methods->get_pointer_size(obj->object);
1298bc1f688bSRobert Mustacchi 
1299bc1f688bSRobert Mustacchi     section_count = obj->methods->get_section_count(obj->object);
1300*4d9fdb46SRobert Mustacchi     resn = determine_target_group(section_count,obj,
1301*4d9fdb46SRobert Mustacchi         &default_group_number,dbg,error);
1302*4d9fdb46SRobert Mustacchi     if (resn == DW_DLV_ERROR) {
1303*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1304*4d9fdb46SRobert Mustacchi     }
1305*4d9fdb46SRobert Mustacchi     if (dbg->de_groupnumber == DW_GROUPNUMBER_ANY) {
1306*4d9fdb46SRobert Mustacchi         dbg->de_groupnumber = default_group_number;
1307*4d9fdb46SRobert Mustacchi     }
1308*4d9fdb46SRobert Mustacchi     /*  Allocate space to record references to debug sections, that can
1309*4d9fdb46SRobert Mustacchi         be referenced by RELA sections in the 'sh_info' field. */
1310*4d9fdb46SRobert Mustacchi     sections = (struct Dwarf_Section_s **)calloc(section_count + 1,
1311*4d9fdb46SRobert Mustacchi         sizeof(struct Dwarf_Section_s *));
1312*4d9fdb46SRobert Mustacchi     if (!sections) {
1313*4d9fdb46SRobert Mustacchi         /* Impossible case, we hope. Give up. */
1314*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_SECTION_ERROR);
1315*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1316*4d9fdb46SRobert Mustacchi     }
1317bc1f688bSRobert Mustacchi 
1318bc1f688bSRobert Mustacchi     /*  We can skip index 0 when considering ELF files, but not other
1319*4d9fdb46SRobert Mustacchi         object types.  Indeed regardless of the object type we should
1320*4d9fdb46SRobert Mustacchi         skip section 0 here.
1321*4d9fdb46SRobert Mustacchi         This is a convention.  We depend on it.
1322*4d9fdb46SRobert Mustacchi         Non-elf object access code should
1323*4d9fdb46SRobert Mustacchi         (in itself) understand we will index beginning at 1 and adjust
1324*4d9fdb46SRobert Mustacchi         itself to deal with this Elf convention.    Without this
1325*4d9fdb46SRobert Mustacchi         convention various parts of the code in this file won't work correctly.
1326*4d9fdb46SRobert Mustacchi         A dss_index of 0 must not be used, even though we start at 0
1327*4d9fdb46SRobert Mustacchi         here.  So the get_section_info() must adapt to the situation
1328*4d9fdb46SRobert Mustacchi         (the elf version does automatically as a result of Elf having
1329*4d9fdb46SRobert Mustacchi         a section zero with zero length and an empty name). */
1330*4d9fdb46SRobert Mustacchi 
1331*4d9fdb46SRobert Mustacchi     /* ASSERT: all group map entries set up. */
1332*4d9fdb46SRobert Mustacchi 
1333*4d9fdb46SRobert Mustacchi     for (obj_section_index = 0; obj_section_index < section_count;
1334*4d9fdb46SRobert Mustacchi         ++obj_section_index) {
1335bc1f688bSRobert Mustacchi 
1336bc1f688bSRobert Mustacchi         struct Dwarf_Obj_Access_Section_s doas;
1337bc1f688bSRobert Mustacchi         int res = DW_DLV_ERROR;
1338*4d9fdb46SRobert Mustacchi         int err = 0;
1339*4d9fdb46SRobert Mustacchi         unsigned groupnumber = 0;
1340*4d9fdb46SRobert Mustacchi         unsigned mapgroupnumber = 0;
1341*4d9fdb46SRobert Mustacchi         int is_rela = FALSE;
1342bc1f688bSRobert Mustacchi 
1343*4d9fdb46SRobert Mustacchi         res = _dwarf_section_get_target_group_from_map(dbg,obj_section_index,
1344*4d9fdb46SRobert Mustacchi             &groupnumber,error);
1345*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_OK ) {
1346*4d9fdb46SRobert Mustacchi             /* groupnumber is set. Fall through */
1347*4d9fdb46SRobert Mustacchi             mapgroupnumber = groupnumber;
1348*4d9fdb46SRobert Mustacchi         } else if (res == DW_DLV_ERROR) {
1349*4d9fdb46SRobert Mustacchi             free(sections);
1350*4d9fdb46SRobert Mustacchi             return res;
1351*4d9fdb46SRobert Mustacchi         } else { /* DW_DLV_NO_ENTRY */
1352*4d9fdb46SRobert Mustacchi             /* fall through, a BASE or DWO group, possibly */
1353*4d9fdb46SRobert Mustacchi         }
1354*4d9fdb46SRobert Mustacchi         memset(&doas,0,sizeof(doas));
1355bc1f688bSRobert Mustacchi         res = obj->methods->get_section_info(obj->object,
1356*4d9fdb46SRobert Mustacchi             obj_section_index,
1357bc1f688bSRobert Mustacchi             &doas, &err);
1358*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_NO_ENTRY){
1359*4d9fdb46SRobert Mustacchi             free(sections);
1360*4d9fdb46SRobert Mustacchi             return res;
1361*4d9fdb46SRobert Mustacchi         } else if (res == DW_DLV_ERROR){
1362*4d9fdb46SRobert Mustacchi             free(sections);
1363*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
1364*4d9fdb46SRobert Mustacchi         }
1365*4d9fdb46SRobert Mustacchi         scn_name = doas.name;
1366*4d9fdb46SRobert Mustacchi         if (!groupnumber) {
1367*4d9fdb46SRobert Mustacchi             /* This finds dwo sections, group 2 */
1368*4d9fdb46SRobert Mustacchi             res = _dwarf_dwo_groupnumber_given_name(scn_name,
1369*4d9fdb46SRobert Mustacchi                 &groupnumber);
1370*4d9fdb46SRobert Mustacchi             if (res == DW_DLV_NO_ENTRY) {
1371*4d9fdb46SRobert Mustacchi                 /* No, must be group 1 */
1372*4d9fdb46SRobert Mustacchi                 groupnumber = DW_GROUPNUMBER_BASE;
1373*4d9fdb46SRobert Mustacchi             }
1374*4d9fdb46SRobert Mustacchi         }
1375*4d9fdb46SRobert Mustacchi         if (!this_section_dwarf_relevant(scn_name,doas.type,&is_rela) ) {
1376*4d9fdb46SRobert Mustacchi             continue;
1377*4d9fdb46SRobert Mustacchi         }
1378*4d9fdb46SRobert Mustacchi         if (!is_a_relx_section(scn_name,doas.type,&is_rela)
1379*4d9fdb46SRobert Mustacchi             && !is_a_special_section_semi_dwarf(scn_name)) {
1380*4d9fdb46SRobert Mustacchi             /*  We do these actions only for group-related
1381*4d9fdb46SRobert Mustacchi                 sections.  Do for  .debug_info etc,
1382*4d9fdb46SRobert Mustacchi                 never for .strtab or .rela.*
1383*4d9fdb46SRobert Mustacchi                 We already tested for relevance, so that part
1384*4d9fdb46SRobert Mustacchi                 is not news. */
1385*4d9fdb46SRobert Mustacchi             if(mapgroupnumber == dbg->de_groupnumber) {
1386*4d9fdb46SRobert Mustacchi                 /*  OK. Mapped. Part of the group.. This will
1387*4d9fdb46SRobert Mustacchi                     catch the cases where there are versions of
1388*4d9fdb46SRobert Mustacchi                     a section in multiple COMDATs and in BASE
1389*4d9fdb46SRobert Mustacchi                     an DWO to get the right one */
1390*4d9fdb46SRobert Mustacchi             } else {
1391*4d9fdb46SRobert Mustacchi                 /* This section not mapped into this group. */
1392*4d9fdb46SRobert Mustacchi                 if (groupnumber == 1 && dbg->de_groupnumber > 2 &&
1393*4d9fdb46SRobert Mustacchi                     !_dwarf_section_in_group_by_name(dbg,scn_name,
1394*4d9fdb46SRobert Mustacchi                         dbg->de_groupnumber)) {
1395*4d9fdb46SRobert Mustacchi                     /* Load the section (but as group 1) */
1396*4d9fdb46SRobert Mustacchi                 } else {
1397*4d9fdb46SRobert Mustacchi                     continue;
1398*4d9fdb46SRobert Mustacchi                 }
1399*4d9fdb46SRobert Mustacchi             }
1400*4d9fdb46SRobert Mustacchi         }
1401*4d9fdb46SRobert Mustacchi         /* BUILDING_SECTIONS.  See also BUILDING_MAP, SETUP_SECTION */
1402*4d9fdb46SRobert Mustacchi         {
1403*4d9fdb46SRobert Mustacchi             /*  Build up the sections table and the
1404*4d9fdb46SRobert Mustacchi                 de_debug* etc pointers in Dwarf_Debug. */
1405*4d9fdb46SRobert Mustacchi             struct Dwarf_dbg_sect_s *section;
1406*4d9fdb46SRobert Mustacchi 
1407*4d9fdb46SRobert Mustacchi             int found_match = FALSE;
1408*4d9fdb46SRobert Mustacchi 
1409*4d9fdb46SRobert Mustacchi             res = is_section_name_known_already(dbg,scn_name);
1410*4d9fdb46SRobert Mustacchi             if (res == DW_DLV_OK) {
1411*4d9fdb46SRobert Mustacchi                 /* DUPLICATE */
1412*4d9fdb46SRobert Mustacchi                 free(sections);
1413*4d9fdb46SRobert Mustacchi                 DWARF_DBG_ERROR(dbg, DW_DLE_SECTION_DUPLICATION,
1414*4d9fdb46SRobert Mustacchi                     DW_DLV_ERROR);
1415*4d9fdb46SRobert Mustacchi             } else if (res == DW_DLV_ERROR) {
1416*4d9fdb46SRobert Mustacchi                 free(sections);
1417*4d9fdb46SRobert Mustacchi                 DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
1418*4d9fdb46SRobert Mustacchi             }
1419*4d9fdb46SRobert Mustacchi             /* No entry: new-to-us section, the normal case. */
1420*4d9fdb46SRobert Mustacchi             res = enter_section_in_de_debug_sections_array(dbg,scn_name,
1421*4d9fdb46SRobert Mustacchi                 obj_section_index, groupnumber,&err);
1422*4d9fdb46SRobert Mustacchi             if (res == DW_DLV_OK) {
1423*4d9fdb46SRobert Mustacchi                 section = &dbg->de_debug_sections[
1424*4d9fdb46SRobert Mustacchi                     dbg->de_debug_sections_total_entries-1];
1425*4d9fdb46SRobert Mustacchi                 res = get_basic_section_data(dbg,
1426*4d9fdb46SRobert Mustacchi                     section->ds_secdata, &doas,
1427*4d9fdb46SRobert Mustacchi                     obj_section_index,
1428*4d9fdb46SRobert Mustacchi                     groupnumber,
1429*4d9fdb46SRobert Mustacchi                     error,
1430*4d9fdb46SRobert Mustacchi                     section->ds_duperr,
1431*4d9fdb46SRobert Mustacchi                     section->ds_emptyerr);
1432*4d9fdb46SRobert Mustacchi                 if (res != DW_DLV_OK) {
1433*4d9fdb46SRobert Mustacchi                     free(sections);
1434*4d9fdb46SRobert Mustacchi                     return res;
1435*4d9fdb46SRobert Mustacchi                 }
1436*4d9fdb46SRobert Mustacchi                 sections[obj_section_index] = section->ds_secdata;
1437*4d9fdb46SRobert Mustacchi                 foundDwarf += section->ds_have_dwarf;
1438*4d9fdb46SRobert Mustacchi                 found_match = TRUE;
1439*4d9fdb46SRobert Mustacchi                 /*  Normal section set up.
1440*4d9fdb46SRobert Mustacchi                     Fall through. */
1441*4d9fdb46SRobert Mustacchi             } else if (res == DW_DLV_NO_ENTRY) {
1442*4d9fdb46SRobert Mustacchi                 /*  We get here for relocation sections.
1443*4d9fdb46SRobert Mustacchi                     Fall through. */
1444*4d9fdb46SRobert Mustacchi             } else {
1445*4d9fdb46SRobert Mustacchi                 free(sections);
1446bc1f688bSRobert Mustacchi                 DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
1447bc1f688bSRobert Mustacchi             }
1448bc1f688bSRobert Mustacchi 
1449*4d9fdb46SRobert Mustacchi             if (!found_match) {
1450*4d9fdb46SRobert Mustacchi                 /*  For an object file with incorrect rel[a] section name,
1451*4d9fdb46SRobert Mustacchi                     the 'readelf' tool, prints correct debug information,
1452*4d9fdb46SRobert Mustacchi                     as the tool takes the section type instead
1453*4d9fdb46SRobert Mustacchi                     of the section name. If the current section
1454*4d9fdb46SRobert Mustacchi                     is a RELA one and the 'sh_info'
1455*4d9fdb46SRobert Mustacchi                     refers to a debug section, add the relocation data. */
1456*4d9fdb46SRobert Mustacchi                 if (is_a_relx_section(scn_name,doas.type,&is_rela)) {
1457*4d9fdb46SRobert Mustacchi                     if ( doas.info < section_count) {
1458*4d9fdb46SRobert Mustacchi                         if (sections[doas.info]) {
1459*4d9fdb46SRobert Mustacchi                             add_relx_data_to_secdata(sections[doas.info],
1460*4d9fdb46SRobert Mustacchi                                 &doas,
1461*4d9fdb46SRobert Mustacchi                                 obj_section_index,is_rela);
1462bc1f688bSRobert Mustacchi                         }
1463*4d9fdb46SRobert Mustacchi                     } else {
1464*4d9fdb46SRobert Mustacchi                         /* Something is wrong with the ELF file. */
1465*4d9fdb46SRobert Mustacchi                         free(sections);
1466*4d9fdb46SRobert Mustacchi                         DWARF_DBG_ERROR(dbg, DW_DLE_ELF_SECT_ERR, DW_DLV_ERROR);
1467bc1f688bSRobert Mustacchi                     }
1468bc1f688bSRobert Mustacchi                 }
1469*4d9fdb46SRobert Mustacchi             }
1470*4d9fdb46SRobert Mustacchi             /* Fetch next section */
1471bc1f688bSRobert Mustacchi         }
1472bc1f688bSRobert Mustacchi     }
1473bc1f688bSRobert Mustacchi 
1474*4d9fdb46SRobert Mustacchi     /* Free table with section information. */
1475*4d9fdb46SRobert Mustacchi     free(sections);
1476bc1f688bSRobert Mustacchi     if (foundDwarf) {
1477bc1f688bSRobert Mustacchi         return DW_DLV_OK;
1478bc1f688bSRobert Mustacchi     }
1479bc1f688bSRobert Mustacchi     return DW_DLV_NO_ENTRY;
1480bc1f688bSRobert Mustacchi }
1481bc1f688bSRobert Mustacchi 
1482*4d9fdb46SRobert Mustacchi /*  There is one table per CU and one per TU, and each
1483*4d9fdb46SRobert Mustacchi     table refers to the associated other DWARF data
1484*4d9fdb46SRobert Mustacchi     for that CU or TU.
1485*4d9fdb46SRobert Mustacchi     See DW_SECT_*
1486*4d9fdb46SRobert Mustacchi 
1487*4d9fdb46SRobert Mustacchi     In DWARF4 the type units are in .debug_types
1488*4d9fdb46SRobert Mustacchi     In DWARF5 the type units are in .debug_info.
1489*4d9fdb46SRobert Mustacchi */
1490*4d9fdb46SRobert Mustacchi 
1491*4d9fdb46SRobert Mustacchi static int
load_debugfission_tables(Dwarf_Debug dbg,Dwarf_Error * error)1492*4d9fdb46SRobert Mustacchi load_debugfission_tables(Dwarf_Debug dbg,Dwarf_Error *error)
1493*4d9fdb46SRobert Mustacchi {
1494*4d9fdb46SRobert Mustacchi     int i = 0;
1495*4d9fdb46SRobert Mustacchi     if (dbg->de_debug_cu_index.dss_size ==0 &&
1496*4d9fdb46SRobert Mustacchi         dbg->de_debug_tu_index.dss_size ==0) {
1497*4d9fdb46SRobert Mustacchi         /*  This is the normal case.
1498*4d9fdb46SRobert Mustacchi             No debug fission. Not a .dwp object. */
1499*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
1500*4d9fdb46SRobert Mustacchi     }
1501*4d9fdb46SRobert Mustacchi 
1502*4d9fdb46SRobert Mustacchi     for (i = 0; i < 2; ++i) {
1503*4d9fdb46SRobert Mustacchi         Dwarf_Xu_Index_Header xuptr = 0;
1504*4d9fdb46SRobert Mustacchi         struct Dwarf_Section_s* dwsect = 0;
1505*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned version = 0;
1506*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned number_of_cols /* L */ = 0;
1507*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned number_of_CUs /* N */ = 0;
1508*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned number_of_slots /* M */ = 0;
1509*4d9fdb46SRobert Mustacchi         const char *secname = 0;
1510*4d9fdb46SRobert Mustacchi         int res = 0;
1511*4d9fdb46SRobert Mustacchi         const char *type = 0;
1512*4d9fdb46SRobert Mustacchi 
1513*4d9fdb46SRobert Mustacchi         if (i == 0) {
1514*4d9fdb46SRobert Mustacchi             dwsect = &dbg->de_debug_cu_index;
1515*4d9fdb46SRobert Mustacchi             type = "cu";
1516*4d9fdb46SRobert Mustacchi         } else {
1517*4d9fdb46SRobert Mustacchi             dwsect = &dbg->de_debug_tu_index;
1518*4d9fdb46SRobert Mustacchi             type = "tu";
1519*4d9fdb46SRobert Mustacchi         }
1520*4d9fdb46SRobert Mustacchi         if ( !dwsect->dss_size ) {
1521*4d9fdb46SRobert Mustacchi             continue;
1522*4d9fdb46SRobert Mustacchi         }
1523*4d9fdb46SRobert Mustacchi         res = dwarf_get_xu_index_header(dbg,type,
1524*4d9fdb46SRobert Mustacchi             &xuptr,&version,&number_of_cols,
1525*4d9fdb46SRobert Mustacchi             &number_of_CUs,&number_of_slots,
1526*4d9fdb46SRobert Mustacchi             &secname,error);
1527*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_NO_ENTRY) {
1528*4d9fdb46SRobert Mustacchi             continue;
1529*4d9fdb46SRobert Mustacchi         }
1530*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1531*4d9fdb46SRobert Mustacchi             return res;
1532*4d9fdb46SRobert Mustacchi         }
1533*4d9fdb46SRobert Mustacchi         if (i == 0) {
1534*4d9fdb46SRobert Mustacchi             dbg->de_cu_hashindex_data = xuptr;
1535*4d9fdb46SRobert Mustacchi         } else {
1536*4d9fdb46SRobert Mustacchi             dbg->de_tu_hashindex_data = xuptr;
1537*4d9fdb46SRobert Mustacchi         }
1538*4d9fdb46SRobert Mustacchi     }
1539*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1540*4d9fdb46SRobert Mustacchi }
1541bc1f688bSRobert Mustacchi 
1542bc1f688bSRobert Mustacchi /*
1543bc1f688bSRobert Mustacchi     Use a Dwarf_Obj_Access_Interface to kick things off. All other
1544bc1f688bSRobert Mustacchi     init routines eventually use this one.
1545bc1f688bSRobert Mustacchi     The returned Dwarf_Debug contains a copy of *obj
1546bc1f688bSRobert Mustacchi     the callers copy of *obj may be freed whenever the caller
1547bc1f688bSRobert Mustacchi     wishes.
1548bc1f688bSRobert Mustacchi */
1549bc1f688bSRobert Mustacchi int
dwarf_object_init(Dwarf_Obj_Access_Interface * obj,Dwarf_Handler errhand,Dwarf_Ptr errarg,Dwarf_Debug * ret_dbg,Dwarf_Error * error)1550*4d9fdb46SRobert Mustacchi dwarf_object_init(Dwarf_Obj_Access_Interface* obj,
1551*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
1552bc1f688bSRobert Mustacchi     Dwarf_Ptr errarg, Dwarf_Debug* ret_dbg,
1553bc1f688bSRobert Mustacchi     Dwarf_Error* error)
1554bc1f688bSRobert Mustacchi {
1555*4d9fdb46SRobert Mustacchi     return dwarf_object_init_b(obj,errhand,errarg,
1556*4d9fdb46SRobert Mustacchi         DW_GROUPNUMBER_ANY,ret_dbg,error);
1557*4d9fdb46SRobert Mustacchi }
1558*4d9fdb46SRobert Mustacchi 
1559*4d9fdb46SRobert Mustacchi /*  New March 2017. Enables dealing with DWARF5 split dwarf more fully.  */
1560*4d9fdb46SRobert Mustacchi int
dwarf_object_init_b(Dwarf_Obj_Access_Interface * obj,Dwarf_Handler errhand,Dwarf_Ptr errarg,unsigned groupnumber,Dwarf_Debug * ret_dbg,Dwarf_Error * error)1561*4d9fdb46SRobert Mustacchi dwarf_object_init_b(Dwarf_Obj_Access_Interface* obj, Dwarf_Handler errhand,
1562*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
1563*4d9fdb46SRobert Mustacchi     unsigned groupnumber,
1564*4d9fdb46SRobert Mustacchi     Dwarf_Debug* ret_dbg,
1565*4d9fdb46SRobert Mustacchi     Dwarf_Error* error)
1566*4d9fdb46SRobert Mustacchi {
1567bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = 0;
1568bc1f688bSRobert Mustacchi     int setup_result = DW_DLV_OK;
1569bc1f688bSRobert Mustacchi 
1570bc1f688bSRobert Mustacchi     dbg = _dwarf_get_debug();
1571bc1f688bSRobert Mustacchi     if (dbg == NULL) {
1572bc1f688bSRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
1573bc1f688bSRobert Mustacchi     }
1574bc1f688bSRobert Mustacchi     dbg->de_errhand = errhand;
1575bc1f688bSRobert Mustacchi     dbg->de_errarg = errarg;
1576bc1f688bSRobert Mustacchi     dbg->de_frame_rule_initial_value = DW_FRAME_REG_INITIAL_VALUE;
1577bc1f688bSRobert Mustacchi     dbg->de_frame_reg_rules_entry_count = DW_FRAME_LAST_REG_NUM;
1578bc1f688bSRobert Mustacchi #ifdef HAVE_OLD_FRAME_CFA_COL
1579bc1f688bSRobert Mustacchi     /*  DW_FRAME_CFA_COL is really only suitable for old libdwarf frame
1580bc1f688bSRobert Mustacchi         interfaces and its value of 0 there is only usable where
1581bc1f688bSRobert Mustacchi         (as in MIPS) register 0 has no value other than 0 so
1582bc1f688bSRobert Mustacchi         we can use the frame table column 0 for the CFA value
1583bc1f688bSRobert Mustacchi         (and rely on client software to know when 'register 0'
1584bc1f688bSRobert Mustacchi         is the cfa and when to just use a value 0 for register 0).
1585bc1f688bSRobert Mustacchi     */
1586bc1f688bSRobert Mustacchi     dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL;
1587bc1f688bSRobert Mustacchi #else
1588bc1f688bSRobert Mustacchi     dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL3;
1589bc1f688bSRobert Mustacchi #endif
1590bc1f688bSRobert Mustacchi     dbg->de_frame_same_value_number = DW_FRAME_SAME_VAL;
1591bc1f688bSRobert Mustacchi     dbg->de_frame_undefined_value_number  = DW_FRAME_UNDEFINED_VAL;
1592bc1f688bSRobert Mustacchi 
1593bc1f688bSRobert Mustacchi     dbg->de_obj_file = obj;
1594*4d9fdb46SRobert Mustacchi     dbg->de_groupnumber = groupnumber;
1595bc1f688bSRobert Mustacchi     setup_result = _dwarf_setup(dbg, error);
1596*4d9fdb46SRobert Mustacchi     if (setup_result == DW_DLV_OK) {
1597*4d9fdb46SRobert Mustacchi         int fission_result = load_debugfission_tables(dbg,error);
1598*4d9fdb46SRobert Mustacchi         /*  In most cases we get
1599*4d9fdb46SRobert Mustacchi             setup_result == DW_DLV_NO_ENTRY here
1600*4d9fdb46SRobert Mustacchi             as having debugfission (.dwp objects)
1601*4d9fdb46SRobert Mustacchi             is fairly rare. */
1602*4d9fdb46SRobert Mustacchi         if (fission_result == DW_DLV_ERROR) {
1603*4d9fdb46SRobert Mustacchi             /*  Something is very wrong. */
1604*4d9fdb46SRobert Mustacchi             setup_result = fission_result;
1605*4d9fdb46SRobert Mustacchi         }
1606*4d9fdb46SRobert Mustacchi     }
1607bc1f688bSRobert Mustacchi     if (setup_result != DW_DLV_OK) {
1608*4d9fdb46SRobert Mustacchi         int freeresult = 0;
1609*4d9fdb46SRobert Mustacchi         int myerr = 0;
1610*4d9fdb46SRobert Mustacchi         dwarfstring msg;
1611*4d9fdb46SRobert Mustacchi 
1612*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&msg);
1613*4d9fdb46SRobert Mustacchi         /* We cannot use any _dwarf_setup()
1614*4d9fdb46SRobert Mustacchi             error here as
1615*4d9fdb46SRobert Mustacchi             we are freeing dbg, making that error (setup
1616*4d9fdb46SRobert Mustacchi             as part of dbg) stale.
1617*4d9fdb46SRobert Mustacchi             Hence we have to make a new error without a dbg.
1618*4d9fdb46SRobert Mustacchi             But error might be NULL and the init call
1619*4d9fdb46SRobert Mustacchi             error-handler function might be set.
1620*4d9fdb46SRobert Mustacchi         */
1621*4d9fdb46SRobert Mustacchi         if ( (setup_result == DW_DLV_ERROR) && *error ) {
1622*4d9fdb46SRobert Mustacchi             /*  Preserve our _dwarf_setup error number, but
1623*4d9fdb46SRobert Mustacchi                 this does not apply if error NULL. */
1624*4d9fdb46SRobert Mustacchi             myerr = dwarf_errno(*error);
1625*4d9fdb46SRobert Mustacchi             dwarfstring_append(&msg,dwarf_errmsg(*error));
1626*4d9fdb46SRobert Mustacchi             /*  deallocate the soon-stale error pointer. */
1627*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,*error,DW_DLA_ERROR);
1628*4d9fdb46SRobert Mustacchi             *error = 0;
1629*4d9fdb46SRobert Mustacchi         }
1630bc1f688bSRobert Mustacchi         /*  The status we want to return  here is of _dwarf_setup,
1631bc1f688bSRobert Mustacchi             not of the  _dwarf_free_all_of_one_debug(dbg) call.
1632bc1f688bSRobert Mustacchi             So use a local status variable for the free.  */
1633*4d9fdb46SRobert Mustacchi         freeresult = _dwarf_free_all_of_one_debug(dbg);
1634*4d9fdb46SRobert Mustacchi         dbg = 0;
1635*4d9fdb46SRobert Mustacchi         /* DW_DLV_NO_ENTRY not possible in freeresult */
1636bc1f688bSRobert Mustacchi         if (freeresult == DW_DLV_ERROR) {
1637*4d9fdb46SRobert Mustacchi             /*  Use the _dwarf_setup error number.
1638*4d9fdb46SRobert Mustacchi                 If error is NULL the following will issue
1639*4d9fdb46SRobert Mustacchi                 a message on stderr and abort(), as without
1640*4d9fdb46SRobert Mustacchi                 dbg there is no error-handler function.
1641*4d9fdb46SRobert Mustacchi                 */
1642*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,DW_DLE_DBG_ALLOC,
1643*4d9fdb46SRobert Mustacchi                 dwarfstring_string(&msg));
1644*4d9fdb46SRobert Mustacchi             dwarfstring_destructor(&msg);
1645*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1646bc1f688bSRobert Mustacchi         }
1647*4d9fdb46SRobert Mustacchi         if (setup_result == DW_DLV_ERROR) {
1648*4d9fdb46SRobert Mustacchi             /*  Use the _dwarf_setup error number.
1649*4d9fdb46SRobert Mustacchi                 If error is NULL the following will issue
1650*4d9fdb46SRobert Mustacchi                 a message on stderr and abort(), as without
1651*4d9fdb46SRobert Mustacchi                 dbg there is no error-handler function.
1652*4d9fdb46SRobert Mustacchi                 */
1653*4d9fdb46SRobert Mustacchi             _dwarf_error_string(dbg,error,myerr,
1654*4d9fdb46SRobert Mustacchi                 dwarfstring_string(&msg));
1655*4d9fdb46SRobert Mustacchi         }
1656*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&msg);
1657bc1f688bSRobert Mustacchi         return setup_result;
1658bc1f688bSRobert Mustacchi     }
1659bc1f688bSRobert Mustacchi     dwarf_harmless_init(&dbg->de_harmless_errors,
1660bc1f688bSRobert Mustacchi         DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE);
1661bc1f688bSRobert Mustacchi     *ret_dbg = dbg;
1662bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1663bc1f688bSRobert Mustacchi }
1664bc1f688bSRobert Mustacchi 
1665*4d9fdb46SRobert Mustacchi /*  A finish routine that is completely unaware of ELF.
1666bc1f688bSRobert Mustacchi 
1667bc1f688bSRobert Mustacchi     Frees all memory that was not previously freed by
1668bc1f688bSRobert Mustacchi     dwarf_dealloc.
1669*4d9fdb46SRobert Mustacchi     Aside from certain categories.  */
1670bc1f688bSRobert Mustacchi int
dwarf_object_finish(Dwarf_Debug dbg,Dwarf_Error * error)1671bc1f688bSRobert Mustacchi dwarf_object_finish(Dwarf_Debug dbg, Dwarf_Error * error)
1672bc1f688bSRobert Mustacchi {
1673*4d9fdb46SRobert Mustacchi     int res = 0;
1674bc1f688bSRobert Mustacchi 
1675bc1f688bSRobert Mustacchi     res = _dwarf_free_all_of_one_debug(dbg);
1676bc1f688bSRobert Mustacchi     if (res == DW_DLV_ERROR) {
1677bc1f688bSRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
1678bc1f688bSRobert Mustacchi     }
1679bc1f688bSRobert Mustacchi     return res;
1680bc1f688bSRobert Mustacchi }
1681bc1f688bSRobert Mustacchi 
1682*4d9fdb46SRobert Mustacchi #ifdef HAVE_ZLIB
1683*4d9fdb46SRobert Mustacchi /*  case 1:
1684*4d9fdb46SRobert Mustacchi     The input stream is assumed to contain
1685*4d9fdb46SRobert Mustacchi     the four letters
1686*4d9fdb46SRobert Mustacchi     ZLIB
1687*4d9fdb46SRobert Mustacchi     Followed by 8 bytes of the size of the
1688*4d9fdb46SRobert Mustacchi     uncompressed stream. Presented as
1689*4d9fdb46SRobert Mustacchi     a big-endian binary number.
1690*4d9fdb46SRobert Mustacchi     Following that is the stream to decompress.
1691bc1f688bSRobert Mustacchi 
1692*4d9fdb46SRobert Mustacchi     case 2:
1693*4d9fdb46SRobert Mustacchi     The section flag bit  SHF_COMPRESSED (1 << 11)
1694*4d9fdb46SRobert Mustacchi     must be set.
1695*4d9fdb46SRobert Mustacchi     we then do the eqivalent of reading a
1696*4d9fdb46SRobert Mustacchi         Elf32_External_Chdr
1697*4d9fdb46SRobert Mustacchi     or
1698*4d9fdb46SRobert Mustacchi         Elf64_External_Chdr
1699*4d9fdb46SRobert Mustacchi     to get the type (which must be 1)
1700*4d9fdb46SRobert Mustacchi     and the decompressed_length.
1701*4d9fdb46SRobert Mustacchi     Then what follows the implicit Chdr is decompressed.
1702bc1f688bSRobert Mustacchi     */
1703*4d9fdb46SRobert Mustacchi 
1704*4d9fdb46SRobert Mustacchi /*  ALLOWED_ZLIB_INFLATION is a heuristic, not necessarily right.
1705*4d9fdb46SRobert Mustacchi     The test case klingler2/compresseddebug.amd64 actually
1706*4d9fdb46SRobert Mustacchi     inflates about 8 times. */
1707*4d9fdb46SRobert Mustacchi #define ALLOWED_ZLIB_INFLATION 16
1708*4d9fdb46SRobert Mustacchi static int
do_decompress_zlib(Dwarf_Debug dbg,struct Dwarf_Section_s * section,Dwarf_Error * error)1709*4d9fdb46SRobert Mustacchi do_decompress_zlib(Dwarf_Debug dbg,
1710*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *section,
1711*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1712*4d9fdb46SRobert Mustacchi {
1713*4d9fdb46SRobert Mustacchi     Bytef *basesrc = (Bytef *)section->dss_data;
1714*4d9fdb46SRobert Mustacchi     Bytef *src = (Bytef *)basesrc;
1715*4d9fdb46SRobert Mustacchi     uLong srclen = section->dss_size;
1716*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned flags = section->dss_flags;
1717*4d9fdb46SRobert Mustacchi     Dwarf_Small *endsection = 0;
1718*4d9fdb46SRobert Mustacchi     int res = 0;
1719*4d9fdb46SRobert Mustacchi     Bytef *dest = 0;
1720*4d9fdb46SRobert Mustacchi     uLongf destlen = 0;
1721*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned uncompressed_len = 0;
1722*4d9fdb46SRobert Mustacchi 
1723*4d9fdb46SRobert Mustacchi     endsection = basesrc + srclen;
1724*4d9fdb46SRobert Mustacchi     if ((src + 12) >endsection) {
1725*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_SECTION_SHORT, DW_DLV_ERROR);
1726*4d9fdb46SRobert Mustacchi     }
1727*4d9fdb46SRobert Mustacchi     section->dss_compressed_length = section->dss_size;
1728*4d9fdb46SRobert Mustacchi     if(!strncmp("ZLIB",(const char *)src,4)) {
1729*4d9fdb46SRobert Mustacchi         unsigned i = 0;
1730*4d9fdb46SRobert Mustacchi         unsigned l = 8;
1731*4d9fdb46SRobert Mustacchi         unsigned char *c = src+4;
1732*4d9fdb46SRobert Mustacchi         for( ; i < l; ++i,c++) {
1733*4d9fdb46SRobert Mustacchi             uncompressed_len <<= 8;
1734*4d9fdb46SRobert Mustacchi             uncompressed_len += *c;
1735*4d9fdb46SRobert Mustacchi         }
1736*4d9fdb46SRobert Mustacchi         src = src + 12;
1737*4d9fdb46SRobert Mustacchi         srclen -= 12;
1738*4d9fdb46SRobert Mustacchi         section->dss_uncompressed_length = uncompressed_len;
1739*4d9fdb46SRobert Mustacchi         section->dss_ZLIB_compressed = TRUE;
1740*4d9fdb46SRobert Mustacchi     } else  if (flags & SHF_COMPRESSED) {
1741*4d9fdb46SRobert Mustacchi         /*  The prefix is a struct:
1742*4d9fdb46SRobert Mustacchi             unsigned int type; followed by pad if following are 64bit!
1743*4d9fdb46SRobert Mustacchi             size-of-target-address size
1744*4d9fdb46SRobert Mustacchi             size-of-target-address
1745*4d9fdb46SRobert Mustacchi         */
1746*4d9fdb46SRobert Mustacchi         Dwarf_Small *ptr    = (Dwarf_Small *)src;
1747*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned type = 0;
1748*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned size = 0;
1749*4d9fdb46SRobert Mustacchi         /* Dwarf_Unsigned addralign = 0; */
1750*4d9fdb46SRobert Mustacchi         unsigned fldsize    = dbg->de_pointer_size;
1751*4d9fdb46SRobert Mustacchi         unsigned structsize = 3* fldsize;
1752*4d9fdb46SRobert Mustacchi 
1753*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,type,Dwarf_Unsigned,ptr,
1754*4d9fdb46SRobert Mustacchi             DWARF_32BIT_SIZE,
1755*4d9fdb46SRobert Mustacchi             error,endsection);
1756*4d9fdb46SRobert Mustacchi         ptr += fldsize;
1757*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg,size,Dwarf_Unsigned,ptr,fldsize,
1758*4d9fdb46SRobert Mustacchi             error,endsection);
1759*4d9fdb46SRobert Mustacchi         if (type != ELFCOMPRESS_ZLIB) {
1760*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, DW_DLE_ZDEBUG_INPUT_FORMAT_ODD,
1761*4d9fdb46SRobert Mustacchi                 DW_DLV_ERROR);
1762*4d9fdb46SRobert Mustacchi         }
1763*4d9fdb46SRobert Mustacchi         uncompressed_len = size;
1764*4d9fdb46SRobert Mustacchi         section->dss_uncompressed_length = uncompressed_len;
1765*4d9fdb46SRobert Mustacchi         src    += structsize;
1766*4d9fdb46SRobert Mustacchi         srclen -= structsize;
1767*4d9fdb46SRobert Mustacchi         section->dss_shf_compressed = TRUE;
1768*4d9fdb46SRobert Mustacchi     } else {
1769*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ZDEBUG_INPUT_FORMAT_ODD,
1770*4d9fdb46SRobert Mustacchi             DW_DLV_ERROR);
1771*4d9fdb46SRobert Mustacchi     }
1772*4d9fdb46SRobert Mustacchi     {
1773*4d9fdb46SRobert Mustacchi         /*  According to zlib.net zlib essentially never expands
1774*4d9fdb46SRobert Mustacchi             the data when compressing.  There is no statement
1775*4d9fdb46SRobert Mustacchi             about  any effective limit in the compression factor
1776*4d9fdb46SRobert Mustacchi             though we, here, assume  such a limit to check
1777*4d9fdb46SRobert Mustacchi             for sanity in the object file.
1778*4d9fdb46SRobert Mustacchi             These tests are heuristics.  */
1779*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned max_inflated_len = srclen*ALLOWED_ZLIB_INFLATION;
1780*4d9fdb46SRobert Mustacchi 
1781*4d9fdb46SRobert Mustacchi         if (srclen > 50)  {
1782*4d9fdb46SRobert Mustacchi             /*  If srclen not super tiny lets check the following. */
1783*4d9fdb46SRobert Mustacchi             if (uncompressed_len < (srclen/2)) {
1784*4d9fdb46SRobert Mustacchi                 /*  Violates the approximate invariant about
1785*4d9fdb46SRobert Mustacchi                     compression not actually inflating. */
1786*4d9fdb46SRobert Mustacchi                 DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_UNCOMPRESS_ERROR,
1787*4d9fdb46SRobert Mustacchi                     DW_DLV_ERROR);
1788*4d9fdb46SRobert Mustacchi             }
1789*4d9fdb46SRobert Mustacchi         }
1790*4d9fdb46SRobert Mustacchi         if (max_inflated_len < srclen) {
1791*4d9fdb46SRobert Mustacchi             /* The calculation overflowed. */
1792*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_UNCOMPRESS_ERROR, DW_DLV_ERROR);
1793*4d9fdb46SRobert Mustacchi         }
1794*4d9fdb46SRobert Mustacchi         if (uncompressed_len > max_inflated_len) {
1795*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_UNCOMPRESS_ERROR, DW_DLV_ERROR);
1796*4d9fdb46SRobert Mustacchi         }
1797*4d9fdb46SRobert Mustacchi     }
1798*4d9fdb46SRobert Mustacchi     if( (src +srclen) > endsection) {
1799*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_SECTION_SHORT, DW_DLV_ERROR);
1800*4d9fdb46SRobert Mustacchi     }
1801*4d9fdb46SRobert Mustacchi     destlen = uncompressed_len;
1802*4d9fdb46SRobert Mustacchi     dest = malloc(destlen);
1803*4d9fdb46SRobert Mustacchi     if(!dest) {
1804*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_ERROR);
1805*4d9fdb46SRobert Mustacchi     }
1806*4d9fdb46SRobert Mustacchi     res = uncompress(dest,&destlen,src,srclen);
1807*4d9fdb46SRobert Mustacchi     if (res == Z_BUF_ERROR) {
1808*4d9fdb46SRobert Mustacchi         free(dest);
1809*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_BUF_ERROR, DW_DLV_ERROR);
1810*4d9fdb46SRobert Mustacchi     } else if (res == Z_MEM_ERROR) {
1811*4d9fdb46SRobert Mustacchi         free(dest);
1812*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_ERROR);
1813*4d9fdb46SRobert Mustacchi     } else if (res != Z_OK) {
1814*4d9fdb46SRobert Mustacchi         free(dest);
1815*4d9fdb46SRobert Mustacchi         /* Probably Z_DATA_ERROR. */
1816*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, DW_DLE_ZLIB_DATA_ERROR, DW_DLV_ERROR);
1817*4d9fdb46SRobert Mustacchi     }
1818*4d9fdb46SRobert Mustacchi     /* Z_OK */
1819*4d9fdb46SRobert Mustacchi     section->dss_data = dest;
1820*4d9fdb46SRobert Mustacchi     section->dss_size = destlen;
1821*4d9fdb46SRobert Mustacchi     section->dss_data_was_malloc = TRUE;
1822*4d9fdb46SRobert Mustacchi     section->dss_did_decompress = TRUE;
1823*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1824*4d9fdb46SRobert Mustacchi }
1825*4d9fdb46SRobert Mustacchi #endif /* HAVE_ZLIB */
1826*4d9fdb46SRobert Mustacchi 
1827*4d9fdb46SRobert Mustacchi 
1828*4d9fdb46SRobert Mustacchi /*  Load the ELF section with the specified index and set its
1829*4d9fdb46SRobert Mustacchi     dss_data pointer to the memory where it was loaded.  */
1830bc1f688bSRobert Mustacchi int
_dwarf_load_section(Dwarf_Debug dbg,struct Dwarf_Section_s * section,Dwarf_Error * error)1831bc1f688bSRobert Mustacchi _dwarf_load_section(Dwarf_Debug dbg,
1832bc1f688bSRobert Mustacchi     struct Dwarf_Section_s *section,
1833bc1f688bSRobert Mustacchi     Dwarf_Error * error)
1834bc1f688bSRobert Mustacchi {
1835bc1f688bSRobert Mustacchi     int res  = DW_DLV_ERROR;
1836bc1f688bSRobert Mustacchi     int err = 0;
1837bc1f688bSRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s *o = 0;
1838bc1f688bSRobert Mustacchi 
1839bc1f688bSRobert Mustacchi     /* check to see if the section is already loaded */
1840bc1f688bSRobert Mustacchi     if (section->dss_data !=  NULL) {
1841bc1f688bSRobert Mustacchi         return DW_DLV_OK;
1842bc1f688bSRobert Mustacchi     }
1843bc1f688bSRobert Mustacchi     o = dbg->de_obj_file;
1844*4d9fdb46SRobert Mustacchi     /*  There is an elf convention that section index 0
1845*4d9fdb46SRobert Mustacchi         is reserved, and that section is always empty.
1846*4d9fdb46SRobert Mustacchi         Non-elf object formats must honor
1847*4d9fdb46SRobert Mustacchi         that by ensuring that (when they
1848*4d9fdb46SRobert Mustacchi         assign numbers to 'sections' or
1849*4d9fdb46SRobert Mustacchi         'section-like-things') they never
1850*4d9fdb46SRobert Mustacchi         assign a real section section-number
1851*4d9fdb46SRobert Mustacchi         0 to dss_index.
1852*4d9fdb46SRobert Mustacchi 
1853*4d9fdb46SRobert Mustacchi         There is also a convention for 'bss' that that section
1854*4d9fdb46SRobert Mustacchi         and its like sections have no data but do have a size.
1855*4d9fdb46SRobert Mustacchi         That is never true of DWARF sections */
1856bc1f688bSRobert Mustacchi     res = o->methods->load_section(
1857bc1f688bSRobert Mustacchi         o->object, section->dss_index,
1858bc1f688bSRobert Mustacchi         &section->dss_data, &err);
1859bc1f688bSRobert Mustacchi     if (res == DW_DLV_ERROR) {
1860bc1f688bSRobert Mustacchi         DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
1861bc1f688bSRobert Mustacchi     }
1862*4d9fdb46SRobert Mustacchi     /*  For PE and mach-o all section data was always
1863*4d9fdb46SRobert Mustacchi         malloc'd. We do not need to set dss_data_was_malloc
1864*4d9fdb46SRobert Mustacchi         though as the o->object data will eventually free
1865*4d9fdb46SRobert Mustacchi         the original section data.
1866*4d9fdb46SRobert Mustacchi         The first character of any o->object struct gives the type. */
1867*4d9fdb46SRobert Mustacchi 
1868*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_NO_ENTRY) {
1869*4d9fdb46SRobert Mustacchi         /*  Gets this for section->dss_index 0.
1870*4d9fdb46SRobert Mustacchi             Which by ELF definition is a section index
1871*4d9fdb46SRobert Mustacchi             which is not used (reserved by Elf to
1872*4d9fdb46SRobert Mustacchi             mean no-section-index).
1873*4d9fdb46SRobert Mustacchi             Otherwise NULL dss_data gets error.
1874*4d9fdb46SRobert Mustacchi             BSS would legitimately have no data, but
1875*4d9fdb46SRobert Mustacchi             no DWARF related section could possbly be bss. */
1876*4d9fdb46SRobert Mustacchi         return res;
1877*4d9fdb46SRobert Mustacchi     }
1878*4d9fdb46SRobert Mustacchi     if (section->dss_ignore_reloc_group_sec) {
1879*4d9fdb46SRobert Mustacchi         /* Neither zdebug nor reloc apply to .group sections. */
1880*4d9fdb46SRobert Mustacchi         return res;
1881*4d9fdb46SRobert Mustacchi     }
1882*4d9fdb46SRobert Mustacchi     if ((section->dss_zdebug_requires_decompress ||
1883*4d9fdb46SRobert Mustacchi         section->dss_shf_compressed ||
1884*4d9fdb46SRobert Mustacchi         section->dss_ZLIB_compressed) &&
1885*4d9fdb46SRobert Mustacchi         !section->dss_did_decompress) {
1886*4d9fdb46SRobert Mustacchi         if (!section->dss_data) {
1887*4d9fdb46SRobert Mustacchi             /*  Impossible. This makes no sense.
1888*4d9fdb46SRobert Mustacchi                 Corrupt object. */
1889*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, DW_DLE_COMPRESSED_EMPTY_SECTION, DW_DLV_ERROR);
1890*4d9fdb46SRobert Mustacchi         }
1891*4d9fdb46SRobert Mustacchi #ifdef HAVE_ZLIB
1892*4d9fdb46SRobert Mustacchi         res = do_decompress_zlib(dbg,section,error);
1893*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1894*4d9fdb46SRobert Mustacchi             return res;
1895*4d9fdb46SRobert Mustacchi         }
1896*4d9fdb46SRobert Mustacchi         section->dss_did_decompress = TRUE;
1897*4d9fdb46SRobert Mustacchi #else
1898*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg,DW_DLE_ZDEBUG_REQUIRES_ZLIB, DW_DLV_ERROR);
1899*4d9fdb46SRobert Mustacchi #endif
1900*4d9fdb46SRobert Mustacchi     }
1901bc1f688bSRobert Mustacchi     if (_dwarf_apply_relocs == 0) {
1902bc1f688bSRobert Mustacchi         return res;
1903bc1f688bSRobert Mustacchi     }
1904bc1f688bSRobert Mustacchi     if (section->dss_reloc_size == 0) {
1905bc1f688bSRobert Mustacchi         return res;
1906bc1f688bSRobert Mustacchi     }
1907bc1f688bSRobert Mustacchi     if (!o->methods->relocate_a_section) {
1908bc1f688bSRobert Mustacchi         return res;
1909bc1f688bSRobert Mustacchi     }
1910bc1f688bSRobert Mustacchi     /*apply relocations */
1911*4d9fdb46SRobert Mustacchi     res = o->methods->relocate_a_section( o->object,
1912*4d9fdb46SRobert Mustacchi         section->dss_index, dbg, &err);
1913bc1f688bSRobert Mustacchi     if (res == DW_DLV_ERROR) {
1914*4d9fdb46SRobert Mustacchi         DWARF_DBG_ERROR(dbg, err, res);
1915bc1f688bSRobert Mustacchi     }
1916bc1f688bSRobert Mustacchi     return res;
1917bc1f688bSRobert Mustacchi }
1918bc1f688bSRobert Mustacchi 
1919bc1f688bSRobert Mustacchi /* This is a hack so clients can verify offsets.
1920bc1f688bSRobert Mustacchi    Added April 2005 so that debugger can detect broken offsets
1921bc1f688bSRobert Mustacchi    (which happened in an IRIX  -64 executable larger than 2GB
1922bc1f688bSRobert Mustacchi     using MIPSpro 7.3.1.3 compilers. A couple .debug_pubnames
1923bc1f688bSRobert Mustacchi     offsets were wrong.).
1924bc1f688bSRobert Mustacchi */
1925bc1f688bSRobert 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)1926bc1f688bSRobert Mustacchi dwarf_get_section_max_offsets(Dwarf_Debug dbg,
1927bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_info_size,
1928bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_abbrev_size,
1929bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_line_size,
1930bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_loc_size,
1931bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_aranges_size,
1932bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_macinfo_size,
1933bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_pubnames_size,
1934bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_str_size,
1935bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_frame_size,
1936bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_ranges_size,
1937bc1f688bSRobert Mustacchi     Dwarf_Unsigned * debug_typenames_size)
1938bc1f688bSRobert Mustacchi {
1939bc1f688bSRobert Mustacchi     *debug_info_size = dbg->de_debug_info.dss_size;
1940bc1f688bSRobert Mustacchi     *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
1941bc1f688bSRobert Mustacchi     *debug_line_size = dbg->de_debug_line.dss_size;
1942bc1f688bSRobert Mustacchi     *debug_loc_size = dbg->de_debug_loc.dss_size;
1943bc1f688bSRobert Mustacchi     *debug_aranges_size = dbg->de_debug_aranges.dss_size;
1944bc1f688bSRobert Mustacchi     *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
1945bc1f688bSRobert Mustacchi     *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
1946bc1f688bSRobert Mustacchi     *debug_str_size = dbg->de_debug_str.dss_size;
1947bc1f688bSRobert Mustacchi     *debug_frame_size = dbg->de_debug_frame.dss_size;
1948bc1f688bSRobert Mustacchi     *debug_ranges_size = dbg->de_debug_ranges.dss_size;
1949bc1f688bSRobert Mustacchi     *debug_typenames_size = dbg->de_debug_typenames.dss_size;
1950bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1951bc1f688bSRobert Mustacchi }
1952*4d9fdb46SRobert Mustacchi /*  This adds the new types size (new section) to the output data.
1953*4d9fdb46SRobert Mustacchi     Oct 27, 2011. */
1954*4d9fdb46SRobert Mustacchi int
dwarf_get_section_max_offsets_b(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,Dwarf_Unsigned * debug_types_size)1955*4d9fdb46SRobert Mustacchi dwarf_get_section_max_offsets_b(Dwarf_Debug dbg,
1956*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_info_size,
1957*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_abbrev_size,
1958*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_line_size,
1959*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_loc_size,
1960*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_aranges_size,
1961*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_macinfo_size,
1962*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_pubnames_size,
1963*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_str_size,
1964*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_frame_size,
1965*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_ranges_size,
1966*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_typenames_size,
1967*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_types_size)
1968*4d9fdb46SRobert Mustacchi {
1969*4d9fdb46SRobert Mustacchi     *debug_info_size = dbg->de_debug_info.dss_size;
1970*4d9fdb46SRobert Mustacchi     *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
1971*4d9fdb46SRobert Mustacchi     *debug_line_size = dbg->de_debug_line.dss_size;
1972*4d9fdb46SRobert Mustacchi     *debug_loc_size = dbg->de_debug_loc.dss_size;
1973*4d9fdb46SRobert Mustacchi     *debug_aranges_size = dbg->de_debug_aranges.dss_size;
1974*4d9fdb46SRobert Mustacchi     *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
1975*4d9fdb46SRobert Mustacchi     *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
1976*4d9fdb46SRobert Mustacchi     *debug_str_size = dbg->de_debug_str.dss_size;
1977*4d9fdb46SRobert Mustacchi     *debug_frame_size = dbg->de_debug_frame.dss_size;
1978*4d9fdb46SRobert Mustacchi     *debug_ranges_size = dbg->de_debug_ranges.dss_size;
1979*4d9fdb46SRobert Mustacchi     *debug_typenames_size = dbg->de_debug_typenames.dss_size;
1980*4d9fdb46SRobert Mustacchi     *debug_types_size = dbg->de_debug_types.dss_size;
1981*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1982*4d9fdb46SRobert Mustacchi }
1983*4d9fdb46SRobert Mustacchi 
1984*4d9fdb46SRobert Mustacchi /*  Now with sections new to DWARF5 (unofficial list,preliminary) */
1985*4d9fdb46SRobert Mustacchi int
dwarf_get_section_max_offsets_c(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,Dwarf_Unsigned * debug_types_size,Dwarf_Unsigned * debug_macro_size,Dwarf_Unsigned * debug_str_offsets_size,Dwarf_Unsigned * debug_sup_size,Dwarf_Unsigned * debug_cu_index_size,Dwarf_Unsigned * debug_tu_index_size)1986*4d9fdb46SRobert Mustacchi dwarf_get_section_max_offsets_c(Dwarf_Debug dbg,
1987*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_info_size,
1988*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_abbrev_size,
1989*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_line_size,
1990*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_loc_size,
1991*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_aranges_size,
1992*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_macinfo_size,
1993*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_pubnames_size,
1994*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_str_size,
1995*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_frame_size,
1996*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_ranges_size,
1997*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_typenames_size,
1998*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_types_size,
1999*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_macro_size,
2000*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_str_offsets_size,
2001*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_sup_size,
2002*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_cu_index_size,
2003*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_tu_index_size)
2004*4d9fdb46SRobert Mustacchi {
2005*4d9fdb46SRobert Mustacchi     *debug_info_size = dbg->de_debug_info.dss_size;
2006*4d9fdb46SRobert Mustacchi     *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
2007*4d9fdb46SRobert Mustacchi     *debug_line_size = dbg->de_debug_line.dss_size;
2008*4d9fdb46SRobert Mustacchi     *debug_loc_size = dbg->de_debug_loc.dss_size;
2009*4d9fdb46SRobert Mustacchi     *debug_aranges_size = dbg->de_debug_aranges.dss_size;
2010*4d9fdb46SRobert Mustacchi     *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
2011*4d9fdb46SRobert Mustacchi     *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
2012*4d9fdb46SRobert Mustacchi     *debug_str_size = dbg->de_debug_str.dss_size;
2013*4d9fdb46SRobert Mustacchi     *debug_frame_size = dbg->de_debug_frame.dss_size;
2014*4d9fdb46SRobert Mustacchi     *debug_ranges_size = dbg->de_debug_ranges.dss_size;
2015*4d9fdb46SRobert Mustacchi     *debug_typenames_size = dbg->de_debug_typenames.dss_size;
2016*4d9fdb46SRobert Mustacchi     *debug_types_size = dbg->de_debug_types.dss_size;
2017*4d9fdb46SRobert Mustacchi     *debug_macro_size = dbg->de_debug_macro.dss_size;
2018*4d9fdb46SRobert Mustacchi     *debug_str_offsets_size = dbg->de_debug_str_offsets.dss_size;
2019*4d9fdb46SRobert Mustacchi     *debug_sup_size = dbg->de_debug_sup.dss_size;
2020*4d9fdb46SRobert Mustacchi     *debug_cu_index_size = dbg->de_debug_cu_index.dss_size;
2021*4d9fdb46SRobert Mustacchi     *debug_tu_index_size = dbg->de_debug_tu_index.dss_size;
2022*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
2023*4d9fdb46SRobert Mustacchi }
2024*4d9fdb46SRobert Mustacchi 
2025*4d9fdb46SRobert Mustacchi /*  Now with final sections new to DWARF5 (final) */
2026*4d9fdb46SRobert Mustacchi int
dwarf_get_section_max_offsets_d(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,Dwarf_Unsigned * debug_types_size,Dwarf_Unsigned * debug_macro_size,Dwarf_Unsigned * debug_str_offsets_size,Dwarf_Unsigned * debug_sup_size,Dwarf_Unsigned * debug_cu_index_size,Dwarf_Unsigned * debug_tu_index_size,Dwarf_Unsigned * debug_names_size,Dwarf_Unsigned * debug_loclists_size,Dwarf_Unsigned * debug_rnglists_size)2027*4d9fdb46SRobert Mustacchi dwarf_get_section_max_offsets_d(Dwarf_Debug dbg,
2028*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_info_size,
2029*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_abbrev_size,
2030*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_line_size,
2031*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_loc_size,
2032*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_aranges_size,
2033*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_macinfo_size,
2034*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_pubnames_size,
2035*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_str_size,
2036*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_frame_size,
2037*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_ranges_size,
2038*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_typenames_size,
2039*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_types_size,
2040*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_macro_size,
2041*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_str_offsets_size,
2042*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_sup_size,
2043*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_cu_index_size,
2044*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_tu_index_size,
2045*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_names_size,
2046*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_loclists_size,
2047*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * debug_rnglists_size)
2048*4d9fdb46SRobert Mustacchi {
2049*4d9fdb46SRobert Mustacchi     *debug_info_size = dbg->de_debug_info.dss_size;
2050*4d9fdb46SRobert Mustacchi     *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
2051*4d9fdb46SRobert Mustacchi     *debug_line_size = dbg->de_debug_line.dss_size;
2052*4d9fdb46SRobert Mustacchi     *debug_loc_size = dbg->de_debug_loc.dss_size;
2053*4d9fdb46SRobert Mustacchi     *debug_aranges_size = dbg->de_debug_aranges.dss_size;
2054*4d9fdb46SRobert Mustacchi     *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
2055*4d9fdb46SRobert Mustacchi     *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
2056*4d9fdb46SRobert Mustacchi     *debug_str_size = dbg->de_debug_str.dss_size;
2057*4d9fdb46SRobert Mustacchi     *debug_frame_size = dbg->de_debug_frame.dss_size;
2058*4d9fdb46SRobert Mustacchi     *debug_ranges_size = dbg->de_debug_ranges.dss_size;
2059*4d9fdb46SRobert Mustacchi     *debug_typenames_size = dbg->de_debug_typenames.dss_size;
2060*4d9fdb46SRobert Mustacchi     *debug_types_size = dbg->de_debug_types.dss_size;
2061*4d9fdb46SRobert Mustacchi     *debug_macro_size = dbg->de_debug_macro.dss_size;
2062*4d9fdb46SRobert Mustacchi     *debug_str_offsets_size = dbg->de_debug_str_offsets.dss_size;
2063*4d9fdb46SRobert Mustacchi     *debug_sup_size = dbg->de_debug_sup.dss_size;
2064*4d9fdb46SRobert Mustacchi     *debug_cu_index_size = dbg->de_debug_cu_index.dss_size;
2065*4d9fdb46SRobert Mustacchi     *debug_tu_index_size = dbg->de_debug_tu_index.dss_size;
2066*4d9fdb46SRobert Mustacchi     *debug_names_size = dbg->de_debug_names.dss_size;
2067*4d9fdb46SRobert Mustacchi     *debug_loclists_size = dbg->de_debug_loclists.dss_size;
2068*4d9fdb46SRobert Mustacchi     *debug_rnglists_size = dbg->de_debug_rnglists.dss_size;
2069*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
2070*4d9fdb46SRobert Mustacchi }
2071*4d9fdb46SRobert Mustacchi 
2072*4d9fdb46SRobert Mustacchi /*  Given a section name, get its size and address */
2073*4d9fdb46SRobert Mustacchi int
dwarf_get_section_info_by_name(Dwarf_Debug dbg,const char * section_name,Dwarf_Addr * section_addr,Dwarf_Unsigned * section_size,Dwarf_Error * error)2074*4d9fdb46SRobert Mustacchi dwarf_get_section_info_by_name(Dwarf_Debug dbg,
2075*4d9fdb46SRobert Mustacchi     const char *section_name,
2076*4d9fdb46SRobert Mustacchi     Dwarf_Addr *section_addr,
2077*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *section_size,
2078*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
2079*4d9fdb46SRobert Mustacchi {
2080*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Section_s doas;
2081*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s * obj = 0;
2082*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned section_count = 0;
2083*4d9fdb46SRobert Mustacchi     Dwarf_Half section_index = 0;
2084*4d9fdb46SRobert Mustacchi 
2085*4d9fdb46SRobert Mustacchi     *section_addr = 0;
2086*4d9fdb46SRobert Mustacchi     *section_size = 0;
2087*4d9fdb46SRobert Mustacchi 
2088*4d9fdb46SRobert Mustacchi     obj = dbg->de_obj_file;
2089*4d9fdb46SRobert Mustacchi     if (NULL == obj) {
2090*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
2091*4d9fdb46SRobert Mustacchi     }
2092*4d9fdb46SRobert Mustacchi 
2093*4d9fdb46SRobert Mustacchi     section_count = obj->methods->get_section_count(obj->object);
2094*4d9fdb46SRobert Mustacchi 
2095*4d9fdb46SRobert Mustacchi     /*  We can skip index 0 when considering ELF files, but not other
2096*4d9fdb46SRobert Mustacchi         object types. */
2097*4d9fdb46SRobert Mustacchi     for (section_index = 0; section_index < section_count;
2098*4d9fdb46SRobert Mustacchi         ++section_index) {
2099*4d9fdb46SRobert Mustacchi         int err = 0;
2100*4d9fdb46SRobert Mustacchi         int res = obj->methods->get_section_info(obj->object,
2101*4d9fdb46SRobert Mustacchi             section_index, &doas, &err);
2102*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_ERROR) {
2103*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
2104*4d9fdb46SRobert Mustacchi         }
2105*4d9fdb46SRobert Mustacchi 
2106*4d9fdb46SRobert Mustacchi         if (!strcmp(section_name,doas.name)) {
2107*4d9fdb46SRobert Mustacchi             *section_addr = doas.addr;
2108*4d9fdb46SRobert Mustacchi             *section_size = doas.size;
2109*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
2110*4d9fdb46SRobert Mustacchi         }
2111*4d9fdb46SRobert Mustacchi     }
2112*4d9fdb46SRobert Mustacchi 
2113*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
2114*4d9fdb46SRobert Mustacchi }
2115*4d9fdb46SRobert Mustacchi 
2116*4d9fdb46SRobert Mustacchi /*  Given a section index, get its size and address */
2117*4d9fdb46SRobert Mustacchi int
dwarf_get_section_info_by_index(Dwarf_Debug dbg,int section_index,const char ** section_name,Dwarf_Addr * section_addr,Dwarf_Unsigned * section_size,Dwarf_Error * error)2118*4d9fdb46SRobert Mustacchi dwarf_get_section_info_by_index(Dwarf_Debug dbg,
2119*4d9fdb46SRobert Mustacchi     int section_index,
2120*4d9fdb46SRobert Mustacchi     const char **section_name,
2121*4d9fdb46SRobert Mustacchi     Dwarf_Addr *section_addr,
2122*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *section_size,
2123*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
2124*4d9fdb46SRobert Mustacchi {
2125*4d9fdb46SRobert Mustacchi     *section_addr = 0;
2126*4d9fdb46SRobert Mustacchi     *section_size = 0;
2127*4d9fdb46SRobert Mustacchi     *section_name = NULL;
2128*4d9fdb46SRobert Mustacchi 
2129*4d9fdb46SRobert Mustacchi     /* Check if we have a valid section index */
2130*4d9fdb46SRobert Mustacchi     if (section_index >= 0 && section_index < dwarf_get_section_count(dbg)) {
2131*4d9fdb46SRobert Mustacchi         int res = 0;
2132*4d9fdb46SRobert Mustacchi         int err = 0;
2133*4d9fdb46SRobert Mustacchi         struct Dwarf_Obj_Access_Section_s doas;
2134*4d9fdb46SRobert Mustacchi         struct Dwarf_Obj_Access_Interface_s * obj = dbg->de_obj_file;
2135*4d9fdb46SRobert Mustacchi         if (NULL == obj) {
2136*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
2137*4d9fdb46SRobert Mustacchi         }
2138*4d9fdb46SRobert Mustacchi         res = obj->methods->get_section_info(obj->object,
2139*4d9fdb46SRobert Mustacchi             section_index, &doas, &err);
2140*4d9fdb46SRobert Mustacchi         if (res == DW_DLV_ERROR){
2141*4d9fdb46SRobert Mustacchi             DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
2142*4d9fdb46SRobert Mustacchi         }
2143*4d9fdb46SRobert Mustacchi 
2144*4d9fdb46SRobert Mustacchi         *section_addr = doas.addr;
2145*4d9fdb46SRobert Mustacchi         *section_size = doas.size;
2146*4d9fdb46SRobert Mustacchi         *section_name = doas.name;
2147*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
2148*4d9fdb46SRobert Mustacchi     }
2149*4d9fdb46SRobert Mustacchi     return DW_DLV_NO_ENTRY;
2150*4d9fdb46SRobert Mustacchi }
2151*4d9fdb46SRobert Mustacchi 
2152*4d9fdb46SRobert Mustacchi /*  Get section count */
2153*4d9fdb46SRobert Mustacchi int
dwarf_get_section_count(Dwarf_Debug dbg)2154*4d9fdb46SRobert Mustacchi dwarf_get_section_count(Dwarf_Debug dbg)
2155*4d9fdb46SRobert Mustacchi {
2156*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s * obj = dbg->de_obj_file;
2157*4d9fdb46SRobert Mustacchi     if (NULL == obj) {
2158*4d9fdb46SRobert Mustacchi         /*  -1  */
2159*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
2160*4d9fdb46SRobert Mustacchi     }
2161*4d9fdb46SRobert Mustacchi     return obj->methods->get_section_count(obj->object);
2162*4d9fdb46SRobert Mustacchi }
2163*4d9fdb46SRobert Mustacchi 
2164*4d9fdb46SRobert Mustacchi Dwarf_Cmdline_Options dwarf_cmdline_options = {
2165*4d9fdb46SRobert Mustacchi     FALSE /* Use quiet mode by default. */
2166*4d9fdb46SRobert Mustacchi };
2167*4d9fdb46SRobert Mustacchi 
2168*4d9fdb46SRobert Mustacchi /* Lets libdwarf reflect a command line option, so we can get details
2169*4d9fdb46SRobert Mustacchi    of some errors printed using libdwarf-internal information. */
2170*4d9fdb46SRobert Mustacchi void
dwarf_record_cmdline_options(Dwarf_Cmdline_Options options)2171*4d9fdb46SRobert Mustacchi dwarf_record_cmdline_options(Dwarf_Cmdline_Options options)
2172*4d9fdb46SRobert Mustacchi {
2173*4d9fdb46SRobert Mustacchi     dwarf_cmdline_options = options;
2174*4d9fdb46SRobert Mustacchi }
2175