SYNOPSIS
- void elf_symtab_read (struct objfile *objfile, int dynamic,
+ void elf_symtab_read (struct objfile *objfile, int type,
long number_of_symbols, asymbol **symbol_table)
DESCRIPTION
Given an objfile, a symbol table, and a flag indicating whether the
- symbol table contains dynamic symbols, add all the global function
- and data symbols to the minimal symbol table.
+ symbol table contains regular, dynamic, or synthetic symbols, add all
+ the global function and data symbols to the minimal symbol table.
In stabs-in-ELF, as implemented by Sun, there are some local symbols
defined in the ELF symbol table, which can be used to locate
*/
+#define ST_REGULAR 0
+#define ST_DYNAMIC 1
+#define ST_SYNTHETIC 2
+
static void
-elf_symtab_read (struct objfile *objfile, int dynamic,
+elf_symtab_read (struct objfile *objfile, int type,
long number_of_symbols, asymbol **symbol_table)
{
long storage_needed;
continue;
offset = ANOFFSET (objfile->section_offsets, sym->section->index);
- if (dynamic
+ if (type == ST_DYNAMIC
&& sym->section == &bfd_und_section
&& (sym->flags & BSF_FUNCTION))
{
/* If it is a nonstripped executable, do not enter dynamic
symbols, as the dynamic symbol table is usually a subset
of the main symbol table. */
- if (dynamic && !stripped)
+ if (type == ST_DYNAMIC && !stripped)
continue;
if (sym->flags & BSF_FILE)
{
{
/* This is a hack to get the minimal symbol type
right for Irix 5, which has absolute addresses
- with special section indices for dynamic symbols. */
- unsigned short shndx =
+ with special section indices for dynamic symbols.
+
+ NOTE: uweigand-20071112: Synthetic symbols do not
+ have an ELF-private part, so do not touch those. */
+ unsigned short shndx = type == ST_SYNTHETIC ? 0 :
((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
switch (shndx)
msym = record_minimal_symbol
((char *) sym->name, symaddr,
ms_type, sym->section, objfile);
+
if (msym)
{
/* Pass symbol size field in via BFD. FIXME!!! */
- unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
- MSYMBOL_SIZE(msym) = size;
+ elf_symbol_type *elf_sym;
+
+ /* NOTE: uweigand-20071112: A synthetic symbol does not have an
+ ELF-private part. However, in some cases (e.g. synthetic
+ 'dot' symbols on ppc64) the udata.p entry is set to point back
+ to the original ELF symbol it was derived from. Get the size
+ from that symbol. */
+ if (type != ST_SYNTHETIC)
+ elf_sym = (elf_symbol_type *) sym;
+ else
+ elf_sym = (elf_symbol_type *) sym->udata.p;
+
+ if (elf_sym)
+ MSYMBOL_SIZE(msym) = elf_sym->internal_elf_sym.st_size;
}
if (msym != NULL)
msym->filename = filesymname;
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
- elf_symtab_read (objfile, 0, symcount, symbol_table);
+ elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table);
}
/* Add the dynamic symbols. */
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
- elf_symtab_read (objfile, 1, dynsymcount, dyn_symbol_table);
+ elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table);
}
/* Add synthetic symbols - for instance, names for any PLT entries. */
for (i = 0; i < synthcount; i++)
synth_symbol_table[i] = synthsyms + i;
make_cleanup (xfree, synth_symbol_table);
- elf_symtab_read (objfile, 0, synthcount, synth_symbol_table);
+ elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table);
}
/* Install any minimal symbols that have been collected as the current