# 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" \
    "Reading symbols from .*" \
    "add-symbol-file" \
    "add symbol table from file \".*\" at.*\\(y or n\\) " "y"
gdb_test "list main"
gdb_test "print symbol_without_target_section"
