static struct section_offsets *
elf_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
-static void
+static struct minimal_symbol *
record_minimal_symbol_and_info PARAMS ((char *, CORE_ADDR,
enum minimal_symbol_type, char *,
struct objfile *));
#endif
-static void
+static struct minimal_symbol *
record_minimal_symbol_and_info (name, address, ms_type, info, objfile)
char *name;
CORE_ADDR address;
}
name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
- prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
- objfile);
+ return prim_record_minimal_symbol_and_info
+ (name, address, ms_type, info, section, objfile);
}
/*
SYNOPSIS
void elf_symtab_read (bfd *abfd, CORE_ADDR addr,
- struct objfile *objfile)
+ struct objfile *objfile, int dynamic)
DESCRIPTION
/* If filesym is nonzero, it points to a file symbol, but we haven't
seen any section info for it yet. */
asymbol *filesym = 0;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ /* 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;
unsigned long size;
continue;
}
- if (sym -> section == &bfd_und_section
+ if (dynamic
+ && sym -> section == &bfd_und_section
&& (sym -> flags & BSF_FUNCTION))
{
+ struct minimal_symbol *msym;
+
/* Symbol is a reference to a function defined in
a shared library.
If its value is non zero then it is usually the address
relative to the base address.
If its value is zero then the dynamic linker has to resolve
the symbol. We are unable to find any meaningful address
- for this symbol in the executable file, so we skip it.
- Irix 5 has a zero value for all shared library functions
- in the main symbol table, but the dynamic symbol table
- provides the right values. */
+ for this symbol in the executable file, so we skip it. */
symaddr = sym -> value;
if (symaddr == 0)
continue;
symaddr += addr;
- record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
- mst_solib_trampoline, NULL,
- objfile);
+ msym = record_minimal_symbol_and_info
+ ((char *) sym -> name, symaddr,
+ mst_solib_trampoline, NULL, objfile);
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ msym->filename = filesymname;
+#endif
continue;
}
sectinfo = NULL;
}
filesym = sym;
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ filesymname =
+ obsavestring ((char *)filesym->name, strlen (filesym->name),
+ &objfile->symbol_obstack);
+#endif
}
else if (sym -> flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
{
+ struct minimal_symbol *msym;
+
/* Select global/local/weak symbols. Note that bfd puts abs
symbols in their own section, so all symbols we are
interested in will have a section. */
}
else if ((sym->name[0] == '.' && sym->name[1] == 'L')
|| ((sym -> flags & BSF_LOCAL)
- && sym->name[0] == 'L'
+ && sym->name[0] == '$'
&& sym->name[1] == 'L'))
/* Looks like a compiler-generated label. Skip it.
The assembler should be skipping these (to keep
}
/* Pass symbol size field in via BFD. FIXME!!! */
size = ((elf_symbol_type *) sym) -> internal_elf_sym.st_size;
- record_minimal_symbol_and_info ((char *) sym -> name, symaddr,
- ms_type, (PTR) size, objfile);
+ msym = record_minimal_symbol_and_info
+ ((char *) sym -> name, symaddr,
+ ms_type, (PTR) size, objfile);
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+ msym->filename = filesymname;
+#endif
}
}
do_cleanups (back_to);