# Copyright 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/>.

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile gcore-relro-main.c
set libfile gcore-relro-lib
set srcfile_lib ${libfile}.c
set binfile_lib [standard_output_file ${libfile}.so]
set gcorefile ${binfile}.gcore
set objfile [standard_output_file ${testfile}.o]

 if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} {debug}] != ""
      || [gdb_compile ${srcdir}/${subdir}/${srcfile} ${objfile} object {debug}] != "" } {
      untested ${testfile}.exp
      return -1
 }
 set opts [list debug shlib=${binfile_lib} additional_flags=-Wl,-z,relro]
 if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } {
      unsupported "-Wl,-z,relro compilation failed"
      return -1
 }

clean_restart ${binfile}
gdb_load_shlibs ${binfile_lib}

# Does this gdb support gcore?
set test "help gcore"
gdb_test_multiple $test $test {
    -re "Undefined command: .gcore.*\r\n$gdb_prompt $" {
	# gcore command not supported -- nothing to test here.
	unsupported "gdb does not support gcore on this target"
	return -1;
    }
    -re "Save a core file .*\r\n$gdb_prompt $" {
	pass $test
    }
}

if ![runto lib] {
    return -1
}

if {![gdb_gcore_cmd $gcorefile "save a corefile"]} {
    return -1
}

# Now restart gdb and load the corefile.

clean_restart ${binfile}
gdb_load_shlibs ${binfile_lib}

gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile"

gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded"
