X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcoffread.c;h=573306d6e0a09cb16f078f9a39ebaea289ba880b;hb=4c2acfeafe154bef75318a35c1112433d8717cb5;hp=bd18b4acb0742d38b6cbfedd5ba41552fa963f09;hpb=261397f84f0369d189de8ddf4c331f282a59ed89;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/coffread.c b/gdb/coffread.c index bd18b4acb0..573306d6e0 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -28,7 +28,7 @@ #include "breakpoint.h" #include "bfd.h" -#include "obstack.h" +#include "gdb_obstack.h" #include "gdb_string.h" #include @@ -122,41 +122,6 @@ static int pe_file; static struct symbol *opaque_type_chain[HASHSIZE]; -/* Complaints about various problems in the file being read */ - -struct complaint ef_complaint = -{"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0}; - -struct complaint ef_stack_complaint = -{"`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d", 0, 0}; - -struct complaint eb_stack_complaint = -{"`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d", 0, 0}; - -struct complaint bf_no_aux_complaint = -{"`.bf' symbol %d has no aux entry", 0, 0}; - -struct complaint ef_no_aux_complaint = -{"`.ef' symbol %d has no aux entry", 0, 0}; - -struct complaint lineno_complaint = -{"Line number pointer %d lower than start of line numbers", 0, 0}; - -struct complaint unexpected_type_complaint = -{"Unexpected type for symbol %s", 0, 0}; - -struct complaint bad_sclass_complaint = -{"Bad n_sclass for symbol %s", 0, 0}; - -struct complaint misordered_blocks_complaint = -{"Blocks out of order at address %x", 0, 0}; - -struct complaint tagndx_bad_complaint = -{"Symbol table entry for %s has bad tagndx value", 0, 0}; - -struct complaint eb_complaint = -{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0}; - /* Simplified internal version of coff symbol table information */ struct coff_symbol @@ -593,16 +558,34 @@ coff_symfile_read (struct objfile *objfile, int mainline) /* End of warning */ - /* Read the line number table, all at once. */ info->min_lineno_offset = 0; info->max_lineno_offset = 0; - bfd_map_over_sections (abfd, find_linenos, (void *) info); - make_cleanup (free_linetab_cleanup, 0 /*ignore*/); - val = init_lineno (abfd, info->min_lineno_offset, - info->max_lineno_offset - info->min_lineno_offset); - if (val < 0) - error ("\"%s\": error reading line numbers\n", name); + /* Only read line number information if we have symbols. + + On Windows NT, some of the system's DLL's have sections with + PointerToLinenumbers fields that are non-zero, but point at + random places within the image file. (In the case I found, + KERNEL32.DLL's .text section has a line number info pointer that + points into the middle of the string `lib\\i386\kernel32.dll'.) + + However, these DLL's also have no symbols. The line number + tables are meaningless without symbols. And in fact, GDB never + uses the line number information unless there are symbols. So we + can avoid spurious error messages (and maybe run a little + faster!) by not even reading the line number table unless we have + symbols. */ + if (num_symbols > 0) + { + /* Read the line number table, all at once. */ + bfd_map_over_sections (abfd, find_linenos, (void *) info); + + make_cleanup (free_linetab_cleanup, 0 /*ignore*/); + val = init_lineno (abfd, info->min_lineno_offset, + info->max_lineno_offset - info->min_lineno_offset); + if (val < 0) + error ("\"%s\": error reading line numbers\n", name); + } /* Now read the string table, all at once. */ @@ -803,7 +786,8 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, case C_LINE: case C_ALIAS: case C_HIDDEN: - complain (&bad_sclass_complaint, cs->c_name); + complaint (&symfile_complaints, "Bad n_sclass for symbol %s", + cs->c_name); break; case C_FILE: @@ -969,7 +953,8 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, /* main_aux.x_sym.x_misc.x_lnsz.x_lnno contains line number of '{' } */ if (cs->c_naux != 1) - complain (&bf_no_aux_complaint, cs->c_symnum); + complaint (&symfile_complaints, + "`.bf' symbol %d has no aux entry", cs->c_symnum); fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno; fcn_first_line_addr = cs->c_value; @@ -993,7 +978,9 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, if (context_stack_depth <= 0) { /* We attempted to pop an empty context stack */ - complain (&ef_stack_complaint, cs->c_symnum); + complaint (&symfile_complaints, + "`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d", + cs->c_symnum); within_function = 0; break; } @@ -1002,13 +989,16 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, /* Stack must be empty now. */ if (context_stack_depth > 0 || new == NULL) { - complain (&ef_complaint, cs->c_symnum); + complaint (&symfile_complaints, + "Unmatched .ef symbol(s) ignored starting at symnum %d", + cs->c_symnum); within_function = 0; break; } if (cs->c_naux != 1) { - complain (&ef_no_aux_complaint, cs->c_symnum); + complaint (&symfile_complaints, + "`.ef' symbol %d has no aux entry", cs->c_symnum); fcn_last_line = 0x7FFFFFFF; } else @@ -1063,14 +1053,18 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, { if (context_stack_depth <= 0) { /* We attempted to pop an empty context stack */ - complain (&eb_stack_complaint, cs->c_symnum); + complaint (&symfile_complaints, + "`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d", + cs->c_symnum); break; } new = pop_context (); if (depth-- != new->depth) { - complain (&eb_complaint, symnum); + complaint (&symfile_complaints, + "Mismatched .eb symbol ignored starting at symnum %d", + symnum); break; } if (local_symbols && context_stack_depth > 0) @@ -1349,7 +1343,9 @@ enter_linenos (long file_offset, register int first_line, return; if (file_offset < linetab_offset) { - complain (&lineno_complaint, file_offset); + complaint (&symfile_complaints, + "Line number pointer %ld lower than start of line numbers", + file_offset); if (file_offset > linetab_size) /* Too big to be an offset? */ return; file_offset += linetab_offset; /* Try reading at that linetab offset */ @@ -1754,7 +1750,9 @@ decode_type (register struct coff_symbol *cs, unsigned int c_type, } else { - complain (&tagndx_bad_complaint, cs->c_name); + complaint (&symfile_complaints, + "Symbol table entry for %s has bad tagndx value", + cs->c_name); /* And fall through to decode_base_type... */ } } @@ -1920,7 +1918,7 @@ decode_base_type (register struct coff_symbol *cs, unsigned int c_type, else return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG); } - complain (&unexpected_type_complaint, cs->c_name); + complaint (&symfile_complaints, "Unexpected type for symbol %s", cs->c_name); return lookup_fundamental_type (current_objfile, FT_VOID); } @@ -1979,6 +1977,7 @@ coff_read_struct_type (int index, int length, int lastsym) FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux); FIELD_BITPOS (list->field) = 8 * ms->c_value; FIELD_BITSIZE (list->field) = 0; + FIELD_STATIC_KIND (list->field) = 0; nfields++; break; @@ -1997,6 +1996,7 @@ coff_read_struct_type (int index, int length, int lastsym) FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux); FIELD_BITPOS (list->field) = ms->c_value; FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size; + FIELD_STATIC_KIND (list->field) = 0; nfields++; break; @@ -2117,6 +2117,7 @@ coff_read_enum_type (int index, int length, int lastsym) if (SYMBOL_VALUE (xsym) < 0) unsigned_enum = 0; TYPE_FIELD_BITSIZE (type, n) = 0; + TYPE_FIELD_STATIC_KIND (type, n) = 0; } if (syms == osyms) break;