bfd/ChangeLog:
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 15 Nov 2007 23:48:00 +0000 (23:48 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Thu, 15 Nov 2007 23:48:00 +0000 (23:48 +0000)
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Set udata.p of
synthetic symbol to point to the ELF symbol it was derived from.

gdb/ChangeLog:

* elfread.c (ST_REGULAR, ST_DYNAMIC, ST_SYNTHETIC): New defines.
(elf_symtab_read): Rename DYNAMIC argument to TYPE.  Do not access
ELF-private symbol data when processing synthetic symbols.  Use
udata.p to get at size of ppc64 synthetic 'dot' symbols.
(elf_symfile_read): Pass TYPE argument to elf_symtab_read.

bfd/ChangeLog
bfd/elf64-ppc.c
gdb/ChangeLog
gdb/elfread.c

index a5b79ed786ed78b1d77ba0758e09b7cd0922bf2f..09a7e80a412a3d207d8b3dca4fc00d9cbd3f77ef 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-16  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Set udata.p of
+       synthetic symbol to point to the ELF symbol it was derived from.
+
 2007-11-15  Alan Modra  <amodra@bigpond.net.au>
 
        PR 5328
index 6d18fbca76133b49dfb7de09990b9b6cdefa9b47..bbb75e83e24c5725aa4031b3316c58cb7a8d16c5 100644 (file)
@@ -2959,6 +2959,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
              len = strlen (syms[i]->name);
              memcpy (names, syms[i]->name, len + 1);
              names += len + 1;
+             /* Have udata.p point back to the original symbol this
+                synthetic symbol was derived from.  */
+             s->udata.p = syms[i];
              s++;
            }
        }
@@ -3046,6 +3049,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
              len = strlen (syms[i]->name);
              memcpy (names, syms[i]->name, len + 1);
              names += len + 1;
+             /* Have udata.p point back to the original symbol this
+                synthetic symbol was derived from.  */
+             s->udata.p = syms[i];
              s++;
            }
        }
index a88d2bdcbff75bbf75d81094173e497c6773eb73..7e596865a6aef3c957a24ef5dcad9e1c08ed4939 100644 (file)
@@ -1,3 +1,11 @@
+2007-11-16  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * elfread.c (ST_REGULAR, ST_DYNAMIC, ST_SYNTHETIC): New defines.
+       (elf_symtab_read): Rename DYNAMIC argument to TYPE.  Do not access
+       ELF-private symbol data when processing synthetic symbols.  Use
+       udata.p to get at size of ppc64 synthetic 'dot' symbols.
+       (elf_symfile_read): Pass TYPE argument to elf_symtab_read.
+
 2007-11-15  Doug Evans  <dje@google.com>
 
        * buildsym.h (subfiles): Move ...
index 26ee99e4701849c6c2635927095600203385632b..efbf603955a4c84fd8e2b14a6310f435a166e7f8 100644 (file)
@@ -180,14 +180,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 type,
                         long number_of_symbols, asymbol **symbol_table)
 
    DESCRIPTION
 
    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.
+   symbol table contains regular, dynamic, or synthetic 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
@@ -197,8 +197,12 @@ record_minimal_symbol (char *name, CORE_ADDR address,
 
  */
 
+#define ST_REGULAR 0
+#define ST_DYNAMIC 1
+#define ST_SYNTHETIC 2
+
 static void
-elf_symtab_read (struct objfile *objfile, int dynamic,
+elf_symtab_read (struct objfile *objfile, int type,
                 long number_of_symbols, asymbol **symbol_table)
 {
   long storage_needed;
@@ -235,7 +239,7 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
        continue;
 
       offset = ANOFFSET (objfile->section_offsets, sym->section->index);
-      if (dynamic
+      if (type == ST_DYNAMIC
          && sym->section == &bfd_und_section
          && (sym->flags & BSF_FUNCTION))
        {
@@ -284,7 +288,7 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
       /* If it is a nonstripped executable, do not enter dynamic
         symbols, as the dynamic symbol table is usually a subset
         of the main symbol table.  */
-      if (dynamic && !stripped)
+      if (type == ST_DYNAMIC && !stripped)
        continue;
       if (sym->flags & BSF_FILE)
        {
@@ -324,8 +328,11 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
            {
              /* This is a hack to get the minimal symbol type
                 right for Irix 5, which has absolute addresses
-                with special section indices for dynamic symbols. */
-             unsigned short shndx =
+                with special section indices for dynamic symbols.
+
+                NOTE: uweigand-20071112: Synthetic symbols do not
+                have an ELF-private part, so do not touch those.  */
+             unsigned short shndx = type == ST_SYNTHETIC ? 0 : 
                ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
 
              switch (shndx)
@@ -484,11 +491,24 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
          msym = record_minimal_symbol
            ((char *) sym->name, symaddr,
             ms_type, sym->section, objfile);
+
          if (msym)
            {
              /* Pass symbol size field in via BFD.  FIXME!!!  */
-             unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
-             MSYMBOL_SIZE(msym) = size;
+             elf_symbol_type *elf_sym;
+
+             /* NOTE: uweigand-20071112: A synthetic symbol does not have an
+                ELF-private part.  However, in some cases (e.g. synthetic
+                'dot' symbols on ppc64) the udata.p entry is set to point back
+                to the original ELF symbol it was derived from.  Get the size
+                from that symbol.  */ 
+             if (type != ST_SYNTHETIC)
+               elf_sym = (elf_symbol_type *) sym;
+             else
+               elf_sym = (elf_symbol_type *) sym->udata.p;
+
+             if (elf_sym)
+               MSYMBOL_SIZE(msym) = elf_sym->internal_elf_sym.st_size;
            }
          if (msym != NULL)
            msym->filename = filesymname;
@@ -569,7 +589,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
        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);
+      elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table);
     }
 
   /* Add the dynamic symbols.  */
@@ -587,7 +607,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
        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);
+      elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table);
     }
 
   /* Add synthetic symbols - for instance, names for any PLT entries.  */
@@ -605,7 +625,7 @@ elf_symfile_read (struct objfile *objfile, int mainline)
       for (i = 0; i < synthcount; i++)
        synth_symbol_table[i] = synthsyms + i;
       make_cleanup (xfree, synth_symbol_table);
-      elf_symtab_read (objfile, 0, synthcount, synth_symbol_table);
+      elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table);
     }
 
   /* Install any minimal symbols that have been collected as the current