From 63524580f8372e38a6a62fd875a4252068c31150 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 17 Apr 2011 18:38:46 +0000 Subject: [PATCH] bfd/ * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Do not check for SEC_LOAD. gdb/ Fix convert_code_addr_to_desc_addr for ppc64 files after eu-strip. * elfread.c (elf_symfile_read): New variable synth_abfd, pass it to bfd_get_synthetic_symtab. * jit.c (jit_register_code): Pass NULL to the new parameter parent. * machoread.c (macho_add_oso_symfile): Pass main_objfile to the new parameter parent, remove the call to add_separate_debug_objfile. * solib.c (solib_read_symbols): Pass NULL to the new parameter parent. * symfile-mem.c (symbol_file_add_from_memory): Likewise. * symfile.c (symbol_file_add_with_addrs_or_offsets): New parameter parent, new comment for it, call add_separate_debug_objfile for it. (symbol_file_add_separate): Pass objfile as the parameter parent, remove the call to add_separate_debug_objfile. (symbol_file_add_from_bfd): New parameter parent, pass it. (symbol_file_add): Pass NULL to the new parameter parent. * symfile.h (symbol_file_add_from_bfd): New parameter parent. gdb/testsuite/ * gdb.base/eu-strip-infcall.c: New file. * gdb.base/eu-strip-infcall.exp: New file. --- bfd/ChangeLog | 5 +++ bfd/elf64-ppc.c | 5 +-- gdb/ChangeLog | 18 +++++++++++ gdb/elfread.c | 21 ++++++++++-- gdb/jit.c | 2 +- gdb/machoread.c | 4 +-- gdb/solib.c | 3 +- gdb/symfile-mem.c | 2 +- gdb/symfile.c | 19 +++++++---- gdb/symfile.h | 2 +- gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.base/eu-strip-infcall.c | 34 +++++++++++++++++++ gdb/testsuite/gdb.base/eu-strip-infcall.exp | 36 +++++++++++++++++++++ 13 files changed, 139 insertions(+), 17 deletions(-) create mode 100644 gdb/testsuite/gdb.base/eu-strip-infcall.c create mode 100644 gdb/testsuite/gdb.base/eu-strip-infcall.exp diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8fa9ce10a9..c02b2bd388 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-04-17 Jan Kratochvil + + * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Do not check for + SEC_LOAD. + 2011-04-15 Sergio Durigan Junior * elf-bfd.h (struct sdt_note): New struct. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index eb07b1fb7c..13ae9a227c 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -3317,8 +3317,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, { if (sec->vma > ent) break; - if ((sec->flags & SEC_ALLOC) == 0 - || (sec->flags & SEC_LOAD) == 0) + /* SEC_LOAD may not be set if SEC is from a separate debug + info file. */ + if ((sec->flags & SEC_ALLOC) == 0) break; if ((sec->flags & SEC_CODE) != 0) s->section = sec; diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b44889e70d..5c06df203f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2011-04-17 Jan Kratochvil + + Fix convert_code_addr_to_desc_addr for ppc64 files after eu-strip. + * elfread.c (elf_symfile_read): New variable synth_abfd, pass it to + bfd_get_synthetic_symtab. + * jit.c (jit_register_code): Pass NULL to the new parameter parent. + * machoread.c (macho_add_oso_symfile): Pass main_objfile to the new + parameter parent, remove the call to add_separate_debug_objfile. + * solib.c (solib_read_symbols): Pass NULL to the new parameter parent. + * symfile-mem.c (symbol_file_add_from_memory): Likewise. + * symfile.c (symbol_file_add_with_addrs_or_offsets): New parameter + parent, new comment for it, call add_separate_debug_objfile for it. + (symbol_file_add_separate): Pass objfile as the parameter parent, + remove the call to add_separate_debug_objfile. + (symbol_file_add_from_bfd): New parameter parent, pass it. + (symbol_file_add): Pass NULL to the new parameter parent. + * symfile.h (symbol_file_add_from_bfd): New parameter parent. + 2011-04-17 Jan Kratochvil * elfread.c (elf_symtab_read): Do not ignore .L symbols if they are diff --git a/gdb/elfread.c b/gdb/elfread.c index 2d589a4290..f691b8f92c 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1234,7 +1234,7 @@ find_separate_debug_file_by_buildid (struct objfile *objfile) static void elf_symfile_read (struct objfile *objfile, int symfile_flags) { - bfd *abfd = objfile->obfd; + bfd *synth_abfd, *abfd = objfile->obfd; struct elfinfo ei; struct cleanup *back_to; long symcount = 0, dynsymcount = 0, synthcount, storage_needed; @@ -1305,9 +1305,26 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) elf_rel_plt_read (objfile, dyn_symbol_table); } + /* Contrary to binutils --strip-debug/--only-keep-debug the strip command from + elfutils (eu-strip) moves even the .symtab section into the .debug file. + + bfd_get_synthetic_symtab on ppc64 for each function descriptor ELF symbol + 'name' creates a new BSF_SYNTHETIC ELF symbol '.name' with its code + address. But with eu-strip files bfd_get_synthetic_symtab would fail to + read the code address from .opd while it reads the .symtab section from + a separate debug info file as the .opd section is SHT_NOBITS there. + + With SYNTH_ABFD the .opd section will be read from the original + backlinked binary where it is valid. */ + + if (objfile->separate_debug_objfile_backlink) + synth_abfd = objfile->separate_debug_objfile_backlink->obfd; + else + synth_abfd = abfd; + /* Add synthetic symbols - for instance, names for any PLT entries. */ - synthcount = bfd_get_synthetic_symtab (abfd, symcount, symbol_table, + synthcount = bfd_get_synthetic_symtab (synth_abfd, symcount, symbol_table, dynsymcount, dyn_symbol_table, &synthsyms); if (synthcount > 0) diff --git a/gdb/jit.c b/gdb/jit.c index e451024c49..be123a542c 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -296,7 +296,7 @@ JITed symbol file is not an object file, ignoring it.\n")); } /* This call takes ownership of sai. */ - objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED); + objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL); /* Remember a mapping from entry_addr to objfile. */ entry_addr_ptr = xmalloc (sizeof (CORE_ADDR)); diff --git a/gdb/machoread.c b/gdb/machoread.c index dbf9ae4c6e..28cb958c83 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -397,8 +397,8 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, objfile = symbol_file_add_from_bfd (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED - | OBJF_READNOW | OBJF_USERLOADED)); - add_separate_debug_objfile (objfile, main_objfile); + | OBJF_READNOW | OBJF_USERLOADED), + main_objfile); current_oso.main_objfile = NULL; if (current_oso.symbol_table) diff --git a/gdb/solib.c b/gdb/solib.c index 819eb7dab7..a9f46e0009 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -648,7 +648,8 @@ solib_read_symbols (struct so_list *so, int flags) sap = build_section_addr_info_from_section_table (so->sections, so->sections_end); so->objfile = symbol_file_add_from_bfd (so->abfd, - flags, sap, OBJF_SHARED); + flags, sap, OBJF_SHARED, + NULL); so->objfile->addr_low = so->addr_low; free_section_addr_info (sap); } diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c index f3e3f63b5c..6da5a1c3d3 100644 --- a/gdb/symfile-mem.c +++ b/gdb/symfile-mem.c @@ -109,7 +109,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name, } objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0, - sai, OBJF_SHARED); + sai, OBJF_SHARED, NULL); /* This might change our ideas about frames already looked at. */ reinit_frame_cache (); diff --git a/gdb/symfile.c b/gdb/symfile.c index 4e1109e1df..cec687092c 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1067,6 +1067,9 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) syms_from_objfile, above. ADDRS is ignored when SYMFILE_MAINLINE bit is set in ADD_FLAGS. + PARENT is the original objfile if ABFD is a separate debug info file. + Otherwise PARENT is NULL. + Upon success, returns a pointer to the objfile that was added. Upon failure, jumps back to command level (never returns). */ @@ -1076,7 +1079,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, struct section_addr_info *addrs, struct section_offsets *offsets, int num_offsets, - int flags) + int flags, struct objfile *parent) { struct objfile *objfile; struct cleanup *my_cleanups; @@ -1106,6 +1109,9 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, objfile = allocate_objfile (abfd, flags); discard_cleanups (my_cleanups); + if (parent) + add_separate_debug_objfile (objfile, parent); + /* We either created a new mapped symbol table, mapped an existing symbol table file which has not had initial symbol reading performed, or need to read an unmapped symbol table. */ @@ -1196,11 +1202,10 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) (bfd, symfile_flags, sap, NULL, 0, objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW - | OBJF_USERLOADED)); + | OBJF_USERLOADED), + objfile); do_cleanups (my_cleanup); - - add_separate_debug_objfile (new_objfile, objfile); } /* Process the symbol file ABFD, as either the main file or as a @@ -1211,10 +1216,10 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) struct objfile * symbol_file_add_from_bfd (bfd *abfd, int add_flags, struct section_addr_info *addrs, - int flags) + int flags, struct objfile *parent) { return symbol_file_add_with_addrs_or_offsets (abfd, add_flags, addrs, 0, 0, - flags); + flags, parent); } @@ -1226,7 +1231,7 @@ symbol_file_add (char *name, int add_flags, struct section_addr_info *addrs, int flags) { return symbol_file_add_from_bfd (symfile_bfd_open (name), add_flags, addrs, - flags); + flags, NULL); } diff --git a/gdb/symfile.h b/gdb/symfile.h index 89254829bd..1485e424bd 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -434,7 +434,7 @@ extern struct objfile *symbol_file_add (char *, int, extern struct objfile *symbol_file_add_from_bfd (bfd *, int, struct section_addr_info *, - int); + int, struct objfile *parent); extern void symbol_file_add_separate (bfd *, int, struct objfile *); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f1f8d3c7ad..15e8b6c8cd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-04-17 Jan Kratochvil + + * gdb.base/eu-strip-infcall.c: New file. + * gdb.base/eu-strip-infcall.exp: New file. + 2011-04-17 Jan Kratochvil * gdb.base/callfuncs.c (Lcallfunc, callfunc): New functions. diff --git a/gdb/testsuite/gdb.base/eu-strip-infcall.c b/gdb/testsuite/gdb.base/eu-strip-infcall.c new file mode 100644 index 0000000000..59a5511d43 --- /dev/null +++ b/gdb/testsuite/gdb.base/eu-strip-infcall.c @@ -0,0 +1,34 @@ +/* Copyright 2011 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +func (void) +{ + return 1; +} + +int +callfunc (int (*funcp) (void)) +{ + return funcp () * 2; +} + +int +main (void) +{ + return callfunc (func); +} diff --git a/gdb/testsuite/gdb.base/eu-strip-infcall.exp b/gdb/testsuite/gdb.base/eu-strip-infcall.exp new file mode 100644 index 0000000000..61c05cb061 --- /dev/null +++ b/gdb/testsuite/gdb.base/eu-strip-infcall.exp @@ -0,0 +1,36 @@ +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set testfile eu-strip-infcall +set binfile ${objdir}/${subdir}/${testfile} + +if {[build_executable ${testfile}.exp $testfile] == -1} { + return -1 +} + +set test "eu-strip" +set status [remote_exec build "eu-strip -f ${binfile}.debug $binfile"] +if {[lindex $status 0] != 0} { + untested ${testfile}.exp + return 0 +} + +clean_restart $testfile + +if ![runto_main] { + return -1 +} + +gdb_test "p callfunc (func)" " = 2" "infcall" -- 2.34.1