diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/elfread.c | 19 | ||||
-rw-r--r-- | gdb/ppc-linux-tdep.c | 3 | ||||
-rw-r--r-- | gdb/ppc64-tdep.c | 15 | ||||
-rw-r--r-- | gdb/ppc64-tdep.h | 2 | ||||
-rw-r--r-- | gdb/ppcfbsd-tdep.c | 3 |
6 files changed, 38 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d853da0..322762f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2013-02-23 Alan Modra <amodra@gmail.com> + + * elfread.c (elf_symtab_read): Do not use udata.p here to find + symbol size. + * ppc64-tdep.c (ppc64_elf_make_msymbol_special): New function. + * ppc64-tdep.h (ppc64_elf_make_msymbol_special): Declare. + * ppc-linux-tdep.c (ppc_linux_init_abi): Set up to use the above. + * ppcfbsd-tdep.c (ppcfbsd_init_abi): Likewise. + 2013-02-22 Jan Kratochvil <jan.kratochvil@redhat.com> Code cleanup. diff --git a/gdb/elfread.c b/gdb/elfread.c index 4b95627..43c32b2 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -556,21 +556,14 @@ elf_symtab_read (struct objfile *objfile, int type, if (msym) { - /* Pass symbol size field in via BFD. FIXME!!! */ - 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. */ + ELF-private part. */ if (type != ST_SYNTHETIC) - elf_sym = (elf_symbol_type *) sym; - else - elf_sym = (elf_symbol_type *) sym->udata.p; - - if (elf_sym) - SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size); + { + /* Pass symbol size field in via BFD. FIXME!!! */ + elf_symbol_type *elf_sym = (elf_symbol_type *) sym; + SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size); + } msym->filename = filesymname; gdbarch_elf_make_msymbol_special (gdbarch, sym, msym); diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 7c2712d..0fc6fe0 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -1336,6 +1336,9 @@ ppc_linux_init_abi (struct gdbarch_info info, set_gdbarch_convert_from_func_ptr_addr (gdbarch, ppc64_convert_from_func_ptr_addr); + set_gdbarch_elf_make_msymbol_special (gdbarch, + ppc64_elf_make_msymbol_special); + /* Shared library handling. */ set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code); set_solib_svr4_fetch_link_map_offsets diff --git a/gdb/ppc64-tdep.c b/gdb/ppc64-tdep.c index 9c3616a..f636b4d 100644 --- a/gdb/ppc64-tdep.c +++ b/gdb/ppc64-tdep.c @@ -22,6 +22,7 @@ #include "gdbcore.h" #include "ppc-tdep.h" #include "ppc64-tdep.h" +#include "elf-bfd.h" /* Macros for matching instructions. Note that, since all the operands are masked off before they're or-ed into the instruction, @@ -361,3 +362,17 @@ ppc64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, return addr; } + +/* A synthetic 'dot' symbols on ppc64 has the udata.p entry pointing + back to the original ELF symbol it was derived from. Get the size + from that symbol. */ + +void +ppc64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym) +{ + if ((sym->flags & BSF_SYNTHETIC) != 0 && sym->udata.p != NULL) + { + elf_symbol_type *elf_sym = (elf_symbol_type *) sym->udata.p; + SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size); + } +} diff --git a/gdb/ppc64-tdep.h b/gdb/ppc64-tdep.h index c4c9d99..62900ba 100644 --- a/gdb/ppc64-tdep.h +++ b/gdb/ppc64-tdep.h @@ -31,4 +31,6 @@ extern CORE_ADDR ppc64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ); +extern void ppc64_elf_make_msymbol_special (asymbol *, + struct minimal_symbol *); #endif /* PPC64_TDEP_H */ diff --git a/gdb/ppcfbsd-tdep.c b/gdb/ppcfbsd-tdep.c index f18ed4f..f9e0434 100644 --- a/gdb/ppcfbsd-tdep.c +++ b/gdb/ppcfbsd-tdep.c @@ -325,6 +325,9 @@ ppcfbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { set_gdbarch_convert_from_func_ptr_addr (gdbarch, ppc64_convert_from_func_ptr_addr); + set_gdbarch_elf_make_msymbol_special (gdbarch, + ppc64_elf_make_msymbol_special); + set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); |