X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Felfread.c;h=b96fa171b4010d4cb4f884acffecc35f09a46726;hb=008c23e8fc81e1372de0250a106d65b5e9cd2d2a;hp=8a757e4fc678528958f5fca17bcbd86a2ec5f11c;hpb=ace4b8d75a3bd81cdaf61a0fec307d631388470d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/elfread.c b/gdb/elfread.c index 8a757e4fc6..b96fa171b4 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -81,6 +81,7 @@ free_elfinfo PARAMS ((void *)); static struct minimal_symbol * record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type, char *, + asection *bfd_section, struct objfile *)); static void @@ -169,11 +170,13 @@ elf_interpreter (abfd) #endif static struct minimal_symbol * -record_minimal_symbol_and_info (name, address, ms_type, info, objfile) +record_minimal_symbol_and_info (name, address, ms_type, info, bfd_section, + objfile) char *name; CORE_ADDR address; enum minimal_symbol_type ms_type; char *info; /* FIXME, is this really char *? */ + asection *bfd_section; struct objfile *objfile; { int section; @@ -203,7 +206,7 @@ record_minimal_symbol_and_info (name, address, ms_type, info, objfile) } return prim_record_minimal_symbol_and_info - (name, address, ms_type, info, section, objfile); + (name, address, ms_type, info, section, bfd_section, objfile); } /* @@ -258,8 +261,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic) /* Name of filesym, as saved on the symbol_obstack. */ char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack); #endif - struct dbx_symfile_info *dbx = (struct dbx_symfile_info *) - objfile->sym_stab_info; + struct dbx_symfile_info *dbx = objfile->sym_stab_info; unsigned long size; int stripped = (bfd_get_symcount (abfd) == 0); @@ -320,7 +322,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic) symaddr += addr; msym = record_minimal_symbol_and_info ((char *) sym -> name, symaddr, - mst_solib_trampoline, NULL, objfile); + mst_solib_trampoline, NULL, sym -> section, objfile); #ifdef SOFUN_ADDRESS_MAYBE_MISSING if (msym != NULL) msym->filename = filesymname; @@ -389,6 +391,15 @@ elf_symtab_read (abfd, addr, objfile, dynamic) default: ms_type = mst_abs; } + + /* If it is an Irix dynamic symbol, skip section name + symbols, relocate all others. */ + if (ms_type != mst_abs) + { + if (sym->name[0] == '.') + continue; + symaddr += addr; + } } else if (sym -> section -> flags & SEC_CODE) { @@ -407,6 +418,17 @@ elf_symtab_read (abfd, addr, objfile, dynamic) should be harmless (but I encourage people to fix this in the assembler instead of adding checks here). */ continue; +#ifdef HARRIS_TARGET + else if (sym->name[0] == '.' && sym->name[1] == '.') + { + /* Looks like a Harris compiler generated label for the + purpose of marking instructions that are relevant to + DWARF dies. The assembler can't get rid of these + because they are relocatable addresses that the + linker needs to resolve. */ + continue; + } +#endif else { ms_type = mst_file_text; @@ -511,7 +533,7 @@ elf_symtab_read (abfd, addr, objfile, dynamic) size = ((elf_symbol_type *) sym) -> internal_elf_sym.st_size; msym = record_minimal_symbol_and_info ((char *) sym -> name, symaddr, - ms_type, (PTR) size, objfile); + ms_type, (PTR) size, sym -> section, objfile); #ifdef SOFUN_ADDRESS_MAYBE_MISSING if (msym != NULL) msym->filename = filesymname; @@ -592,7 +614,12 @@ elf_symfile_read (objfile, section_offsets, mainline) special ELF sections. We first have to find them... */ bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei); - if (ei.dboffset && ei.lnoffset) + if (dwarf2_has_info (abfd)) + { + /* DWARF 2 sections */ + dwarf2_build_psymtabs (objfile, section_offsets, mainline); + } + else if (ei.dboffset && ei.lnoffset) { /* DWARF sections */ dwarf_build_psymtabs (objfile, @@ -646,8 +673,7 @@ free_elfinfo (objp) PTR objp; { struct objfile *objfile = (struct objfile *)objp; - struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *) - objfile->sym_stab_info; + struct dbx_symfile_info *dbxinfo = objfile->sym_stab_info; struct stab_section_info *ssi, *nssi; ssi = dbxinfo->stab_section_info; @@ -724,8 +750,7 @@ elfstab_offset_sections (objfile, pst) struct partial_symtab *pst; { char *filename = pst->filename; - struct dbx_symfile_info *dbx = (struct dbx_symfile_info *) - objfile->sym_stab_info; + struct dbx_symfile_info *dbx = objfile->sym_stab_info; struct stab_section_info *maybe = dbx->stab_section_info; struct stab_section_info *questionable = 0; int i;