rpms/gdb/F-12 gdb-bz559414-pie-assert-fix.patch, NONE, 1.1 gdb.spec, 1.422, 1.423

Jan Kratochvil jkratoch at fedoraproject.org
Sun Jan 31 02:00:42 UTC 2010


Author: jkratoch

Update of /cvs/pkgs/rpms/gdb/F-12
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv867

Modified Files:
	gdb.spec 
Added Files:
	gdb-bz559414-pie-assert-fix.patch 
Log Message:
* Sun Jan 31 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-30.fc12
- Fix failed gdb_assert due to the PIE patchset (BZ 559414).


gdb-bz559414-pie-assert-fix.patch:
 b/gdb/testsuite/gdb.base/symbol-without-target_section.c   |   18 ++++++
 b/gdb/testsuite/gdb.base/symbol-without-target_section.exp |   39 +++++++++++++
 gdb/config/djgpp/fnchange.lst                              |    2 
 gdb/solib-svr4.c                                           |   16 ++++-
 4 files changed, 72 insertions(+), 3 deletions(-)

--- NEW FILE gdb-bz559414-pie-assert-fix.patch ---
http://sourceware.org/ml/gdb-patches/2010-01/msg00661.html
Subject: [patch] Fix failed gdb_assert due to the PIE patchset

[ Backport for F-12/7.0.  ]

Hi,

the PIE patchset brought in an occasionally failing gdb_assert (according to
Fedora ABRT bugreports).
solib-svr4.c:600: internal-error: scan_dyntag: Assertion `target_section < current_target_sections->sections_end' failed.

Now I understand it as generally current_target_sections are about target-side
data while symbols are the GDB side and there is only loose relation of those.

ABFD can be from multiple places acting for multiple purposes as parsed by
elf_lookup_lib_symbol:

exec_bfd:
	It cannot be from exec_one - this BFD has no associated objfile to
	pass to symfile_objfile.  OK.
symfile_objfile:
	It gets translated by elf_lookup_lib_symbol into exec_bfd which
	represents the target data.  OK.
so_list's objfile's separate_debug_objfile file:
	gdb_assert-forbidden as input to elf_lookup_lib_symbol.  OK.
so_list's objfile's main file:
	update_solib_list must have called add_target_sections.  OK.
objfile's separate_debug_objfile file:
	gdb_assert-forbidden as input to elf_lookup_lib_symbol.  OK.
objfile's main file (if it has no associated so_list):
	Such ABFD from add_symbol_file_command has no add_target_sections
	called.  Still it can have current context BLOCK which crashes
	scan_dyntag.  BUG.


No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.

The patch mostly reverts the PIE part there.

OK to check in?


Sorry,
Jan


gdb/
2010-01-31  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* solib-svr4.c (scan_dyntag): New variable dyn_addr.  Replace gdb_assert
	by a conditional setting DYN_ADDR.  Use DYN_ADDR.
	* config/djgpp/fnchange.lst: Add translations for
	symbol-without-target_section.exp and symbol-without-target_section.c.

gdb/testsuite/
2010-01-31  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.base/symbol-without-target_section.exp,
	gdb.base/symbol-without-target_section.c: New.

--- a/gdb/config/djgpp/fnchange.lst
+++ b/gdb/config/djgpp/fnchange.lst
@@ -394,6 +394,8 @@
 @V@/gdb/testsuite/gdb.base/solib-symbol-main.c @V@/gdb/testsuite/gdb.base/so-symmain.c
 @V@/gdb/testsuite/gdb.base/solib-overlap-lib.c @V@/gdb/testsuite/gdb.base/so-ovrlib.c
 @V@/gdb/testsuite/gdb.base/solib-overlap-main.c @V@/gdb/testsuite/gdb.base/so-ovrmain.c
+ at V@/gdb/testsuite/gdb.base/gdb.base/symbol-without-target_section.exp @V@/gdb/testsuite/gdb.base/symnosec.exp
+ at V@/gdb/testsuite/gdb.base/gdb.base/symbol-without-target_section.c @V@/gdb/testsuite/gdb.base/symnosec.c
 @V@/gdb/testsuite/gdb.base/type-opaque-lib.c @V@/gdb/testsuite/gdb.base/ty-opqlib.c
 @V@/gdb/testsuite/gdb.base/type-opaque-main.c @V@/gdb/testsuite/gdb.base/ty-opqmain.c
 @V@/gdb/testsuite/gdb.base/watchpoint-hw.c @V@/gdb/testsuite/gdb.base/wp-hw.c
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -570,7 +570,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
 {
   int arch_size, step, sect_size;
   long dyn_tag;
-  CORE_ADDR dyn_ptr;
+  CORE_ADDR dyn_ptr, dyn_addr;
   gdb_byte *bufend, *bufstart, *buf;
   Elf32_External_Dyn *x_dynp_32;
   Elf64_External_Dyn *x_dynp_64;
@@ -627,7 +627,17 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
        target_section++)
     if (sect == target_section->the_bfd_section)
       break;
-  gdb_assert (target_section < target_get_section_table (&exec_ops)->sections_end);
+  if (target_section < target_get_section_table (&exec_ops)->sections_end)
+    dyn_addr = target_section->addr;
+  else
+    {
+      /* ABFD may come from OBJFILE acting only as a symbol file without being
+	 loaded into the target (see add_symbol_file_command).  This case is
+	 such fallback to the file VMA address without the possibility of
+	 having the section relocated to its actual in-memory address.  */
+
+      dyn_addr = bfd_section_vma (abfd, sect);
+    }
 
   /* Read in .dynamic from the BFD.  We will get the actual value
      from memory later.  */
@@ -639,7 +649,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
 	     CORE_ADDR ptr_addr;
 
 	     ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
-	     ptr_addr = target_section->addr + (buf - bufstart) + arch_size / 8;
+	     ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
 	     if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
 	       dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
 	     *ptr = dyn_ptr;
--- /dev/null
+++ b/gdb/testsuite/gdb.base/symbol-without-target_section.c
@@ -0,0 +1,18 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 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/>.  */
+
+int symbol_without_target_section;
--- /dev/null
+++ b/gdb/testsuite/gdb.base/symbol-without-target_section.exp
@@ -0,0 +1,39 @@
+# Copyright 2010 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/>.
+
+# Exploit formerly failed assertion in scan_dyntag when it got called for
+# objfile having ".dynamic" section but without having data loaded in target.
+# Such file is ${binmainfile} through add-symbol-file here.  Set context first
+# by "list main" to have some local BLOCK set in lookup_symbol_global.
+
+set testfile symbol-without-target_section
+set srclibfile ${testfile}.c
+set binlibfile ${testfile}.x
+set srcmainfile start.c
+set binmainfile ${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srclibfile}" \
+		  "${objdir}/${subdir}/${binlibfile}" object {debug}] != "" } {
+    untested ${testfile}.exp
+    return -1
+}
+if {[build_executable ${testfile}.exp ${binmainfile} ${srcmainfile} {debug}] == -1} {
+    return -1
+}
+clean_restart ${binlibfile}
+
+gdb_test "add-symbol-file ${objdir}/${subdir}/${binmainfile} 0" "" "add-symbol-file" \
+	 "add symbol table from file \".*\" at.*\\(y or n\\) " "y"
+gdb_test "list main"
+gdb_test "print symbol_without_target_section"



Index: gdb.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/F-12/gdb.spec,v
retrieving revision 1.422
retrieving revision 1.423
diff -u -p -r1.422 -r1.423
--- gdb.spec	22 Jan 2010 11:26:08 -0000	1.422
+++ gdb.spec	31 Jan 2010 02:00:42 -0000	1.423
@@ -36,7 +36,7 @@ Version: 7.0.1
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 29%{?_with_upstream:.upstream}%{dist}
+Release: 30%{?_with_upstream:.upstream}%{dist}
 
 License: GPLv3+
 Group: Development/Debuggers
@@ -444,6 +444,9 @@ Patch401: gdb-stabs-read_args.patch
 # Fix crash while executing python code.
 Patch402: gdb-python-cplus-crash.patch
 
+# Fix failed gdb_assert due to the PIE patchset (BZ 559414).
+Patch414: gdb-bz559414-pie-assert-fix.patch
+
 BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
 Requires: readline%{?_isa}
 BuildRequires: readline-devel%{?_isa}
@@ -686,13 +689,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 %patch390 -p1
 %patch391 -p1
 %patch392 -p1
-# Always verify its applicability.
-%patch393 -p1
-%patch335 -p1
-%if 0%{!?el5:1}
-%patch393 -p1 -R
-%patch335 -p1 -R
-%endif
 %patch394 -p1
 %patch395 -p1
 %patch396 -p1
@@ -702,6 +698,14 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 %patch400 -p1
 %patch401 -p1
 %patch402 -p1
+%patch414 -p1
+# Always verify their applicability.
+%patch393 -p1
+%patch335 -p1
+%if 0%{!?el5:1}
+%patch393 -p1 -R
+%patch335 -p1 -R
+%endif
 
 find -name "*.orig" | xargs rm -f
 ! find -name "*.rej" # Should not happen.
@@ -1020,6 +1024,9 @@ fi
 %endif
 
 %changelog
+* Sun Jan 31 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-30.fc12
+- Fix failed gdb_assert due to the PIE patchset (BZ 559414).
+
 * Fri Jan 22 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-29.fc12
 - Disable break-by-name on inlined functions due to a regression on parameters
   of inlined functions falsely <optimized out> (BZ 556975 Comment 8).



More information about the scm-commits mailing list