From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12950 invoked by alias); 9 Apr 2011 15:08:30 -0000 Received: (qmail 12929 invoked by uid 22791); 9 Apr 2011 15:08:28 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_YM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 09 Apr 2011 15:08:17 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p39F8Hj4022426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 9 Apr 2011 11:08:17 -0400 Received: from host1.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p39F8FS3030808 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 9 Apr 2011 11:08:17 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p39F8FaE011419; Sat, 9 Apr 2011 17:08:15 +0200 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p39F8EPR011418; Sat, 9 Apr 2011 17:08:14 +0200 Date: Sat, 09 Apr 2011 15:08:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: binutils@sourceware.org Subject: [patch] [ppc64] eu-strip vs. func addresses for GDB inferior calls #3 Message-ID: <20110409150814.GA11013@host1.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2011-04/txt/msg00136.txt.bz2 Hi, bfd/ This is a repost of the patch: Re: [3/3, ppc64, bfd patch] eu-strip vs. func addresses for GDB inferior calls http://sourceware.org/ml/gdb-patches/2011-03/msg01046.html as ppc64_elf_get_synthetic_symtab works with separate debug info file if ABFD is the original file and only asymbol ->section are from the separate debug info file. But still there is needed this change for the ->section condition. This follows the review: http://sourceware.org/ml/gdb-patches/2011-04/msg00094.html gdb/ It just follows the other review if the asymbol patching is no longer needed: http://sourceware.org/ml/gdb-patches/2011-04/msg00093.html It no longer needs the elfutils patch from the patchset #1 and it no longer needs the sections original file <-> separate debug file remapping from the patchset #2. No regressions on {ppc64-m64,ppc64-m32}-rhel60-linux-gnu. Thanks, Jan bfd/ 2011-03-23 Jan Kratochvil * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Do not check for SEC_LOAD. gdb/ 2011-04-09 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. gdb/testsuite/ 2011-03-23 Jan Kratochvil * gdb.base/eu-strip-infcall.c: New file. * gdb.base/eu-strip-infcall.exp: New file. --- 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 ABFD is a separate debug info + file. */ + if ((sec->flags & SEC_ALLOC) == 0) break; if ((sec->flags & SEC_CODE) != 0) s->section = sec; --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1230,7 +1230,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; @@ -1301,9 +1301,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) --- 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)); --- 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) --- 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); } --- 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 (); --- 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); } --- 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 *); --- /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); +} --- /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"