# Copyright 2012-2021 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 "failed to compile"
      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_shlib ${binfile_lib}

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_shlib ${binfile_lib}

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

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