aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>2005-11-04 02:44:25 +0000
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>2005-11-04 02:44:25 +0000
commit62553543860ea1239b565621313768f6736c0fdb (patch)
treec63d87a4725359a184fdf003458f3339cb9588cf
parent23572ecadc89af384c1804ad7692f32c55fbfc80 (diff)
downloadgdb-62553543860ea1239b565621313768f6736c0fdb.zip
gdb-62553543860ea1239b565621313768f6736c0fdb.tar.gz
gdb-62553543860ea1239b565621313768f6736c0fdb.tar.bz2
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.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/elfread.c105
2 files changed, 78 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 30d0abe..6677156 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 70a825f..057af42 100644
--- a/gdb/elfread.c
+++ b/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)
- {
- 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)
+ if (1)
{
- 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