# Copyright 2010-2012 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"
