2005-11-03 Daniel Jacobowitz <dan@codesourcery.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 4 Nov 2005 02:44:25 +0000 (02:44 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Fri, 4 Nov 2005 02:44:25 +0000 (02:44 +0000)
        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.

gdb/ChangeLog
gdb/elfread.c

index 30d0abe55f6ca966fb3ec9179f912b62513199b2..6677156c330dfde60f7ec36aef3041ef0f341fd2 100644 (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>
index 70a825fb42f88f0cdcd45ad11e7740a92c3c847a..057af425e916834271cc8e996a8031ec34c69d4c 100644 (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)
-    {
-      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