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