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:
parent
23572ecadc
commit
6255354386
@ -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>
|
||||
|
105
gdb/elfread.c
105
gdb/elfread.c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user