gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 1 Feb 2010 19:27:55 +0000 (19:27 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 1 Feb 2010 19:27:55 +0000 (19:27 +0000)
* 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/
* gdb.base/symbol-without-target_section.exp,
gdb.base/symbol-without-target_section.c: New.

gdb/ChangeLog
gdb/config/djgpp/fnchange.lst
gdb/solib-svr4.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/symbol-without-target_section.c [new file with mode: 0644]
gdb/testsuite/gdb.base/symbol-without-target_section.exp [new file with mode: 0644]

index 1ae60d4..991d3a6 100644 (file)
@@ -1,3 +1,10 @@
+2010-02-01  Jan Kratochvil  <jan.kratochvil@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.
+
 2010-02-01  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gdbarch.sh: Set LANG and LC_ALL to C, not c.
index e30e901..3982f1d 100644 (file)
 @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
+@V@/gdb/testsuite/gdb.base/gdb.base/symbol-without-target_section.exp @V@/gdb/testsuite/gdb.base/symnosec.exp
+@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
index e497364..5689bf3 100644 (file)
@@ -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;
@@ -597,7 +597,17 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
        target_section++)
     if (sect == target_section->the_bfd_section)
       break;
-  gdb_assert (target_section < current_target_sections->sections_end);
+  if (target_section < current_target_sections->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;
index 53a956a..01613dd 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.base/symbol-without-target_section.exp,
+       gdb.base/symbol-without-target_section.c: New.
+
 2010-02-01  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * gdb.base/bigcore.exp: Reset increased timeout.
diff --git a/gdb/testsuite/gdb.base/symbol-without-target_section.c b/gdb/testsuite/gdb.base/symbol-without-target_section.c
new file mode 100644 (file)
index 0000000..1c50698
--- /dev/null
@@ -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;
diff --git a/gdb/testsuite/gdb.base/symbol-without-target_section.exp b/gdb/testsuite/gdb.base/symbol-without-target_section.exp
new file mode 100644 (file)
index 0000000..08d4792
--- /dev/null
@@ -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"