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
#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;
}
return prim_record_minimal_symbol_and_info
- (name, address, ms_type, info, section, objfile);
+ (name, address, ms_type, info, section, bfd_section, objfile);
}
/*
/* 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);
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;
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)
{
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;
+#endif
+#ifdef SYMBOL_IS_SPECIAL
+ if (SYMBOL_IS_SPECIAL (sym))
+ MAKE_MSYMBOL_SPECIAL (msym);
#endif
}
}
elf_symtab_read (abfd, offset, objfile, 1);
/* Now process debugging information, which is contained in
- special ELF sections. We first have to find them... */
+ special ELF sections. */
- bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
- if (dwarf2_has_info (abfd) && !offset)
+ /* If we are reinitializing, or if we have never loaded syms yet,
+ set table to empty. MAINLINE is cleared so that *_read_psymtab
+ functions do not all also re-initialize the psymbol table. */
+ if (mainline)
{
- /* DWARF 2 sections */
- dwarf2_build_psymtabs (objfile, section_offsets, mainline);
+ init_psymbol_list (objfile, 0);
+ mainline = 0;
}
- else if (ei.dboffset && ei.lnoffset)
+
+ /* We first have to find them... */
+ bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
+
+ /* ELF debugging information is inserted into the psymtab in the
+ order of least informative first - most informative last. Since
+ the psymtab table is searched `most recent insertion first' this
+ increases the probability that more detailed debug information
+ for a section is found.
+
+ For instance, an object file might contain both .mdebug (XCOFF)
+ and .debug_info (DWARF2) sections then .mdebug is inserted first
+ (searched last) and DWARF2 is inserted last (searched first). If
+ we don't do this then the XCOFF info is found first - for code in
+ an included file XCOFF info is useless. */
+
+ if (ei.mdebugsect)
{
- /* DWARF sections */
- dwarf_build_psymtabs (objfile,
- section_offsets, mainline,
- ei.dboffset, ei.dbsize,
- ei.lnoffset, ei.lnsize);
+ const struct ecoff_debug_swap *swap;
+
+ /* .mdebug section, presumably holding ECOFF debugging
+ information. */
+ swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
+ if (swap)
+ elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect,
+ section_offsets);
}
if (ei.stabsect)
{
str_sect->filepos,
bfd_section_size (abfd, str_sect));
}
- if (ei.mdebugsect)
+ if (dwarf2_has_info (abfd))
{
- const struct ecoff_debug_swap *swap;
-
- /* .mdebug section, presumably holding ECOFF debugging
- information. */
- swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
- if (swap)
- elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect,
- section_offsets);
+ /* DWARF 2 sections */
+ dwarf2_build_psymtabs (objfile, section_offsets, mainline);
+ }
+ else if (ei.dboffset && ei.lnoffset)
+ {
+ /* DWARF sections */
+ dwarf_build_psymtabs (objfile,
+ section_offsets, mainline,
+ ei.dboffset, ei.dbsize,
+ ei.lnoffset, ei.lnsize);
}
/* Install any minimal symbols that have been collected as the current
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;
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;