149d3bc91SRichard Lowe /* 207dc1947SRichard Lowe Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. 3*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2007-2019 David Anderson. All Rights Reserved. 407dc1947SRichard Lowe Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved. 549d3bc91SRichard Lowe 6*4d9fdb46SRobert Mustacchi This program is free software; you can redistribute it 7*4d9fdb46SRobert Mustacchi and/or modify it under the terms of version 2.1 of the 8*4d9fdb46SRobert Mustacchi GNU Lesser General Public License as published by the Free 9*4d9fdb46SRobert Mustacchi Software Foundation. 10*4d9fdb46SRobert Mustacchi 11*4d9fdb46SRobert Mustacchi This program is distributed in the hope that it would be 12*4d9fdb46SRobert Mustacchi useful, but WITHOUT ANY WARRANTY; without even the implied 13*4d9fdb46SRobert Mustacchi warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 14*4d9fdb46SRobert Mustacchi PURPOSE. 15*4d9fdb46SRobert Mustacchi 16*4d9fdb46SRobert Mustacchi Further, this software is distributed without any warranty 17*4d9fdb46SRobert Mustacchi that it is free of the rightful claim of any third person 18*4d9fdb46SRobert Mustacchi regarding infringement or the like. Any license provided 19*4d9fdb46SRobert Mustacchi herein, whether implied or otherwise, applies only to this 20*4d9fdb46SRobert Mustacchi software file. Patent licenses, if any, provided herein 21*4d9fdb46SRobert Mustacchi do not apply to combinations of this program with other 22*4d9fdb46SRobert Mustacchi software, or any other product whatsoever. 23*4d9fdb46SRobert Mustacchi 24*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General 25*4d9fdb46SRobert Mustacchi Public License along with this program; if not, write the 26*4d9fdb46SRobert Mustacchi Free Software Foundation, Inc., 51 Franklin Street - Fifth 27*4d9fdb46SRobert Mustacchi Floor, Boston MA 02110-1301, USA. 2849d3bc91SRichard Lowe 2949d3bc91SRichard Lowe */ 30*4d9fdb46SRobert Mustacchi /* Following the nomenclature of the DWARF standard 31*4d9fdb46SRobert Mustacchi Section Version Numbers (DWARF 5): 32*4d9fdb46SRobert Mustacchi * means not applicable. 33*4d9fdb46SRobert Mustacchi - means not defined in that version. 34*4d9fdb46SRobert Mustacchi The version numbers for .debug_info is the same as .debug_info.dwo 35*4d9fdb46SRobert Mustacchi (etc for the other dwo sections). 36*4d9fdb46SRobert Mustacchi The versions applicable by section are: 37*4d9fdb46SRobert Mustacchi . DWARF2 DWARF3 DWARF4 DWARF5 38*4d9fdb46SRobert Mustacchi .debug_abbrev * * * * 39*4d9fdb46SRobert Mustacchi .debug_addr - - - 5 40*4d9fdb46SRobert Mustacchi .debug_aranges 2 2 2 2 41*4d9fdb46SRobert Mustacchi .debug_frame 1 3 4 4 42*4d9fdb46SRobert Mustacchi .debug_info 2 3 4 5 43*4d9fdb46SRobert Mustacchi .debug_line 2 3 4 5 44*4d9fdb46SRobert Mustacchi .debug_line_str - - - 5 45*4d9fdb46SRobert Mustacchi .debug_loc * * * - 46*4d9fdb46SRobert Mustacchi .debug_loclists - - - 5 47*4d9fdb46SRobert Mustacchi .debug_macinfo * * * - 48*4d9fdb46SRobert Mustacchi .debug_macro - - - 5 49*4d9fdb46SRobert Mustacchi .debug_names - - - 5 50*4d9fdb46SRobert Mustacchi .debug_pubnames 2 2 2 - 51*4d9fdb46SRobert Mustacchi .debug_pubtypes - 2 2 - 52*4d9fdb46SRobert Mustacchi .debug_ranges - * * - 53*4d9fdb46SRobert Mustacchi .debug_rnglists - - - 5 54*4d9fdb46SRobert Mustacchi .debug_str * * * * 55*4d9fdb46SRobert Mustacchi .debug_str_offsets - - - 5 56*4d9fdb46SRobert Mustacchi .debug_sup - - - 5 57*4d9fdb46SRobert Mustacchi .debug_types - - 4 - 58*4d9fdb46SRobert Mustacchi 59*4d9fdb46SRobert Mustacchi .debug_abbrev.dwo - - - * 60*4d9fdb46SRobert Mustacchi .debug_info.dwo - - - 5 61*4d9fdb46SRobert Mustacchi .debug_line.dwo - - - 5 62*4d9fdb46SRobert Mustacchi .debug_loc.dwo - - - - 63*4d9fdb46SRobert Mustacchi .debug_loclists.dwo - - - 5 64*4d9fdb46SRobert Mustacchi .debug_macro.dwo - - - 5 65*4d9fdb46SRobert Mustacchi .debug_rnglists.dwo - - - 5 66*4d9fdb46SRobert Mustacchi .debug_str.dwo - - - * 67*4d9fdb46SRobert Mustacchi .debug_str_offsets.dwo - - - 5 68*4d9fdb46SRobert Mustacchi 69*4d9fdb46SRobert Mustacchi .debug_cu_index - - - 5 70*4d9fdb46SRobert Mustacchi .debug_tu_index - - - 5 7149d3bc91SRichard Lowe 72*4d9fdb46SRobert Mustacchi */ 7349d3bc91SRichard Lowe 74*4d9fdb46SRobert Mustacchi struct Dwarf_Rnglists_Context_s; 75*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Rnglists_Context_s *Dwarf_Rnglists_Context; 76*4d9fdb46SRobert Mustacchi struct Dwarf_Loclists_Context_s; 77*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Loclists_Context_s *Dwarf_Loclists_Context; 7849d3bc91SRichard Lowe 7949d3bc91SRichard Lowe struct Dwarf_Die_s { 80*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr di_debug_ptr; 8149d3bc91SRichard Lowe Dwarf_Abbrev_List di_abbrev_list; 8249d3bc91SRichard Lowe Dwarf_CU_Context di_cu_context; 8307dc1947SRichard Lowe int di_abbrev_code; 84*4d9fdb46SRobert Mustacchi 85*4d9fdb46SRobert Mustacchi /* TRUE if part of debug_info. FALSE if part of .debug_types. */ 86*4d9fdb46SRobert Mustacchi Dwarf_Bool di_is_info; 8749d3bc91SRichard Lowe }; 8849d3bc91SRichard Lowe 8949d3bc91SRichard Lowe struct Dwarf_Attribute_s { 90*4d9fdb46SRobert Mustacchi Dwarf_Half ar_attribute; /* Attribute Value. */ 91*4d9fdb46SRobert Mustacchi Dwarf_Half ar_attribute_form; /* Attribute Form. */ 9249d3bc91SRichard Lowe Dwarf_Half ar_attribute_form_direct; 93*4d9fdb46SRobert Mustacchi /* Identical to ar_attribute_form except that if 94*4d9fdb46SRobert Mustacchi the original form uleb was DW_FORM_indirect, 95*4d9fdb46SRobert Mustacchi ar_attribute_form_direct contains DW_FORM_indirect 96*4d9fdb46SRobert Mustacchi but ar_attribute_form contains the true form. */ 9749d3bc91SRichard Lowe Dwarf_CU_Context ar_cu_context; 98*4d9fdb46SRobert Mustacchi /* The following points to either debug_info or debug_types 99*4d9fdb46SRobert Mustacchi depending on if context is cc_is_info or not. */ 100*4d9fdb46SRobert Mustacchi Dwarf_Small *ar_debug_ptr; 101*4d9fdb46SRobert Mustacchi /* If DW_FORM_implicit const, the value is here, not 102*4d9fdb46SRobert Mustacchi in the DIE. */ 103*4d9fdb46SRobert Mustacchi Dwarf_Signed ar_implicit_const; 104*4d9fdb46SRobert Mustacchi Dwarf_Debug ar_dbg; /* dbg owning the attr */ 105*4d9fdb46SRobert Mustacchi 106*4d9fdb46SRobert Mustacchi Dwarf_Die ar_die;/* Access to the DIE owning the attribute */ 10749d3bc91SRichard Lowe Dwarf_Attribute ar_next; 10849d3bc91SRichard Lowe }; 10949d3bc91SRichard Lowe 110*4d9fdb46SRobert Mustacchi 11149d3bc91SRichard Lowe /* 112*4d9fdb46SRobert Mustacchi This structure provides the context for a compilation unit. 11349d3bc91SRichard Lowe Thus, it contains the Dwarf_Debug, cc_dbg, that this cu 114*4d9fdb46SRobert Mustacchi belongs to. It contains the information in the compilation 11549d3bc91SRichard Lowe unit header, cc_length, cc_version_stamp, cc_abbrev_offset, 116*4d9fdb46SRobert Mustacchi and cc_address_size, in the .debug_info section for that cu. 117*4d9fdb46SRobert Mustacchi In addition, it contains the count, cc_count_cu, of the cu 118*4d9fdb46SRobert Mustacchi number of that cu in the list of cu's in the .debug_info. 119*4d9fdb46SRobert Mustacchi The count starts at 1, ie cc_count_cu is 1 for the first cu, 120*4d9fdb46SRobert Mustacchi 2 for the second and so on. This struct also contains a 121*4d9fdb46SRobert Mustacchi pointer, cc_abbrev_table, to a list of pairs of abbrev code 122*4d9fdb46SRobert Mustacchi and a pointer to the start of that abbrev 12349d3bc91SRichard Lowe in the .debug_abbrev section. 12449d3bc91SRichard Lowe 125*4d9fdb46SRobert Mustacchi Each die will also contain a pointer to such a struct to 126*4d9fdb46SRobert Mustacchi record the context for that die. 12707dc1947SRichard Lowe 128*4d9fdb46SRobert Mustacchi Notice that a pointer to the CU DIE itself is 12907dc1947SRichard Lowe Dwarf_Off off2 = cu_context->cc_debug_info_offset; 13007dc1947SRichard Lowe cu_die_info_ptr = dbg->de_debug_info.dss_data + 131*4d9fdb46SRobert Mustacchi off2 + _dwarf_length_of_cu_header(dbg, off2); 132*4d9fdb46SRobert Mustacchi Or similar for de_debug_types. 133*4d9fdb46SRobert Mustacchi 13449d3bc91SRichard Lowe **Updated by dwarf_next_cu_header in dwarf_die_deliv.c 13549d3bc91SRichard Lowe */ 13649d3bc91SRichard Lowe struct Dwarf_CU_Context_s { 13749d3bc91SRichard Lowe Dwarf_Debug cc_dbg; 138*4d9fdb46SRobert Mustacchi /* The sum of cc_length, cc_length_size, and cc_extension_size 139*4d9fdb46SRobert Mustacchi is the total length of the CU including its header. 140*4d9fdb46SRobert Mustacchi 141*4d9fdb46SRobert Mustacchi cc_length is the length of the compilation unit excluding 142*4d9fdb46SRobert Mustacchi cc_length_size and cc_extension_size. */ 143*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_length; 144*4d9fdb46SRobert Mustacchi 145*4d9fdb46SRobert Mustacchi /* cc_length_size is the size in bytes of an offset. 146*4d9fdb46SRobert Mustacchi Should probably be renamed cc_offset_size. 147*4d9fdb46SRobert Mustacchi 4 for 32bit dwarf, 8 for 64bit dwarf (whether MIPS/IRIX 148*4d9fdb46SRobert Mustacchi 64bit dwarf or standard 64bit dwarf using the extension 149*4d9fdb46SRobert Mustacchi mechanism). */ 15049d3bc91SRichard Lowe Dwarf_Small cc_length_size; 151*4d9fdb46SRobert Mustacchi 152*4d9fdb46SRobert Mustacchi /* cc_extension_size is zero unless this is standard 153*4d9fdb46SRobert Mustacchi DWARF3 and later 64bit dwarf using the extension mechanism. 154*4d9fdb46SRobert Mustacchi 64bit DWARF3 and later: cc_extension_size is 4. 155*4d9fdb46SRobert Mustacchi 64bit DWARF2 MIPS/IRIX: cc_extension_size is zero. 156*4d9fdb46SRobert Mustacchi 32bit DWARF: cc_extension_size is zero. */ 15749d3bc91SRichard Lowe Dwarf_Small cc_extension_size; 158*4d9fdb46SRobert Mustacchi 159*4d9fdb46SRobert Mustacchi /* cc_version_stamp is the DWARF version number applicable 160*4d9fdb46SRobert Mustacchi to the DWARF in this compilation unit. 2,3,4,... */ 16149d3bc91SRichard Lowe Dwarf_Half cc_version_stamp; 162*4d9fdb46SRobert Mustacchi /* cc_abbrev_offset is the section-global offset 163*4d9fdb46SRobert Mustacchi of the .debug_abbrev section this CU uses. 164*4d9fdb46SRobert Mustacchi Data from CU header. Includes DWP adjustment made 165*4d9fdb46SRobert Mustacchi as soon as we create a cu_context. */ 166*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_abbrev_offset; 167*4d9fdb46SRobert Mustacchi 168*4d9fdb46SRobert Mustacchi /* cc_address_size is the size of an address in this 169*4d9fdb46SRobert Mustacchi compilation unit. */ 17049d3bc91SRichard Lowe Dwarf_Small cc_address_size; 171*4d9fdb46SRobert Mustacchi Dwarf_Small cc_segment_selector_size; 172*4d9fdb46SRobert Mustacchi 173*4d9fdb46SRobert Mustacchi /* cc_debug_offset is the global offset in the section 174*4d9fdb46SRobert Mustacchi of the CU header of this CU. 175*4d9fdb46SRobert Mustacchi That is, it is a section global offset. 176*4d9fdb46SRobert Mustacchi May be debug_info or debug_types 177*4d9fdb46SRobert Mustacchi but those are distinct. 178*4d9fdb46SRobert Mustacchi Even in DWP this is set to true global offset 179*4d9fdb46SRobert Mustacchi right away when cu_context created. 180*4d9fdb46SRobert Mustacchi See cc_is_info flag. */ 181*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_debug_offset; 182*4d9fdb46SRobert Mustacchi 183*4d9fdb46SRobert Mustacchi /* === START DEBUG FISSION (Split Dwarf) data 184*4d9fdb46SRobert Mustacchi cc_signature is in the TU header 185*4d9fdb46SRobert Mustacchi of a type unit of a TU DIE (or for DW5 in the 186*4d9fdb46SRobert Mustacchi skeleton or split_compile header is a dwo_id). 187*4d9fdb46SRobert Mustacchi Ignore this field if cc_signature_present is zero. 188*4d9fdb46SRobert Mustacchi (TU CUs signature is not the same namespace 189*4d9fdb46SRobert Mustacchi as DW_AT_dwo_id signatures. The two must be 190*4d9fdb46SRobert Mustacchi kept separate (for DWARF5)) 191*4d9fdb46SRobert Mustacchi 192*4d9fdb46SRobert Mustacchi If cc_unit_type == DW_UT_compile or DW_UT_partial 193*4d9fdb46SRobert Mustacchi the signature is a CU signature (dwo_id). 194*4d9fdb46SRobert Mustacchi Some early DW5 drafts encouraged DWARF4 output 195*4d9fdb46SRobert Mustacchi of some compilers to include dwo_id, but 196*4d9fdb46SRobert Mustacchi in a messier way(lacking DW_UT_*). 197*4d9fdb46SRobert Mustacchi If cc_unit_type == DW_UT_type ( DW_UT_split_type 198*4d9fdb46SRobert Mustacchi was never part of DW5, never standard). 199*4d9fdb46SRobert Mustacchi the signature is a type signature. */ 200*4d9fdb46SRobert Mustacchi 201*4d9fdb46SRobert Mustacchi Dwarf_Half cc_cu_die_tag; 202*4d9fdb46SRobert Mustacchi Dwarf_Sig8 cc_signature; 203*4d9fdb46SRobert Mustacchi 204*4d9fdb46SRobert Mustacchi /* cc_type_signature_offset contains the 205*4d9fdb46SRobert Mustacchi section-local DIE offset of the type 206*4d9fdb46SRobert Mustacchi the signature applies to if the cc_unit_type 207*4d9fdb46SRobert Mustacchi is DW_UT_type or DW_UT_split_type. */ 208*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_signature_offset; 209*4d9fdb46SRobert Mustacchi 210*4d9fdb46SRobert Mustacchi /* For each CU and each TU 211*4d9fdb46SRobert Mustacchi in a dwp package file there is 212*4d9fdb46SRobert Mustacchi is a hash and 213*4d9fdb46SRobert Mustacchi a set of offsets indexed by DW_SECT_* id. 214*4d9fdb46SRobert Mustacchi Only one such set per CU or TU. 215*4d9fdb46SRobert Mustacchi The data on all that is in cc_dwp_offsets 216*4d9fdb46SRobert Mustacchi 217*4d9fdb46SRobert Mustacchi If it is a TU the signature in cc_dwp_offsets 218*4d9fdb46SRobert Mustacchi must match the signature in cc_signature. 219*4d9fdb46SRobert Mustacchi */ 220*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_Fission_Per_CU_s cc_dwp_offsets; 221*4d9fdb46SRobert Mustacchi 222*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_signature_present; /* Meaning type signature 223*4d9fdb46SRobert Mustacchi in TU header or, for CU header, signature in CU DIE. */ 224*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_low_pc_present; 225*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_addr_base_present; /* Not TRUE in .dwo */ 226*4d9fdb46SRobert Mustacchi /* DW_AT_GNU_ranges_base was a GNU extension that appeared 227*4d9fdb46SRobert Mustacchi but was unused. See dwarf_die_deliv.c for details. */ 228*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_ranges_base_present; /* unused */ 229*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_rnglists_base_present; /* DW5 */ 230*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_str_offsets_base_present; 231*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_loclists_base_present; 232*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_cu_die_has_children; 233*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_dwo_name_present; 234*4d9fdb46SRobert Mustacchi 235*4d9fdb46SRobert Mustacchi /* Non zero if this context is a dwo section. Either 236*4d9fdb46SRobert Mustacchi dwo or dwp file. */ 237*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_is_dwo; 238*4d9fdb46SRobert Mustacchi 239*4d9fdb46SRobert Mustacchi /* cc_cu_die_offset_present is non-zero if 240*4d9fdb46SRobert Mustacchi cc_cu_die_global_sec_offset is meaningful. */ 241*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_cu_die_offset_present; 242*4d9fdb46SRobert Mustacchi 243*4d9fdb46SRobert Mustacchi /* if present, is base address of CU */ 244*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_low_pc; 245*4d9fdb46SRobert Mustacchi /* from DW_AT_addr_base in CU DIE, offset to .debug_addr table */ 246*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_addr_base; /* Zero in .dwo */ 247*4d9fdb46SRobert Mustacchi /* DW_AT_GNU_ranges_base was a GNU extension that appeared 248*4d9fdb46SRobert Mustacchi but was unused. See dwarf_die_deliv.c for details. */ 249*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_ranges_base; /* unused */ 250*4d9fdb46SRobert Mustacchi /* from DW_AT_rnglists_base in CU DIE */ 251*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_rnglists_base; /*DW5 */ 252*4d9fdb46SRobert Mustacchi /* from DW_AT_str_offsets_base in CU DIE */ 253*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_str_offsets_base; 254*4d9fdb46SRobert Mustacchi /* From DW_AT_loclists_base */ 255*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_loclists_base; 256*4d9fdb46SRobert Mustacchi 257*4d9fdb46SRobert Mustacchi char * cc_dwo_name; 258*4d9fdb46SRobert Mustacchi /* === END DEBUG FISSION (Split Dwarf) data */ 259*4d9fdb46SRobert Mustacchi 260*4d9fdb46SRobert Mustacchi /* Global section offset to the bytes of the CU die for this CU. 261*4d9fdb46SRobert Mustacchi Set when the CU die is accessed by dwarf_siblingof_b(). */ 262*4d9fdb46SRobert Mustacchi Dwarf_Unsigned cc_cu_die_global_sec_offset; 263*4d9fdb46SRobert Mustacchi 264*4d9fdb46SRobert Mustacchi 26549d3bc91SRichard Lowe Dwarf_Byte_Ptr cc_last_abbrev_ptr; 266*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr cc_last_abbrev_endptr; 26749d3bc91SRichard Lowe Dwarf_Hash_Table cc_abbrev_hash_table; 26849d3bc91SRichard Lowe Dwarf_CU_Context cc_next; 269*4d9fdb46SRobert Mustacchi 27007dc1947SRichard Lowe /*unsigned char cc_offset_length; */ 271*4d9fdb46SRobert Mustacchi Dwarf_Bool cc_is_info; /* TRUE means context is 272*4d9fdb46SRobert Mustacchi in debug_info, FALSE means is in debug_types. 273*4d9fdb46SRobert Mustacchi FALSE only possible for DWARF4 .debug_types 274*4d9fdb46SRobert Mustacchi section CUs. 275*4d9fdb46SRobert Mustacchi For DWARF5 all DIEs are in .debug_info[.dwo] */ 276*4d9fdb46SRobert Mustacchi 277*4d9fdb46SRobert Mustacchi Dwarf_Half cc_unit_type; 278*4d9fdb46SRobert Mustacchi /* DWARF5: set from header 279*4d9fdb46SRobert Mustacchi For DWARF 2,3,4 this is filled in initially 280*4d9fdb46SRobert Mustacchi from the CU header and refined by inspecting 281*4d9fdb46SRobert Mustacchi the CU DIE to detect the correct setting. */ 282*4d9fdb46SRobert Mustacchi 28307dc1947SRichard Lowe }; 28407dc1947SRichard Lowe 285*4d9fdb46SRobert Mustacchi /* Consolidates section-specific data in one place. 286*4d9fdb46SRobert Mustacchi Section is an Elf specific term, intended as a general 287*4d9fdb46SRobert Mustacchi term (for non-Elf objects some code must synthesize the 288*4d9fdb46SRobert Mustacchi values somehow). */ 28907dc1947SRichard Lowe struct Dwarf_Section_s { 29007dc1947SRichard Lowe Dwarf_Small * dss_data; 29107dc1947SRichard Lowe Dwarf_Unsigned dss_size; 292*4d9fdb46SRobert Mustacchi /* Some Elf sections have a non-zero dss_entrysize which 293*4d9fdb46SRobert Mustacchi is the size in bytes of a table entry in the section. 294*4d9fdb46SRobert Mustacchi Relocations and symbols are both in tables, so have a 295*4d9fdb46SRobert Mustacchi non-zero entrysize. Object formats which do not care 296*4d9fdb46SRobert Mustacchi about this should leave this field zero. */ 297*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_entrysize; 298*4d9fdb46SRobert Mustacchi /* dss_index is the section index as things are numbered in 299*4d9fdb46SRobert Mustacchi an object file being read. An Elf section number. */ 300*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_index; 301*4d9fdb46SRobert Mustacchi /* dss_addr is the 'section address' which is only 302*4d9fdb46SRobert Mustacchi non-zero for a GNU eh section. 303*4d9fdb46SRobert Mustacchi Purpose: to handle DW_EH_PE_pcrel encoding. Leaving 304*4d9fdb46SRobert Mustacchi it zero is fine for non-elf. */ 30507dc1947SRichard Lowe Dwarf_Addr dss_addr; 30607dc1947SRichard Lowe Dwarf_Small dss_data_was_malloc; 307*4d9fdb46SRobert Mustacchi /* is_in_use set during initial object reading to 308*4d9fdb46SRobert Mustacchi detect duplicates. Ignored after setup done. */ 309*4d9fdb46SRobert Mustacchi Dwarf_Small dss_is_in_use; 310*4d9fdb46SRobert Mustacchi 311*4d9fdb46SRobert Mustacchi /* When loading COMDAT they refer (sometimes) to 312*4d9fdb46SRobert Mustacchi base sections, so we need to have the BASE 313*4d9fdb46SRobert Mustacchi group sections filled in when the corresponding is 314*4d9fdb46SRobert Mustacchi not in the COMDAT group list. .debug_abbrev is 315*4d9fdb46SRobert Mustacchi an example. */ 316*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_group_number; 317*4d9fdb46SRobert Mustacchi 318*4d9fdb46SRobert Mustacchi /* These for reporting compression */ 319*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_uncompressed_length; 320*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_compressed_length; 321*4d9fdb46SRobert Mustacchi 322*4d9fdb46SRobert Mustacchi /* If this is zdebug, to start data/size are the 323*4d9fdb46SRobert Mustacchi raw section bytes. 324*4d9fdb46SRobert Mustacchi Initially for all sections dss_data_was_malloc set FALSE 325*4d9fdb46SRobert Mustacchi and dss_requires_decompress set FALSE. 326*4d9fdb46SRobert Mustacchi For zdebug set dss_zdebug_requires_decompress set TRUE 327*4d9fdb46SRobert Mustacchi In that case it is likely ZLIB compressed but 328*4d9fdb46SRobert Mustacchi we do not know that just scanning section headers. 329*4d9fdb46SRobert Mustacchi If not .zdebug but it is SHF_COMPRESSED 330*4d9fdb46SRobert Mustacchi then decompress is required. 331*4d9fdb46SRobert Mustacchi 332*4d9fdb46SRobert Mustacchi On translation (ie zlib use and malloc) 333*4d9fdb46SRobert Mustacchi Set dss_data dss_size to point to malloc space and 334*4d9fdb46SRobert Mustacchi malloc size. 335*4d9fdb46SRobert Mustacchi Set dss_did_decompress FALSE 336*4d9fdb46SRobert Mustacchi Set dss_was_malloc TRUE */ 337*4d9fdb46SRobert Mustacchi Dwarf_Small dss_zdebug_requires_decompress; 338*4d9fdb46SRobert Mustacchi Dwarf_Small dss_did_decompress; 339*4d9fdb46SRobert Mustacchi Dwarf_Small dss_shf_compressed; /* section flag SHF_COMPRESS */ 340*4d9fdb46SRobert Mustacchi Dwarf_Small dss_ZLIB_compressed; /* Section compression starts with ZLIB chars*/ 341*4d9fdb46SRobert Mustacchi 342*4d9fdb46SRobert Mustacchi /* For non-elf, leaving the following fields zero 343*4d9fdb46SRobert Mustacchi will mean they are ignored. */ 344*4d9fdb46SRobert Mustacchi /* dss_link should be zero unless a section has a link 345*4d9fdb46SRobert Mustacchi to another (sh_link). Used to access relocation data for 346*4d9fdb46SRobert Mustacchi a section (and for symtab section, access its strtab). */ 347*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_link; 348*4d9fdb46SRobert Mustacchi /* The following is used when reading .rela sections 349*4d9fdb46SRobert Mustacchi (such sections appear in some .o files). */ 35007dc1947SRichard Lowe Dwarf_Half dss_reloc_index; /* Zero means ignore the reloc fields. */ 35107dc1947SRichard Lowe Dwarf_Small * dss_reloc_data; 35207dc1947SRichard Lowe Dwarf_Unsigned dss_reloc_size; 353*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_reloc_entrysize; 35407dc1947SRichard Lowe Dwarf_Addr dss_reloc_addr; 355*4d9fdb46SRobert Mustacchi /* dss_reloc_symtab is the sh_link of a .rela to its .symtab, leave 356*4d9fdb46SRobert Mustacchi it 0 if non-meaningful. */ 35707dc1947SRichard Lowe Dwarf_Addr dss_reloc_symtab; 358*4d9fdb46SRobert Mustacchi /* dss_reloc_link should be zero unless a reloc section has a link 359*4d9fdb46SRobert Mustacchi to another (sh_link). Used to access the symtab for relocations 360*4d9fdb46SRobert Mustacchi a section. */ 361*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_reloc_link; 362*4d9fdb46SRobert Mustacchi /* Pointer to the elf symtab, used for elf .rela. Leave it 0 363*4d9fdb46SRobert Mustacchi if not relevant. */ 36407dc1947SRichard Lowe struct Dwarf_Section_s *dss_symtab; 365*4d9fdb46SRobert Mustacchi /* dss_name, dss_standard_name must never be freed, 366*4d9fdb46SRobert Mustacchi they are static strings in libdwarf. */ 367*4d9fdb46SRobert Mustacchi const char * dss_name; 368*4d9fdb46SRobert Mustacchi const char * dss_standard_name; 369*4d9fdb46SRobert Mustacchi 370*4d9fdb46SRobert Mustacchi /* Object section number in object file. */ 371*4d9fdb46SRobert Mustacchi unsigned dss_number; 372*4d9fdb46SRobert Mustacchi 373*4d9fdb46SRobert Mustacchi /* These are elf flags and non-elf object should 374*4d9fdb46SRobert Mustacchi just leave these fields zero. Which is essentially 375*4d9fdb46SRobert Mustacchi automatic as they are not in 376*4d9fdb46SRobert Mustacchi Dwarf_Obj_Access_Section_s. */ 377*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_flags; 378*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dss_addralign; 379*4d9fdb46SRobert Mustacchi 380*4d9fdb46SRobert Mustacchi /* Set when loading .group section as those are special and 381*4d9fdb46SRobert Mustacchi neither compressed nor have relocations so never malloc 382*4d9fdb46SRobert Mustacchi space for libdwarf. */ 383*4d9fdb46SRobert Mustacchi Dwarf_Small dss_ignore_reloc_group_sec; 384*4d9fdb46SRobert Mustacchi char dss_is_rela; 38549d3bc91SRichard Lowe }; 38649d3bc91SRichard Lowe 387*4d9fdb46SRobert Mustacchi /* Overview: if next_to_use== first, no error slots are used. 388*4d9fdb46SRobert Mustacchi If next_to_use+1 (mod maxcount) == first the slots are all used 38907dc1947SRichard Lowe */ 39007dc1947SRichard Lowe struct Dwarf_Harmless_s { 39107dc1947SRichard Lowe unsigned dh_maxcount; 39207dc1947SRichard Lowe unsigned dh_next_to_use; 39307dc1947SRichard Lowe unsigned dh_first; 39407dc1947SRichard Lowe unsigned dh_errs_count; 39507dc1947SRichard Lowe char ** dh_errors; 39607dc1947SRichard Lowe }; 39749d3bc91SRichard Lowe 398*4d9fdb46SRobert Mustacchi /* Data needed seperately for debug_info and debug_types 399*4d9fdb46SRobert Mustacchi as we may be reading both interspersed. */ 40049d3bc91SRichard Lowe 401*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_InfoTypes_s { 402*4d9fdb46SRobert Mustacchi /* Context for the compilation_unit just read by a call to 403*4d9fdb46SRobert Mustacchi dwarf_next_cu_header. **Updated by dwarf_next_cu_header in 404*4d9fdb46SRobert Mustacchi dwarf_die_deliv.c */ 40549d3bc91SRichard Lowe Dwarf_CU_Context de_cu_context; 406*4d9fdb46SRobert Mustacchi /* Points to linked list of CU Contexts for the 407*4d9fdb46SRobert Mustacchi CU's already read. These are only CU's read 408*4d9fdb46SRobert Mustacchi by dwarf_next_cu_header(). */ 40949d3bc91SRichard Lowe Dwarf_CU_Context de_cu_context_list; 410*4d9fdb46SRobert Mustacchi /* Points to the last CU Context added to the list by 411*4d9fdb46SRobert Mustacchi dwarf_next_cu_header(). */ 41249d3bc91SRichard Lowe Dwarf_CU_Context de_cu_context_list_end; 41349d3bc91SRichard Lowe 414*4d9fdb46SRobert Mustacchi /* Offset of last byte of last CU read. 415*4d9fdb46SRobert Mustacchi Actually one-past that last byte. So 416*4d9fdb46SRobert Mustacchi use care and compare as offset >= de_last_offset 417*4d9fdb46SRobert Mustacchi to know if offset is too big. */ 418*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_last_offset; 419*4d9fdb46SRobert Mustacchi /* de_last_di_info_ptr and de_last_die are used with 420*4d9fdb46SRobert Mustacchi dwarf_siblingof, dwarf_child, and dwarf_validate_die_sibling. 421*4d9fdb46SRobert Mustacchi dwarf_validate_die_sibling will not give meaningful results 422*4d9fdb46SRobert Mustacchi if called inappropriately. */ 423*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr de_last_di_ptr; 424*4d9fdb46SRobert Mustacchi Dwarf_Die de_last_die; 425*4d9fdb46SRobert Mustacchi }; 426*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Debug_InfoTypes_s *Dwarf_Debug_InfoTypes; 427*4d9fdb46SRobert Mustacchi 428*4d9fdb46SRobert Mustacchi /* As the tasks performed on a debug related section is the same, 429*4d9fdb46SRobert Mustacchi in order to make the process of adding a new section 430*4d9fdb46SRobert Mustacchi (very unlikely) a little bit easy and to reduce the 431*4d9fdb46SRobert Mustacchi possibility of errors, a simple table 432*4d9fdb46SRobert Mustacchi build dynamically, will contain the relevant information. 433*4d9fdb46SRobert Mustacchi */ 434*4d9fdb46SRobert Mustacchi 435*4d9fdb46SRobert Mustacchi struct Dwarf_dbg_sect_s { 436*4d9fdb46SRobert Mustacchi /* Debug section name must not be freed, is quoted string. 437*4d9fdb46SRobert Mustacchi This is the name from the object file itself. */ 438*4d9fdb46SRobert Mustacchi const char *ds_name; 439*4d9fdb46SRobert Mustacchi /* The section number in object section numbering. */ 440*4d9fdb46SRobert Mustacchi unsigned ds_number; 441*4d9fdb46SRobert Mustacchi /* Debug section information, points to de_debug_*member 442*4d9fdb46SRobert Mustacchi (or the like) of the dbg struct. */ 443*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *ds_secdata; 444*4d9fdb46SRobert Mustacchi 445*4d9fdb46SRobert Mustacchi unsigned ds_groupnumber; 446*4d9fdb46SRobert Mustacchi int ds_duperr; /* Error code for duplicated section */ 447*4d9fdb46SRobert Mustacchi int ds_emptyerr; /* Error code for empty section */ 448*4d9fdb46SRobert Mustacchi int ds_have_dwarf; /* Section contains DWARF */ 449*4d9fdb46SRobert Mustacchi int ds_have_zdebug; /* Section compressed: .zdebug name */ 450*4d9fdb46SRobert Mustacchi }; 451*4d9fdb46SRobert Mustacchi 452*4d9fdb46SRobert Mustacchi /* As the number of debug sections does not change very often, in the case a 453*4d9fdb46SRobert Mustacchi new section is added in 'enter_section_in_array()' 454*4d9fdb46SRobert Mustacchi the 'MAX_DEBUG_SECTIONS' must 455*4d9fdb46SRobert Mustacchi be updated accordingly. 456*4d9fdb46SRobert Mustacchi This does not yet allow for section-groups in object files, 457*4d9fdb46SRobert Mustacchi for which many .debug_info (and other) sections may exist. 458*4d9fdb46SRobert Mustacchi */ 459*4d9fdb46SRobert Mustacchi #define DWARF_MAX_DEBUG_SECTIONS 50 460*4d9fdb46SRobert Mustacchi #define DWARFSTRING_ALLOC_SIZE 200 461*4d9fdb46SRobert Mustacchi 462*4d9fdb46SRobert Mustacchi 463*4d9fdb46SRobert Mustacchi /* All the Dwarf_Debug tied-file info in one place. */ 464*4d9fdb46SRobert Mustacchi struct Dwarf_Tied_Data_s { 465*4d9fdb46SRobert Mustacchi /* Used to access executable from .dwo or .dwp object. 466*4d9fdb46SRobert Mustacchi Pointer to the tied_to Dwarf_Debug*/ 467*4d9fdb46SRobert Mustacchi Dwarf_Debug td_tied_object; 468*4d9fdb46SRobert Mustacchi 469*4d9fdb46SRobert Mustacchi /* TRUE if this tied object is tied to. 470*4d9fdb46SRobert Mustacchi It's extra work to look for a DW_AT_dwo_id. 471*4d9fdb46SRobert Mustacchi Set when tied dbg (on the base) was created. 472*4d9fdb46SRobert Mustacchi This helps us do it only when it may be productive. */ 473*4d9fdb46SRobert Mustacchi Dwarf_Bool td_is_tied_object; 474*4d9fdb46SRobert Mustacchi 475*4d9fdb46SRobert Mustacchi /* Used for Type Unit signatures. 476*4d9fdb46SRobert Mustacchi Type Units are in .debug_types in DW4 477*4d9fdb46SRobert Mustacchi but in .debug_info in DW5. 478*4d9fdb46SRobert Mustacchi Some .debug_info point to them symbolically 479*4d9fdb46SRobert Mustacchi via DW_AT_signature attributes. 480*4d9fdb46SRobert Mustacchi If non-zero is a dwarf_tsearch 'tree'. 481*4d9fdb46SRobert Mustacchi Only non-zero if td_is_tied_object is set and 482*4d9fdb46SRobert Mustacchi we had a reason to build the search tree.. 483*4d9fdb46SRobert Mustacchi Type Units have a Dwarf_Sig8 signature 484*4d9fdb46SRobert Mustacchi in the header, and such is recorded here. 485*4d9fdb46SRobert Mustacchi 486*4d9fdb46SRobert Mustacchi Type Unit signatures can conflict with 487*4d9fdb46SRobert Mustacchi signatures in split-dwarf (dwo/dwp) sections. 488*4d9fdb46SRobert Mustacchi 489*4d9fdb46SRobert Mustacchi The Key for each record is a Dwarf_Sig8 (8 bytes). 490*4d9fdb46SRobert Mustacchi The data for each is a pointer to a Dwarf_CU_context 491*4d9fdb46SRobert Mustacchi record in this dbg (cu_context in 492*4d9fdb46SRobert Mustacchi one of tied dbg's de_cu_context_list). */ 493*4d9fdb46SRobert Mustacchi void *td_tied_search; 494*4d9fdb46SRobert Mustacchi 495*4d9fdb46SRobert Mustacchi }; 496*4d9fdb46SRobert Mustacchi 497*4d9fdb46SRobert Mustacchi /* dg_groupnum 0 does not exist. 498*4d9fdb46SRobert Mustacchi dg_groupnum 1 is base 499*4d9fdb46SRobert Mustacchi dg_groupnum 2 is dwo 500*4d9fdb46SRobert Mustacchi dg_groupnum 3 and higher are COMDAT groups (if any). 501*4d9fdb46SRobert Mustacchi */ 502*4d9fdb46SRobert Mustacchi struct Dwarf_Group_Data_s { 503*4d9fdb46SRobert Mustacchi /* For traditional DWARF the value is one, just one group. */ 504*4d9fdb46SRobert Mustacchi unsigned gd_number_of_groups; 505*4d9fdb46SRobert Mustacchi 506*4d9fdb46SRobert Mustacchi /* Raw elf (elf-like) section count. */ 507*4d9fdb46SRobert Mustacchi unsigned gd_number_of_sections; 508*4d9fdb46SRobert Mustacchi 509*4d9fdb46SRobert Mustacchi unsigned gd_map_entry_count; 51049d3bc91SRichard Lowe 511*4d9fdb46SRobert Mustacchi /* A map from section number to group number. */ 512*4d9fdb46SRobert Mustacchi void *gd_map; 513*4d9fdb46SRobert Mustacchi }; 514*4d9fdb46SRobert Mustacchi 515*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_s { 516*4d9fdb46SRobert Mustacchi /* All file access methods and support data 517*4d9fdb46SRobert Mustacchi are hidden in this structure. 518*4d9fdb46SRobert Mustacchi We get a pointer, callers control the lifetime of the 519*4d9fdb46SRobert Mustacchi structure and contents. */ 520*4d9fdb46SRobert Mustacchi struct Dwarf_Obj_Access_Interface_s *de_obj_file; 52149d3bc91SRichard Lowe 522*4d9fdb46SRobert Mustacchi Dwarf_Handler de_errhand; 523*4d9fdb46SRobert Mustacchi Dwarf_Ptr de_errarg; 524*4d9fdb46SRobert Mustacchi 525*4d9fdb46SRobert Mustacchi /* Enabling us to close an fd if we own it, 526*4d9fdb46SRobert Mustacchi as in the case of dwarf_init_path(). 527*4d9fdb46SRobert Mustacchi de_fd is only meaningful 528*4d9fdb46SRobert Mustacchi if de_owns_fd is set. Each object 529*4d9fdb46SRobert Mustacchi file type has any necessary fd recorded 530*4d9fdb46SRobert Mustacchi under de_obj_file. */ 531*4d9fdb46SRobert Mustacchi int de_fd; 532*4d9fdb46SRobert Mustacchi char de_owns_fd; 533*4d9fdb46SRobert Mustacchi /* de_path is only set automatically if dwarf_init_path() 534*4d9fdb46SRobert Mustacchi was used to initialize things. 535*4d9fdb46SRobert Mustacchi Used with the .gnu_debuglink section. */ 536*4d9fdb46SRobert Mustacchi const char *de_path; 537*4d9fdb46SRobert Mustacchi 538*4d9fdb46SRobert Mustacchi const char ** de_gnu_global_paths; 539*4d9fdb46SRobert Mustacchi unsigned de_gnu_global_path_count; 540*4d9fdb46SRobert Mustacchi 541*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_InfoTypes_s de_info_reading; 542*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_InfoTypes_s de_types_reading; 543*4d9fdb46SRobert Mustacchi 544*4d9fdb46SRobert Mustacchi /* DW_GROUPNUMBER_ANY, DW_GROUPNUMBER_BASE, DW_GROUPNUMBER_DWO, 545*4d9fdb46SRobert Mustacchi or a comdat group number > 2 546*4d9fdb46SRobert Mustacchi Selected at init time of this dbg based on 547*4d9fdb46SRobert Mustacchi user request and on data in the object. */ 548*4d9fdb46SRobert Mustacchi unsigned de_groupnumber; 549*4d9fdb46SRobert Mustacchi 550*4d9fdb46SRobert Mustacchi /* Supporting data for groupnumbers. */ 551*4d9fdb46SRobert Mustacchi struct Dwarf_Group_Data_s de_groupnumbers; 552*4d9fdb46SRobert Mustacchi 553*4d9fdb46SRobert Mustacchi /* Number of bytes in the length, and offset field in various 554*4d9fdb46SRobert Mustacchi .debu* sections. It's not very meaningful, and is 555*4d9fdb46SRobert Mustacchi only used in one 'approximate' calculation. 556*4d9fdb46SRobert Mustacchi de_offset_size would be a more appropos name. */ 55749d3bc91SRichard Lowe Dwarf_Small de_length_size; 55849d3bc91SRichard Lowe 559*4d9fdb46SRobert Mustacchi /* Size of the object file in bytes. If Unknown 560*4d9fdb46SRobert Mustacchi leave this zero. */ 561*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_filesize; 562*4d9fdb46SRobert Mustacchi 563*4d9fdb46SRobert Mustacchi /* number of bytes in a pointer of the target in various .debug_ 564*4d9fdb46SRobert Mustacchi sections. 4 in 32bit, 8 in MIPS 64, ia64. */ 56549d3bc91SRichard Lowe Dwarf_Small de_pointer_size; 56649d3bc91SRichard Lowe 567*4d9fdb46SRobert Mustacchi /* set at creation of a Dwarf_Debug to say if form_string should be 568*4d9fdb46SRobert Mustacchi checked for valid length at every call. 0 means do the check. 569*4d9fdb46SRobert Mustacchi non-zero means do not do the check. */ 57049d3bc91SRichard Lowe Dwarf_Small de_assume_string_in_bounds; 57149d3bc91SRichard Lowe 572*4d9fdb46SRobert Mustacchi /* Keep track of allocations so a dwarf_finish call can clean up. 573*4d9fdb46SRobert Mustacchi Null till a tree is created */ 574*4d9fdb46SRobert Mustacchi void * de_alloc_tree; 575*4d9fdb46SRobert Mustacchi 576*4d9fdb46SRobert Mustacchi /* These fields are used to process debug_frame section. **Updated 577*4d9fdb46SRobert Mustacchi by dwarf_get_fde_list in dwarf_frame.h */ 578*4d9fdb46SRobert Mustacchi /* Points to contiguous block of pointers to Dwarf_Cie_s structs. */ 57949d3bc91SRichard Lowe Dwarf_Cie *de_cie_data; 580*4d9fdb46SRobert Mustacchi /* Count of number of Dwarf_Cie_s structs. */ 58149d3bc91SRichard Lowe Dwarf_Signed de_cie_count; 582*4d9fdb46SRobert Mustacchi /* Keep eh (GNU) separate!. */ 58307dc1947SRichard Lowe Dwarf_Cie *de_cie_data_eh; 58407dc1947SRichard Lowe Dwarf_Signed de_cie_count_eh; 585*4d9fdb46SRobert Mustacchi /* Points to contiguous block of pointers to Dwarf_Fde_s structs. */ 58649d3bc91SRichard Lowe Dwarf_Fde *de_fde_data; 587*4d9fdb46SRobert Mustacchi /* Count of number of Dwarf_Fde_s structs. */ 588*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_fde_count; 589*4d9fdb46SRobert Mustacchi /* Keep eh (GNU) separate!. */ 59007dc1947SRichard Lowe Dwarf_Fde *de_fde_data_eh; 591*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_fde_count_eh; 59207dc1947SRichard Lowe 593*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_info; 594*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_types; 59507dc1947SRichard Lowe struct Dwarf_Section_s de_debug_abbrev; 59607dc1947SRichard Lowe struct Dwarf_Section_s de_debug_line; 597*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_line_str; /* New in DWARF5 */ 59807dc1947SRichard Lowe struct Dwarf_Section_s de_debug_loc; 59907dc1947SRichard Lowe struct Dwarf_Section_s de_debug_aranges; 60007dc1947SRichard Lowe struct Dwarf_Section_s de_debug_macinfo; 601*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_macro; /* New in DWARF5 */ 602*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_names; /* New in DWARF5 */ 60307dc1947SRichard Lowe struct Dwarf_Section_s de_debug_pubnames; 60407dc1947SRichard Lowe struct Dwarf_Section_s de_debug_str; 605*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_sup; /* New in DWARF5 */ 606*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_loclists; /* New in DWARF5 */ 607*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_rnglists; /* New in DWARF5 */ 60807dc1947SRichard Lowe struct Dwarf_Section_s de_debug_frame; 609*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_gnu_debuglink; /* New September 2019 */ 610*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_note_gnu_buildid; /* New September 2019 */ 611*4d9fdb46SRobert Mustacchi 61207dc1947SRichard Lowe 61307dc1947SRichard Lowe /* gnu: the g++ eh_frame section */ 61407dc1947SRichard Lowe struct Dwarf_Section_s de_debug_frame_eh_gnu; 61507dc1947SRichard Lowe 61607dc1947SRichard Lowe struct Dwarf_Section_s de_debug_pubtypes; /* DWARF3 .debug_pubtypes */ 61707dc1947SRichard Lowe 618*4d9fdb46SRobert Mustacchi 619*4d9fdb46SRobert Mustacchi /* Four SGI IRIX extensions essentially 620*4d9fdb46SRobert Mustacchi identical to DWARF3 .debug_pubtypes. 621*4d9fdb46SRobert Mustacchi Only on SGI IRIX. */ 62207dc1947SRichard Lowe struct Dwarf_Section_s de_debug_funcnames; 623*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_typenames; 62407dc1947SRichard Lowe struct Dwarf_Section_s de_debug_varnames; 62507dc1947SRichard Lowe struct Dwarf_Section_s de_debug_weaknames; 62649d3bc91SRichard Lowe 627*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_ranges; 628*4d9fdb46SRobert Mustacchi /* Following two part of DebugFission and DWARF5 */ 629*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_str_offsets; 630*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_addr; 631*4d9fdb46SRobert Mustacchi 632*4d9fdb46SRobert Mustacchi /* For the .debug_rnglists[.dwo] section */ 633*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_rnglists_context_count; 634*4d9fdb46SRobert Mustacchi /* pointer to array of pointers to 635*4d9fdb46SRobert Mustacchi rnglists context instances */ 636*4d9fdb46SRobert Mustacchi Dwarf_Rnglists_Context * de_rnglists_context; 637*4d9fdb46SRobert Mustacchi 638*4d9fdb46SRobert Mustacchi /* For the .debug_loclists[.dwo] section */ 639*4d9fdb46SRobert Mustacchi Dwarf_Unsigned de_loclists_context_count; 640*4d9fdb46SRobert Mustacchi /* pointer to array of pointers to 641*4d9fdb46SRobert Mustacchi loclists context instances */ 642*4d9fdb46SRobert Mustacchi Dwarf_Loclists_Context * de_loclists_context; 643*4d9fdb46SRobert Mustacchi 644*4d9fdb46SRobert Mustacchi /* Following for the .gdb_index section. */ 645*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_gdbindex; 646*4d9fdb46SRobert Mustacchi 647*4d9fdb46SRobert Mustacchi /* Types in DWARF5 are in .debug_info 648*4d9fdb46SRobert Mustacchi and in DWARF4 are in .debug_types. 649*4d9fdb46SRobert Mustacchi These indexes first standardized in DWARF5, 650*4d9fdb46SRobert Mustacchi DWARF4 can have them as an extension. 651*4d9fdb46SRobert Mustacchi The next to refer to the DWP index sections and the 652*4d9fdb46SRobert Mustacchi tu and cu indexes sections are distinct in DWARF4 & 5. */ 653*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_cu_index; 654*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_debug_tu_index; 655*4d9fdb46SRobert Mustacchi 656*4d9fdb46SRobert Mustacchi /* For non-elf, simply leave the following two structs zeroed and 657*4d9fdb46SRobert Mustacchi they will be ignored. */ 658*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_elf_symtab; 659*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s de_elf_strtab; 660*4d9fdb46SRobert Mustacchi 661*4d9fdb46SRobert Mustacchi /* For a .dwp object file . 662*4d9fdb46SRobert Mustacchi For DWARF4, type units are in .debug_types 663*4d9fdb46SRobert Mustacchi (DWP is a GNU extension in DW4).. 664*4d9fdb46SRobert Mustacchi For DWARF5, type units are in .debug_info. 665*4d9fdb46SRobert Mustacchi */ 666*4d9fdb46SRobert Mustacchi Dwarf_Xu_Index_Header de_cu_hashindex_data; 667*4d9fdb46SRobert Mustacchi Dwarf_Xu_Index_Header de_tu_hashindex_data; 668*4d9fdb46SRobert Mustacchi 669*4d9fdb46SRobert Mustacchi void (*de_copy_word) (void *, const void *, unsigned long); 67049d3bc91SRichard Lowe unsigned char de_same_endian; 671*4d9fdb46SRobert Mustacchi unsigned char de_elf_must_close; /* If non-zero, then 672*4d9fdb46SRobert Mustacchi it was dwarf_init (not dwarf_elf_init) 673*4d9fdb46SRobert Mustacchi so must elf_end() */ 67449d3bc91SRichard Lowe 67507dc1947SRichard Lowe /* Default is DW_FRAME_INITIAL_VALUE from header. */ 676*4d9fdb46SRobert Mustacchi Dwarf_Half de_frame_rule_initial_value; 67707dc1947SRichard Lowe 67807dc1947SRichard Lowe /* Default is DW_FRAME_LAST_REG_NUM. */ 679*4d9fdb46SRobert Mustacchi Dwarf_Half de_frame_reg_rules_entry_count; 680*4d9fdb46SRobert Mustacchi 681*4d9fdb46SRobert Mustacchi Dwarf_Half de_frame_cfa_col_number; 682*4d9fdb46SRobert Mustacchi Dwarf_Half de_frame_same_value_number; 683*4d9fdb46SRobert Mustacchi Dwarf_Half de_frame_undefined_value_number; 684*4d9fdb46SRobert Mustacchi 685*4d9fdb46SRobert Mustacchi unsigned char de_big_endian_object; /* Non-zero if 686*4d9fdb46SRobert Mustacchi object being read is big-endian. */ 687*4d9fdb46SRobert Mustacchi 688*4d9fdb46SRobert Mustacchi /* Non-zero if dwarf_get_globals(), dwarf_get_funcs, 689*4d9fdb46SRobert Mustacchi dwarf_get_types,dwarf_get_pubtypes, 690*4d9fdb46SRobert Mustacchi dwarf_get_vars,dwarf_get_weaks should create 691*4d9fdb46SRobert Mustacchi and return a special zero-die-offset for the 692*4d9fdb46SRobert Mustacchi corresponding pubnames-style section CU header with 693*4d9fdb46SRobert Mustacchi zero pubnames-style named DIEs. In that case the 694*4d9fdb46SRobert Mustacchi list returned will have an entry with a zero for 695*4d9fdb46SRobert Mustacchi the die-offset (which is an impossible debug_info 696*4d9fdb46SRobert Mustacchi die_offset). New March 2019. 697*4d9fdb46SRobert Mustacchi See dwarf_return_empty_pubnames() */ 698*4d9fdb46SRobert Mustacchi unsigned char de_return_empty_pubnames; 699*4d9fdb46SRobert Mustacchi 700*4d9fdb46SRobert Mustacchi struct Dwarf_dbg_sect_s de_debug_sections[DWARF_MAX_DEBUG_SECTIONS]; 701*4d9fdb46SRobert Mustacchi unsigned de_debug_sections_total_entries; /* Number actually used. */ 702*4d9fdb46SRobert Mustacchi 703*4d9fdb46SRobert Mustacchi struct Dwarf_Harmless_s de_harmless_errors; 70407dc1947SRichard Lowe 705*4d9fdb46SRobert Mustacchi struct Dwarf_Printf_Callback_Info_s de_printf_callback; 706*4d9fdb46SRobert Mustacchi void * de_printf_callback_null_device_handle; 70707dc1947SRichard Lowe 708*4d9fdb46SRobert Mustacchi /* Used in a tied dbg to hold global info 709*4d9fdb46SRobert Mustacchi on the tied object (DW_AT_dwo_id). 710*4d9fdb46SRobert Mustacchi And for Type Unit signatures whether tied 711*4d9fdb46SRobert Mustacchi or not. */ 712*4d9fdb46SRobert Mustacchi struct Dwarf_Tied_Data_s de_tied_data; 71307dc1947SRichard Lowe 71449d3bc91SRichard Lowe }; 71549d3bc91SRichard Lowe 716*4d9fdb46SRobert Mustacchi /* New style. takes advantage of dwarfstrings capability. 717*4d9fdb46SRobert Mustacchi This not a public function. */ 718*4d9fdb46SRobert Mustacchi int _dwarf_printf(Dwarf_Debug dbg, const char * data); 719*4d9fdb46SRobert Mustacchi 72049d3bc91SRichard Lowe typedef struct Dwarf_Chain_s *Dwarf_Chain; 72149d3bc91SRichard Lowe struct Dwarf_Chain_s { 72249d3bc91SRichard Lowe void *ch_item; 723*4d9fdb46SRobert Mustacchi int ch_itemtype; /* Needed to dealloc chain contents */ 72449d3bc91SRichard Lowe Dwarf_Chain ch_next; 72549d3bc91SRichard Lowe }; 72649d3bc91SRichard Lowe 727*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Chain_o *Dwarf_Chain_2; 728*4d9fdb46SRobert Mustacchi struct Dwarf_Chain_o { 729*4d9fdb46SRobert Mustacchi Dwarf_Off ch_item; 730*4d9fdb46SRobert Mustacchi Dwarf_Chain_2 ch_next; 731*4d9fdb46SRobert Mustacchi }; 73249d3bc91SRichard Lowe 73349d3bc91SRichard Lowe /* Size of cu header version stamp field. */ 734*4d9fdb46SRobert Mustacchi #define CU_VERSION_STAMP_SIZE DWARF_HALF_SIZE 73549d3bc91SRichard Lowe 73649d3bc91SRichard Lowe /* Size of cu header address size field. */ 737*4d9fdb46SRobert Mustacchi #define CU_ADDRESS_SIZE_SIZE sizeof(Dwarf_Small) 73849d3bc91SRichard Lowe 73949d3bc91SRichard Lowe #define ORIGINAL_DWARF_OFFSET_SIZE 4 740*4d9fdb46SRobert Mustacchi /* The DISTINGUISHED VALUE is 4 byte value defined by DWARF 741*4d9fdb46SRobert Mustacchi since DWARF3. */ 74249d3bc91SRichard Lowe #define DISTINGUISHED_VALUE 0xffffffff 74349d3bc91SRichard Lowe #define DISTINGUISHED_VALUE_OFFSET_SIZE 8 744*4d9fdb46SRobert Mustacchi #define DISTINGUISHED_VALUE_ARRAY(x) char x[4] = { 0xff,0xff,0xff,0xff } 74549d3bc91SRichard Lowe 746*4d9fdb46SRobert Mustacchi 747*4d9fdb46SRobert Mustacchi int _dwarf_ignorethissection(const char *scn_name); 748*4d9fdb46SRobert Mustacchi 749*4d9fdb46SRobert Mustacchi /* We don't load the sections until they are needed. This function is 750*4d9fdb46SRobert Mustacchi used to load the section. */ 75149d3bc91SRichard Lowe int _dwarf_load_section(Dwarf_Debug, 75207dc1947SRichard Lowe struct Dwarf_Section_s *, 75307dc1947SRichard Lowe Dwarf_Error *); 754*4d9fdb46SRobert Mustacchi 755*4d9fdb46SRobert Mustacchi void _dwarf_dealloc_rnglists_context(Dwarf_Debug dbg); 756*4d9fdb46SRobert Mustacchi void _dwarf_dealloc_loclists_context(Dwarf_Debug dbg); 757*4d9fdb46SRobert Mustacchi 758*4d9fdb46SRobert Mustacchi int _dwarf_get_string_base_attr_value(Dwarf_Debug dbg, 759*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context, 760*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *sbase_out, 761*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 762*4d9fdb46SRobert Mustacchi 763*4d9fdb46SRobert Mustacchi int _dwarf_extract_string_offset_via_str_offsets(Dwarf_Debug dbg, 764*4d9fdb46SRobert Mustacchi Dwarf_Small *data_ptr, 765*4d9fdb46SRobert Mustacchi Dwarf_Small *end_data_ptr, 766*4d9fdb46SRobert Mustacchi Dwarf_Half attrnum, 767*4d9fdb46SRobert Mustacchi Dwarf_Half attrform, 768*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context, 769*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *str_sect_offset_out, 770*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 771*4d9fdb46SRobert Mustacchi 772*4d9fdb46SRobert Mustacchi 773*4d9fdb46SRobert Mustacchi int _dwarf_extract_address_from_debug_addr(Dwarf_Debug dbg, 774*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context, 775*4d9fdb46SRobert Mustacchi Dwarf_Unsigned index, 776*4d9fdb46SRobert Mustacchi Dwarf_Addr *addr_out, 777*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 778*4d9fdb46SRobert Mustacchi 779*4d9fdb46SRobert Mustacchi int _dwarf_get_base_and_size_given_signature( 780*4d9fdb46SRobert Mustacchi Dwarf_CU_Context *context, 781*4d9fdb46SRobert Mustacchi Dwarf_Sig8 *signature_in, 782*4d9fdb46SRobert Mustacchi /* xu_sect_index means DW_SECT_info etc. */ 783*4d9fdb46SRobert Mustacchi Dwarf_Unsigned xu_sect_index, 784*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *base_out, 785*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *size_out, 786*4d9fdb46SRobert Mustacchi Dwarf_Error *err); 787*4d9fdb46SRobert Mustacchi 788*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_cu_index(Dwarf_Debug dbg); 789*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_tu_index(Dwarf_Debug dbg); 790*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_index(Dwarf_Debug dbg); 791*4d9fdb46SRobert Mustacchi 792*4d9fdb46SRobert Mustacchi /* This should only be called on a CU. Never a TU. */ 793*4d9fdb46SRobert Mustacchi int _dwarf_get_debugfission_for_offset(Dwarf_Debug dbg, 794*4d9fdb46SRobert Mustacchi Dwarf_Off offset_wanted, 795*4d9fdb46SRobert Mustacchi const char *keytype, /* "cu" or "tu" */ 796*4d9fdb46SRobert Mustacchi Dwarf_Debug_Fission_Per_CU * percu_out, 797*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 798*4d9fdb46SRobert Mustacchi 799*4d9fdb46SRobert Mustacchi /* whichone: must be a valid DW_SECT* macro value. */ 800*4d9fdb46SRobert Mustacchi Dwarf_Unsigned _dwarf_get_dwp_extra_offset( 801*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_Fission_Per_CU_s* dwp, 802*4d9fdb46SRobert Mustacchi unsigned whichone, Dwarf_Unsigned * size); 803*4d9fdb46SRobert Mustacchi 804*4d9fdb46SRobert Mustacchi /* This will look into the tied Dwarf_Debug 805*4d9fdb46SRobert Mustacchi to which should have a skeleton CU DIE 806*4d9fdb46SRobert Mustacchi and an addr_base and also have the .debug_addr 807*4d9fdb46SRobert Mustacchi section. */ 808*4d9fdb46SRobert Mustacchi 809*4d9fdb46SRobert Mustacchi int _dwarf_get_addr_from_tied(Dwarf_Debug dbg, 810*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context, 811*4d9fdb46SRobert Mustacchi Dwarf_Unsigned addrindex, 812*4d9fdb46SRobert Mustacchi Dwarf_Addr *addr_out, 813*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 814*4d9fdb46SRobert Mustacchi 815*4d9fdb46SRobert Mustacchi 816*4d9fdb46SRobert Mustacchi int _dwarf_get_fission_addition_die(Dwarf_Die die, int dw_sect_index, 817*4d9fdb46SRobert Mustacchi Dwarf_Unsigned* offset, Dwarf_Unsigned*size, 818*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 819*4d9fdb46SRobert Mustacchi 820*4d9fdb46SRobert Mustacchi int _dwarf_get_addr_index_itself(int theform, 821*4d9fdb46SRobert Mustacchi Dwarf_Small *info_ptr, 822*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg, 823*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context, 824*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *val_out, 825*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 826*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_addr_form_is_indexed(int form); 827*4d9fdb46SRobert Mustacchi 828*4d9fdb46SRobert Mustacchi int 829*4d9fdb46SRobert Mustacchi _dwarf_search_for_signature(Dwarf_Debug dbg, 830*4d9fdb46SRobert Mustacchi Dwarf_Sig8 sig, 831*4d9fdb46SRobert Mustacchi Dwarf_CU_Context *context_out, 832*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 833*4d9fdb46SRobert Mustacchi 834*4d9fdb46SRobert Mustacchi 835*4d9fdb46SRobert Mustacchi void _dwarf_tied_destroy_free_node(void *node); 836*4d9fdb46SRobert Mustacchi void _dwarf_destroy_group_map(Dwarf_Debug dbg); 837*4d9fdb46SRobert Mustacchi 838*4d9fdb46SRobert Mustacchi int _dwarf_section_get_target_group(Dwarf_Debug dbg, 839*4d9fdb46SRobert Mustacchi unsigned obj_section_index, 840*4d9fdb46SRobert Mustacchi unsigned * groupnumber, 841*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 842*4d9fdb46SRobert Mustacchi 843*4d9fdb46SRobert Mustacchi int _dwarf_dwo_groupnumber_given_name( 844*4d9fdb46SRobert Mustacchi const char *name, 845*4d9fdb46SRobert Mustacchi unsigned *grpnum_out); 846*4d9fdb46SRobert Mustacchi 847*4d9fdb46SRobert Mustacchi int _dwarf_section_get_target_group_from_map(Dwarf_Debug dbg, 848*4d9fdb46SRobert Mustacchi unsigned obj_section_index, 849*4d9fdb46SRobert Mustacchi unsigned * groupnumber_out, 850*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Error * error); 851*4d9fdb46SRobert Mustacchi 852*4d9fdb46SRobert Mustacchi int _dwarf_insert_in_group_map(Dwarf_Debug dbg, 853*4d9fdb46SRobert Mustacchi unsigned groupnum, 854*4d9fdb46SRobert Mustacchi unsigned section_index, 855*4d9fdb46SRobert Mustacchi const char *name, 856*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 857*4d9fdb46SRobert Mustacchi 858*4d9fdb46SRobert Mustacchi /* returns TRUE/FALSE: meaning this section name is in 859*4d9fdb46SRobert Mustacchi map for this groupnum or not.*/ 860*4d9fdb46SRobert Mustacchi int _dwarf_section_in_group_by_name(Dwarf_Debug dbg, 861*4d9fdb46SRobert Mustacchi const char * scn_name, 862*4d9fdb46SRobert Mustacchi unsigned groupnum); 863*4d9fdb46SRobert Mustacchi 864*4d9fdb46SRobert Mustacchi int 865*4d9fdb46SRobert Mustacchi _dwarf_next_cu_header_internal(Dwarf_Debug dbg, 866*4d9fdb46SRobert Mustacchi Dwarf_Bool is_info, 867*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * cu_header_length, 868*4d9fdb46SRobert Mustacchi Dwarf_Half * version_stamp, 869*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * abbrev_offset, 870*4d9fdb46SRobert Mustacchi Dwarf_Half * address_size, 871*4d9fdb46SRobert Mustacchi Dwarf_Half * offset_size, 872*4d9fdb46SRobert Mustacchi Dwarf_Half * extension_size, 873*4d9fdb46SRobert Mustacchi Dwarf_Sig8 * signature, 874*4d9fdb46SRobert Mustacchi Dwarf_Bool * has_signature, 875*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *typeoffset, 876*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * next_cu_offset, 877*4d9fdb46SRobert Mustacchi Dwarf_Half * header_cu_type, 878*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 879*4d9fdb46SRobert Mustacchi 880*4d9fdb46SRobert Mustacchi /* Relates to .debug_addr */ 881*4d9fdb46SRobert Mustacchi int _dwarf_look_in_local_and_tied(Dwarf_Half attr_form, 882*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context, 883*4d9fdb46SRobert Mustacchi Dwarf_Small *info_ptr, 884*4d9fdb46SRobert Mustacchi Dwarf_Addr *return_addr, 885*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 886*4d9fdb46SRobert Mustacchi 887*4d9fdb46SRobert Mustacchi int _dwarf_get_ranges_base_attr_from_tied(Dwarf_Debug dbg, 888*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context, 889*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * ranges_base_out, 890*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * addr_base_out, 891*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 892*4d9fdb46SRobert Mustacchi 893*4d9fdb46SRobert Mustacchi int _dwarf_get_string_from_tied(Dwarf_Debug dbg, Dwarf_Unsigned offset, 894*4d9fdb46SRobert Mustacchi char **return_str, Dwarf_Error*error); 895*4d9fdb46SRobert Mustacchi 896*4d9fdb46SRobert Mustacchi int _dwarf_valid_form_we_know(Dwarf_Unsigned at_form, 897*4d9fdb46SRobert Mustacchi Dwarf_Unsigned at_name); 898*4d9fdb46SRobert Mustacchi int _dwarf_extract_local_debug_str_string_given_offset(Dwarf_Debug dbg, 899*4d9fdb46SRobert Mustacchi unsigned attrform, 900*4d9fdb46SRobert Mustacchi Dwarf_Unsigned offset, 901*4d9fdb46SRobert Mustacchi char ** return_str, 902*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 903*4d9fdb46SRobert Mustacchi 904*4d9fdb46SRobert Mustacchi int _dwarf_file_name_is_full_path(Dwarf_Small *fname); 905*4d9fdb46SRobert Mustacchi 906*4d9fdb46SRobert Mustacchi /* This is an elf-only extension to 907*4d9fdb46SRobert Mustacchi get SHF_COMPRESSED flag from sh_flags. 908*4d9fdb46SRobert Mustacchi if pointer not set (which is normal for non-elf objects) 909*4d9fdb46SRobert Mustacchi it is fine. */ 910*4d9fdb46SRobert Mustacchi typedef int (*_dwarf_get_elf_flags_func_ptr_type)( 911*4d9fdb46SRobert Mustacchi void* obj_in, 912*4d9fdb46SRobert Mustacchi Dwarf_Half section_index, 913*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *flags_out, 914*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *addralign_out, 915*4d9fdb46SRobert Mustacchi int *error); 916*4d9fdb46SRobert Mustacchi extern _dwarf_get_elf_flags_func_ptr_type _dwarf_get_elf_flags_func_ptr; 917*4d9fdb46SRobert Mustacchi 918*4d9fdb46SRobert Mustacchi /* This is libelf access to Elf object. */ 919*4d9fdb46SRobert Mustacchi extern int _dwarf_elf_setup(int fd, 920*4d9fdb46SRobert Mustacchi char *true_path_out_buffer, 921*4d9fdb46SRobert Mustacchi unsigned ftype, 922*4d9fdb46SRobert Mustacchi unsigned endian, 923*4d9fdb46SRobert Mustacchi unsigned offsetsize, 924*4d9fdb46SRobert Mustacchi size_t filesize, 925*4d9fdb46SRobert Mustacchi Dwarf_Unsigned access, 926*4d9fdb46SRobert Mustacchi unsigned groupnumber, 927*4d9fdb46SRobert Mustacchi Dwarf_Handler errhand, 928*4d9fdb46SRobert Mustacchi Dwarf_Ptr errarg, 929*4d9fdb46SRobert Mustacchi Dwarf_Debug *dbg,Dwarf_Error *error); 930*4d9fdb46SRobert Mustacchi 931*4d9fdb46SRobert Mustacchi /* This is non-libelf Elf access */ 932*4d9fdb46SRobert Mustacchi extern int 933*4d9fdb46SRobert Mustacchi _dwarf_elf_nlsetup(int fd, 934*4d9fdb46SRobert Mustacchi char *true_path, 935*4d9fdb46SRobert Mustacchi unsigned ftype, 936*4d9fdb46SRobert Mustacchi unsigned endian, 937*4d9fdb46SRobert Mustacchi unsigned offsetsize, 938*4d9fdb46SRobert Mustacchi size_t filesize, 939*4d9fdb46SRobert Mustacchi Dwarf_Unsigned access, 940*4d9fdb46SRobert Mustacchi unsigned groupnumber, 941*4d9fdb46SRobert Mustacchi Dwarf_Handler errhand, 942*4d9fdb46SRobert Mustacchi Dwarf_Ptr errarg, 943*4d9fdb46SRobert Mustacchi Dwarf_Debug *dbg,Dwarf_Error *error); 944*4d9fdb46SRobert Mustacchi void _dwarf_destruct_elf_nlaccess(struct Dwarf_Obj_Access_Interface_s *aip); 945*4d9fdb46SRobert Mustacchi 946*4d9fdb46SRobert Mustacchi extern int _dwarf_macho_setup(int fd, 947*4d9fdb46SRobert Mustacchi char *true_path, 948*4d9fdb46SRobert Mustacchi unsigned ftype, 949*4d9fdb46SRobert Mustacchi unsigned endian, 950*4d9fdb46SRobert Mustacchi unsigned offsetsize, 951*4d9fdb46SRobert Mustacchi size_t filesize, 952*4d9fdb46SRobert Mustacchi Dwarf_Unsigned access, 953*4d9fdb46SRobert Mustacchi unsigned groupnumber, 954*4d9fdb46SRobert Mustacchi Dwarf_Handler errhand, 955*4d9fdb46SRobert Mustacchi Dwarf_Ptr errarg, 956*4d9fdb46SRobert Mustacchi Dwarf_Debug *dbg,Dwarf_Error *error); 957*4d9fdb46SRobert Mustacchi void _dwarf_destruct_macho_access(struct Dwarf_Obj_Access_Interface_s *aip); 958*4d9fdb46SRobert Mustacchi 959*4d9fdb46SRobert Mustacchi extern int _dwarf_pe_setup(int fd, 960*4d9fdb46SRobert Mustacchi char *path, 961*4d9fdb46SRobert Mustacchi unsigned ftype, 962*4d9fdb46SRobert Mustacchi unsigned endian, 963*4d9fdb46SRobert Mustacchi unsigned offsetsize, 964*4d9fdb46SRobert Mustacchi size_t filesize, 965*4d9fdb46SRobert Mustacchi Dwarf_Unsigned access, 966*4d9fdb46SRobert Mustacchi unsigned groupnumber, 967*4d9fdb46SRobert Mustacchi Dwarf_Handler errhand, 968*4d9fdb46SRobert Mustacchi Dwarf_Ptr errarg, 969*4d9fdb46SRobert Mustacchi Dwarf_Debug *dbg,Dwarf_Error *error); 970*4d9fdb46SRobert Mustacchi void _dwarf_destruct_pe_access(struct Dwarf_Obj_Access_Interface_s *aip); 971*4d9fdb46SRobert Mustacchi 972*4d9fdb46SRobert Mustacchi void _dwarf_create_address_size_dwarf_error(Dwarf_Debug dbg, 973*4d9fdb46SRobert Mustacchi Dwarf_Error *error, 974*4d9fdb46SRobert Mustacchi Dwarf_Unsigned addrsize, 975*4d9fdb46SRobert Mustacchi int errcode,const char *errname); 976*4d9fdb46SRobert Mustacchi 977*4d9fdb46SRobert Mustacchi 978*4d9fdb46SRobert Mustacchi extern Dwarf_Bool _dwarf_allow_formudata(unsigned form); 979*4d9fdb46SRobert Mustacchi extern int _dwarf_formudata_internal(Dwarf_Debug dbg, 980*4d9fdb46SRobert Mustacchi unsigned form, 981*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr data, 982*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr section_end, 983*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *return_uval, 984*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *bytes_read, 985*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 986*4d9fdb46SRobert Mustacchi 987*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_info_section_start_ptr(Dwarf_CU_Context context, Dwarf_Unsigned *section_len_out); 988*4d9fdb46SRobert Mustacchi 989*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_info_section_end_ptr(Dwarf_CU_Context context); 990*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_abbrev_section_end_ptr(Dwarf_CU_Context context); 991*4d9fdb46SRobert Mustacchi 992*4d9fdb46SRobert Mustacchi int _dwarf_formblock_internal(Dwarf_Debug dbg, 993*4d9fdb46SRobert Mustacchi Dwarf_Attribute attr, 994*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context, 995*4d9fdb46SRobert Mustacchi Dwarf_Block * return_block, 996*4d9fdb46SRobert Mustacchi Dwarf_Error * error); 997*4d9fdb46SRobert Mustacchi 998*4d9fdb46SRobert Mustacchi int _dwarf_extract_data16(Dwarf_Debug dbg, 999*4d9fdb46SRobert Mustacchi Dwarf_Small *data, 1000*4d9fdb46SRobert Mustacchi Dwarf_Small *section_start, 1001*4d9fdb46SRobert Mustacchi Dwarf_Small *section_end, 1002*4d9fdb46SRobert Mustacchi Dwarf_Form_Data16 * returned_val, 1003*4d9fdb46SRobert Mustacchi Dwarf_Error *error); 1004*4d9fdb46SRobert Mustacchi 1005*4d9fdb46SRobert Mustacchi 1006*4d9fdb46SRobert Mustacchi void _dwarf_dumpsig(const char *msg, Dwarf_Sig8 *sig,int lineno); 1007