bfd/ChangeLog:

* 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.
This commit is contained in:
Ulrich Weigand 2007-11-15 23:48:00 +00:00
parent 4f4c5f80c7
commit 6f610d0772
4 changed files with 52 additions and 13 deletions

View 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

View 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++;
}
}

View 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 ...

View 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