2005-11-03 Daniel Jacobowitz <dan@codesourcery.com>

Checked in by Elena Zannoni  <ezannoni@redhat.com>

       * elfread.c (elf_symtab_read): Add number_of_symbols and
       symbol_table as arguments.  Do not load the symbol table
       here.
       (elf_symfile_read): Load the static and dynamic symbol tables
       here, before calling elf_symtab_read.  Also load any synthetic
       symbols and process those.
This commit is contained in:
Elena Zannoni 2005-11-04 02:44:25 +00:00
parent 23572ecadc
commit 6255354386
2 changed files with 78 additions and 38 deletions

View File

@ -1,3 +1,14 @@
2005-11-03 Daniel Jacobowitz <dan@codesourcery.com>
Checked in by Elena Zannoni <ezannoni@redhat.com>
* elfread.c (elf_symtab_read): Add number_of_symbols and
symbol_table as arguments. Do not load the symbol table
here.
(elf_symfile_read): Load the static and dynamic symbol tables
here, before calling elf_symtab_read. Also load any synthetic
symbols and process those.
2005-11-03 Andrew Cagney <cagney@gnu.org>
Checked in by Elena Zannoni <ezannoni@redhat.com>

View File

@ -124,13 +124,14 @@ record_minimal_symbol (char *name, CORE_ADDR address,
SYNOPSIS
void elf_symtab_read (struct objfile *objfile, int dynamic)
void elf_symtab_read (struct objfile *objfile, int dynamic,
long number_of_symbols, asymbol **symbol_table)
DESCRIPTION
Given an objfile and a flag that specifies whether or not the objfile
is for an executable or not (may be shared library for example), add
all the global function and data symbols to the minimal symbol table.
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.
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
@ -141,14 +142,12 @@ record_minimal_symbol (char *name, CORE_ADDR address,
*/
static void
elf_symtab_read (struct objfile *objfile, int dynamic)
elf_symtab_read (struct objfile *objfile, int dynamic,
long number_of_symbols, asymbol **symbol_table)
{
long storage_needed;
asymbol *sym;
asymbol **symbol_table;
long number_of_symbols;
long i;
struct cleanup *back_to;
CORE_ADDR symaddr;
CORE_ADDR offset;
enum minimal_symbol_type ms_type;
@ -165,34 +164,8 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
int stripped = (bfd_get_symcount (objfile->obfd) == 0);
if (dynamic)
if (1)
{
storage_needed = bfd_get_dynamic_symtab_upper_bound (objfile->obfd);
/* Nothing to be done if there is no dynamic symtab. */
if (storage_needed < 0)
return;
}
else
{
storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
if (storage_needed < 0)
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
}
if (storage_needed > 0)
{
symbol_table = (asymbol **) xmalloc (storage_needed);
back_to = make_cleanup (xfree, symbol_table);
if (dynamic)
number_of_symbols = bfd_canonicalize_dynamic_symtab (objfile->obfd,
symbol_table);
else
number_of_symbols = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
if (number_of_symbols < 0)
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
for (i = 0; i < number_of_symbols; i++)
{
sym = symbol_table[i];
@ -450,7 +423,6 @@ elf_symtab_read (struct objfile *objfile, int dynamic)
ELF_MAKE_MSYMBOL_SPECIAL (sym, msym);
}
}
do_cleanups (back_to);
}
}
@ -493,6 +465,9 @@ elf_symfile_read (struct objfile *objfile, int mainline)
struct elfinfo ei;
struct cleanup *back_to;
CORE_ADDR offset;
long symcount = 0, dynsymcount = 0, synthcount, storage_needed;
asymbol **symbol_table = NULL, **dyn_symbol_table = NULL;
asymbol *synthsyms;
init_minimal_symbol_collection ();
back_to = make_cleanup_discard_minimal_symbols ();
@ -509,11 +484,65 @@ elf_symfile_read (struct objfile *objfile, int mainline)
chain of info into the dbx_symfile_info in objfile->deprecated_sym_stab_info,
which can later be used by elfstab_offset_sections. */
elf_symtab_read (objfile, 0);
storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
if (storage_needed < 0)
error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
bfd_errmsg (bfd_get_error ()));
if (storage_needed > 0)
{
symbol_table = (asymbol **) xmalloc (storage_needed);
make_cleanup (xfree, symbol_table);
symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
if (symcount < 0)
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);
}
/* Add the dynamic symbols. */
elf_symtab_read (objfile, 1);
storage_needed = bfd_get_dynamic_symtab_upper_bound (objfile->obfd);
if (storage_needed > 0)
{
dyn_symbol_table = (asymbol **) xmalloc (storage_needed);
make_cleanup (xfree, dyn_symbol_table);
dynsymcount = bfd_canonicalize_dynamic_symtab (objfile->obfd,
dyn_symbol_table);
if (dynsymcount < 0)
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);
}
/* Add synthetic symbols - for instance, names for any PLT entries. */
synthcount = bfd_get_synthetic_symtab (abfd, symcount, symbol_table,
dynsymcount, dyn_symbol_table,
&synthsyms);
if (synthcount > 0)
{
asymbol **synth_symbol_table;
long i;
make_cleanup (xfree, synthsyms);
synth_symbol_table = xmalloc (sizeof (asymbol *) * synthcount);
for (i = 0; i < synthcount; i++)
{
synth_symbol_table[i] = synthsyms + i;
/* Synthetic symbols are not, strictly speaking, either local
or global. But we can treat them as global symbols, since
they are effectively dynamic symbols. */
synth_symbol_table[i]->flags |= BSF_GLOBAL;
}
make_cleanup (xfree, synth_symbol_table);
elf_symtab_read (objfile, 0, synthcount, synth_symbol_table);
}
/* Install any minimal symbols that have been collected as the current
minimal symbols for this objfile. The debug readers below this point