# 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 memsz field of PT_TLS).
# 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 { [have_fuse_ld_gold] == 0} {
    return -1
}

if {[build_executable "failed to prepare" $testfile $srcfile \
	 {debug pie "ldflags=-fuse-ld=gold"}]} {
    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"
