From b381ea14bd6aa64d0412c4207658f545a9331965 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 1 Feb 2010 19:27:55 +0000 Subject: [PATCH] gdb/ * 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 | 7 ++++ gdb/config/djgpp/fnchange.lst | 2 + gdb/solib-svr4.c | 16 ++++++-- gdb/testsuite/ChangeLog | 5 +++ .../gdb.base/symbol-without-target_section.c | 18 +++++++++ .../symbol-without-target_section.exp | 39 +++++++++++++++++++ 6 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 gdb/testsuite/gdb.base/symbol-without-target_section.c create mode 100644 gdb/testsuite/gdb.base/symbol-without-target_section.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1ae60d4ed9..991d3a6d09 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-02-01 Jan Kratochvil + + * 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 * gdbarch.sh: Set LANG and LC_ALL to C, not c. diff --git a/gdb/config/djgpp/fnchange.lst b/gdb/config/djgpp/fnchange.lst index e30e9013bf..3982f1d0ab 100644 --- 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 +@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 diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index e497364af8..5689bf328d 100644 --- 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; @@ -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; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 53a956a563..01613dd751 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-01 Jan Kratochvil + + * gdb.base/symbol-without-target_section.exp, + gdb.base/symbol-without-target_section.c: New. + 2010-02-01 Daniel Jacobowitz * 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 index 0000000000..1c506988f5 --- /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 . */ + +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 index 0000000000..08d4792c8b --- /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 . + +# 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" -- 2.34.1