# Copyright 2013-2020 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 {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug additional_flags=-fpie "ldflags=-pie -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] {
    fail "can't run to 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"
