mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
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:
parent
4f4c5f80c7
commit
6f610d0772
@ -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
|
||||
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
@ -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 ...
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user