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