From 6f610d0772c18436d067ee2ba88d8c73559124c0 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Thu, 15 Nov 2007 23:48:00 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf64-ppc.c | 6 ++++++ gdb/ChangeLog | 8 ++++++++ gdb/elfread.c | 46 +++++++++++++++++++++++++++++++++------------- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a5b79ed786e..09a7e80a412 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2007-11-16 Ulrich Weigand + + * 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 PR 5328 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 6d18fbca761..bbb75e83e24 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 a88d2bdcbff..7e596865a6a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2007-11-16 Ulrich Weigand + + * 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 * buildsym.h (subfiles): Move ... diff --git a/gdb/elfread.c b/gdb/elfread.c index 26ee99e4701..efbf603955a 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 -- 2.30.2