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

# The problem was due to amd64_skip_prologue attempting to access inferior
# memory before the PIE (Position Independent Executable) gets relocated.

global inferior_spawn_id
global gdb_spawn_id

if ![istarget *-linux*] {
    continue
}

# In remote mode we cannot use the 'set args' command, and this
# test requires it.
if { [target_info exists gdb_protocol] } then {
    if { [target_info gdb_protocol] == "remote" } then {
	continue
    }
}

standard_testfile .c
set executable1 ${testfile}1
set executable2 ${testfile}2
set binfile1 ${binfile}1
set binfile2 ${binfile}2
set binfile2_test_msg OBJDIR/${subdir}/${executable2}

# Use conditional compilation according to `BIN' as GDB remembers the source
# file name of the breakpoint.

set opts [list debug pie]
if {[build_executable ${testfile}.exp $executable1 $srcfile [concat $opts {additional_flags=-DBIN=1}]] == -1
    || [build_executable ${testfile}.exp $executable2 $srcfile [concat $opts {additional_flags=-DBIN=2}]] == -1} {
    return -1
}

clean_restart ${executable1}

gdb_test_no_output "set args ${binfile2}" "set args ${binfile2_test_msg}"

if ![runto_main] {
    return -1
}

# Do not stop on `main' after re-exec.
delete_breakpoints

gdb_breakpoint "pie_execl_marker"
gdb_test "info breakpoints" ".*" ""

set addr1 ""
set test "pie_execl_marker address first"
gdb_test_multiple "p/x &pie_execl_marker" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	set addr1 $expect_out(1,string)
	pass $test
    }
}
verbose -log "addr1 is $addr1"

set test "continue"
set matches_found 0
gdb_test_multiple $test $test {
    -re "Error in re-setting breakpoint" {
	fail $test
    }
    -re "Cannot access memory" {
	fail $test
    }
    -i "$inferior_spawn_id" -re "pie-execl: re-exec" {
	# output from inferior
        incr matches_found
	if { $matches_found == 2 } {
	    pass $test
	} else {
	    exp_continue
	}
    }
    -i "$gdb_spawn_id"
    -re "executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
	# output from gdb
        incr matches_found
	if { $matches_found == 2 } {
	    pass $test
	} else {
	    exp_continue
	}
    }
}

gdb_test "info breakpoints" ".*" ""

set addr2 ""
set test "pie_execl_marker address second"
gdb_test_multiple "p/x &pie_execl_marker" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	set addr2 $expect_out(1,string)
	pass $test
    }
}
verbose -log "addr2 is $addr2"

# Ensure we cannot get a false PASS and the inferior has really changed.
set test "pie_execl_marker address has changed"
if [string equal $addr1 $addr2] {
    fail $test
} else {
    pass $test
}
