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 §ion->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