X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcoffread.c;h=8df12cbf042f1d3a97eafcc97998604877462210;hb=4d663531f209bcbd7209ef2f1a02e0b0d4e7385a;hp=b5ad8c22eb0fd6b231c212580ff6aac32d5e2817;hpb=e623cf5da2730784a9062aa7ac9d6c2db37c061d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/coffread.c b/gdb/coffread.c index b5ad8c22eb..8df12cbf04 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -1,5 +1,5 @@ /* Read coff symbol tables and convert to internal format, for GDB. - Copyright (C) 1987-2013 Free Software Foundation, Inc. + Copyright (C) 1987-2014 Free Software Foundation, Inc. Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu). This file is part of GDB. @@ -25,8 +25,6 @@ #include "bfd.h" #include "gdb_obstack.h" - -#include "gdb_string.h" #include #include "coff/internal.h" /* Internal format of COFF symbols in BFD */ @@ -37,7 +35,6 @@ #include "stabsread.h" #include "complaints.h" #include "target.h" -#include "gdb_assert.h" #include "block.h" #include "dictionary.h" @@ -146,6 +143,19 @@ struct coff_symbol unsigned int c_type; }; +/* Vector of types defined so far, indexed by their type numbers. */ + +static struct type **type_vector; + +/* Number of elements allocated for type_vector currently. */ + +static int type_vector_length; + +/* Initial size of type vector. Is realloc'd larger if needed, and + realloc'd down to the size actually used, when completed. */ + +#define INITIAL_TYPE_VECTOR_LENGTH 160 + extern void stabsread_clear_cache (void); static struct type *coff_read_struct_type (int, int, int, @@ -297,7 +307,7 @@ cs_to_section (struct coff_symbol *cs, struct objfile *objfile) if (sect == NULL) return SECT_OFF_TEXT (objfile); - return sect->index; + return gdb_bfd_section_index (objfile->obfd, sect); } /* Return the address of the section of a COFF symbol. */ @@ -372,9 +382,9 @@ coff_alloc_type (int index) it indicates the start of data for one original source file. */ static void -coff_start_symtab (const char *name) +coff_start_symtab (struct objfile *objfile, const char *name) { - start_symtab ( + start_symtab (objfile, /* We fill in the filename later. start_symtab puts this pointer into last_source_file and we put it in subfiles->name, which end_symtab frees; that's why it must be malloc'd. */ @@ -411,8 +421,7 @@ coff_end_symtab (struct objfile *objfile) { last_source_start_addr = current_source_start_addr; - end_symtab (current_source_end_addr, objfile, - SECT_OFF_TEXT (objfile)); + end_symtab (current_source_end_addr, SECT_OFF_TEXT (objfile)); /* Reinitialize for beginning of new file. */ set_last_source_file (NULL); @@ -456,8 +465,6 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address, enum minimal_symbol_type type, int section, struct objfile *objfile) { - struct bfd_section *bfd_section; - /* We don't want TDESC entry points in the minimal symbol table. */ if (cs->c_name[0] == '@') return NULL; @@ -472,10 +479,8 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address, return NULL; } - bfd_section = cs_to_bfd_section (cs, objfile); return prim_record_minimal_symbol_and_info (cs->c_name, address, - type, section, - bfd_section, objfile); + type, section, objfile); } /* coff_symfile_init () @@ -654,6 +659,36 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) install_minimal_symbols (objfile); + if (pe_file) + { + struct minimal_symbol *msym; + + ALL_OBJFILE_MSYMBOLS (objfile, msym) + { + const char *name = MSYMBOL_LINKAGE_NAME (msym); + + /* If the minimal symbols whose name are prefixed by "__imp_" + or "_imp_", get rid of the prefix, and search the minimal + symbol in OBJFILE. Note that 'maintenance print msymbols' + shows that type of these "_imp_XXXX" symbols is mst_data. */ + if (MSYMBOL_TYPE (msym) == mst_data + && (strncmp (name, "__imp_", 6) == 0 + || strncmp (name, "_imp_", 5) == 0)) + { + const char *name1 = (name[1] == '_' ? &name[7] : &name[6]); + struct bound_minimal_symbol found; + + found = lookup_minimal_symbol (name1, NULL, objfile); + /* If found, there are symbols named "_imp_foo" and "foo" + respectively in OBJFILE. Set the type of symbol "foo" + as 'mst_solib_trampoline'. */ + if (found.minsym != NULL + && MSYMBOL_TYPE (found.minsym) == mst_text) + MSYMBOL_TYPE (found.minsym) = mst_solib_trampoline; + } + } + } + /* Free the installed minimal symbol data. */ do_cleanups (cleanup_minimal_symbols); @@ -700,7 +735,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) bfd *abfd = symfile_bfd_open (debugfile); make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, symfile_flags, objfile); + symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); } } @@ -781,7 +816,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, /* Position to read the symbol table. */ val = bfd_seek (objfile->obfd, (long) symtab_offset, 0); if (val < 0) - perror_with_name (objfile->name); + perror_with_name (objfile_name (objfile)); coffread_objfile = objfile; nlist_bfd_global = objfile->obfd; @@ -791,12 +826,12 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, if (type_vector) /* Get rid of previous one. */ xfree (type_vector); - type_vector_length = 160; + type_vector_length = INITIAL_TYPE_VECTOR_LENGTH; type_vector = (struct type **) xmalloc (type_vector_length * sizeof (struct type *)); memset (type_vector, 0, type_vector_length * sizeof (struct type *)); - coff_start_symtab (""); + coff_start_symtab (objfile, ""); symnum = 0; while (symnum < nsyms) @@ -810,7 +845,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, if (get_last_source_file ()) coff_end_symtab (objfile); - coff_start_symtab ("_globals_"); + coff_start_symtab (objfile, "_globals_"); /* coff_start_symtab will set the language of this symtab to language_unknown, since such a ``file name'' is not recognized. Override that with the minimal language to @@ -834,8 +869,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, minsyms. */ int section = cs_to_section (cs, objfile); - tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + tmpaddr = cs->c_value; record_minimal_symbol (cs, tmpaddr, mst_text, section, objfile); @@ -875,7 +909,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, if (get_last_source_file ()) { coff_end_symtab (objfile); - coff_start_symtab (filestring); + coff_start_symtab (objfile, filestring); } in_source_file = 1; break; @@ -937,6 +971,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, enum minimal_symbol_type ms_type; int sec; + CORE_ADDR offset = 0; if (cs->c_secnum == N_UNDEF) { @@ -968,7 +1003,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, || cs->c_sclass == C_THUMBEXTFUNC || cs->c_sclass == C_THUMBEXT || (pe_file && (cs->c_sclass == C_STAT))) - tmpaddr += ANOFFSET (objfile->section_offsets, sec); + offset = ANOFFSET (objfile->section_offsets, sec); if (bfd_section->flags & SEC_CODE) { @@ -1007,7 +1042,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, sym = process_coff_symbol (cs, &main_aux, objfile); - SYMBOL_VALUE (sym) = tmpaddr; + SYMBOL_VALUE (sym) = tmpaddr + offset; SYMBOL_SECTION (sym) = sec; } } @@ -1100,9 +1135,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, fcn_cs_saved.c_value + fcn_aux_saved.x_sym.x_misc.x_fsize + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)), - objfile - ); + SECT_OFF_TEXT (objfile))); within_function = 0; } break; @@ -1142,7 +1175,7 @@ coff_symtab_read (long symtab_offset, unsigned int nsyms, SECT_OFF_TEXT (objfile)); /* Make a block for the local symbols within. */ finish_block (0, &local_symbols, new->old_blocks, - new->start_addr, tmpaddr, objfile); + new->start_addr, tmpaddr); } /* Now pop locals of block just finished. */ local_symbols = new->locals; @@ -1191,14 +1224,14 @@ read_one_sym (struct coff_symbol *cs, cs->c_symnum = symnum; bytes = bfd_bread (temp_sym, local_symesz, nlist_bfd_global); if (bytes != local_symesz) - error (_("%s: error reading symbols"), coffread_objfile->name); + error (_("%s: error reading symbols"), objfile_name (coffread_objfile)); bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym); cs->c_naux = sym->n_numaux & 0xff; if (cs->c_naux >= 1) { bytes = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global); if (bytes != local_auxesz) - error (_("%s: error reading symbols"), coffread_objfile->name); + error (_("%s: error reading symbols"), objfile_name (coffread_objfile)); bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass, 0, cs->c_naux, (char *) aux); @@ -1208,7 +1241,8 @@ read_one_sym (struct coff_symbol *cs, { bytes = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global); if (bytes != local_auxesz) - error (_("%s: error reading symbols"), coffread_objfile->name); + error (_("%s: error reading symbols"), + objfile_name (coffread_objfile)); } } cs->c_name = getsymname (sym); @@ -1586,7 +1620,8 @@ process_coff_symbol (struct coff_symbol *cs, name = cs->c_name; name = EXTERNAL_NAME (name, objfile->obfd); - SYMBOL_SET_LANGUAGE (sym, current_subfile->language); + SYMBOL_SET_LANGUAGE (sym, current_subfile->language, + &objfile->objfile_obstack); SYMBOL_SET_NAMES (sym, name, strlen (name), 1, objfile); /* default assumptions */ @@ -1801,9 +1836,9 @@ decode_type (struct coff_symbol *cs, unsigned int c_type, base_type = decode_type (cs, new_c_type, aux, objfile); index_type = objfile_type (objfile)->builtin_int; - range_type = - create_range_type ((struct type *) NULL, - index_type, 0, n - 1); + range_type + = create_static_range_type ((struct type *) NULL, + index_type, 0, n - 1); type = create_array_type ((struct type *) NULL, base_type, range_type); @@ -2210,7 +2245,6 @@ coff_read_enum_type (int index, int length, int lastsym, static const struct sym_fns coff_sym_fns = { - bfd_target_coff_flavour, coff_new_init, /* sym_new_init: init anything gbl to entire symtab */ coff_symfile_init, /* sym_init: read initial info, setup @@ -2243,7 +2277,7 @@ coff_free_info (struct objfile *objfile, void *arg) void _initialize_coffread (void) { - add_symtab_fns (&coff_sym_fns); + add_symtab_fns (bfd_target_coff_flavour, &coff_sym_fns); coff_objfile_data_key = register_objfile_data_with_cleanup (NULL, coff_free_info);