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

# PR 11786 (Gold and strip differ on flags,align fields of PT_GNU_RELRO).
# Generate a core file from the stripped version of the program,
# and then try to debug the core with the unstripped version.

standard_testfile

if {[build_executable "failed to prepare" $testfile $srcfile \
	 {debug pie "ldflags=-Wl,-z,relro"}]} {
    return -1
}

set stripped_binfile ${binfile}.stripped
set gcorefile ${binfile}.gcore

set strip_program [transform strip]
remote_file host delete ${stripped_binfile}
if [run_on_host "strip" "$strip_program" "-g -o ${stripped_binfile} $binfile"] {
    return -1
}

# Workaround PR binutils/10802:
# Preserve the 'x' bit also for PIEs (Position Independent Executables).
set perm [file attributes ${binfile} -permissions]
file attributes ${stripped_binfile} -permissions $perm

clean_restart ${stripped_binfile}

# The binary is stripped of debug info, but not minsyms.
if ![runto break_here] {
    return -1
}

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

# Now restart gdb with the unstripped binary and load the corefile.

clean_restart ${binfile}

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

# Put $pc in gdb.log for debug purposes for comparison with stripped case.
gdb_test "x/i \$pc" "break_here.*"

gdb_test "frame" "#0 \[^\r\n\]* break_here .*" "unstripped + core ok"
