aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c6
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/elfread.c46
4 files changed, 52 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a5b79ed..09a7e80 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 6d18fbc..bbb75e8 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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++;
}
}
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a88d2bd..7e59686 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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 ...
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 26ee99e..efbf603 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -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