This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[patch] [ppc64] eu-strip vs. func addresses for GDB inferior calls #3
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: gdb-patches at sourceware dot org
- Cc: binutils at sourceware dot org
- Date: Sat, 9 Apr 2011 17:08:14 +0200
- Subject: [patch] [ppc64] eu-strip vs. func addresses for GDB inferior calls #3
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 <jan.kratochvil@redhat.com>
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Do not check for
SEC_LOAD.
gdb/
2011-04-09 Jan Kratochvil <jan.kratochvil@redhat.com>
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 <jan.kratochvil@redhat.com>
* 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 <http://www.gnu.org/licenses/>. */
+
+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 <http://www.gnu.org/licenses/>.
+
+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"