From 62553543860ea1239b565621313768f6736c0fdb Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Fri, 4 Nov 2005 02:44:25 +0000 Subject: 2005-11-03 Daniel Jacobowitz Checked in by Elena Zannoni * 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. --- gdb/ChangeLog | 11 ++++++ gdb/elfread.c | 105 +++++++++++++++++++++++++++++++++++++--------------------- 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 + + Checked in by Elena Zannoni + + * 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 Checked in by Elena Zannoni 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 -- cgit v1.1