-# Copyright 1998, 2000, 2001, 2007, 2008, 2009, 2010, 2011
-# Free Software Foundation, Inc.
+# Copyright 1998-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
# 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 $tracelevel then {
- strace $tracelevel
-}
-
-set prototypes 1
+# Build programs in PIE mode, to reproduce PR 21555.
+foreach_with_prefix opts {
+ { "" "" }
+ { "-fPIE" "ldflags=-pie" } } {
+
+ # build the first test case
+
+ set testfile1 "reread1"
+ set srcfile1 ${testfile1}.c
+ # Cygwin needs $EXEEXT.
+ set binfile1 [standard_output_file ${testfile1}$EXEEXT]
+
+ set testfile1_opt [list debug nowarnings \
+ additional_flags=[lindex $opts 0] \
+ [lindex $opts 1] ]
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" \
+ executable ${testfile1_opt}] != "" } {
+ untested "failed to compile first testcase"
+ return -1
+ }
-# build the first test case
+ # build the second test case
+
+ set testfile2 "reread2"
+ set srcfile2 ${testfile2}.c
+ set binfile2 [standard_output_file ${testfile2}$EXEEXT]
+
+ set testfile2_opt1 [list debug nowarnings \
+ additional_flags=[lindex $opts 0] \
+ [lindex $opts 1]]
+ set testfile2_op2 [list debug nowarnings \
+ "additional_flags=-DNO_SECTIONS [lindex $opts 0]" \
+ [lindex $opts 1]]
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" \
+ executable ${testfile2_opt1}] != ""
+ && [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" \
+ executable ${testfile2_opt2}] != ""} {
+ untested "failed to compile second testcase"
+ return -1
+ }
-set testfile1 "reread1"
-set srcfile1 ${testfile1}.c
-# Cygwin needs $EXEEXT.
-set binfile1 ${objdir}/${subdir}/${testfile1}$EXEEXT
+ # Start with a fresh gdb.
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug nowarnings}] != "" } {
- untested reread.exp
- return -1
-}
+ set testfile "reread"
+ set binfile [standard_output_file ${testfile}$EXEEXT]
-# build the second test case
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
-set testfile2 "reread2"
-set srcfile2 ${testfile2}.c
-set binfile2 ${objdir}/${subdir}/${testfile2}$EXEEXT
+ # Load the first executable.
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings}] != ""
- && [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings additional_flags=-DNO_SECTIONS}] != ""} {
- untested reread.exp
- return -1
-}
+ gdb_rename_execfile ${binfile1} ${binfile}
+ gdb_load ${binfile}
-# Start with a fresh gdb.
+ set readnow_p [readnow ${binfile}]
+
+ # Set a breakpoint at foo
-set testfile "reread"
-set binfile ${objdir}/${subdir}/${testfile}$EXEEXT
+ gdb_test "break foo" \
+ "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
+ "breakpoint foo in first file"
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-# Load the first executable.
+ # Run, should see "Breakpoint 1, foo () at hello1.c:14"
-gdb_rename_execfile ${binfile1} ${binfile}
-gdb_load ${binfile}
+ gdb_run_cmd
+ gdb_test "" "Breakpoint.* foo .* at .*$srcfile1:14.*" "run to foo()"
-# Set a breakpoint at foo
+ # Restore first executable to its original name, and move
+ # second executable into its place. Ensure that the new
+ # executable is at least a second newer than the old.
-gdb_test "break foo" \
- "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
- "breakpoint foo in first file"
+ gdb_rename_execfile ${binfile} ${binfile1}
+ gdb_rename_execfile ${binfile2} ${binfile}
+ gdb_test "shell sleep 1" ".*" ""
+ gdb_touch_execfile ${binfile}
+ # Run a second time; GDB should detect that the executable has changed
+ # and reset the breakpoints correctly.
+ # Should see "Breakpoint 1, foo () at reread2.c:9"
-# Run, should see "Breakpoint 1, foo () at hello1.c:14"
+ set test "run to foo() second time"
+ if [is_remote target] {
+ unsupported $test
+ } else {
+ gdb_run_cmd
+ if { $readnow_p } {
+ setup_kfail "gdb/26800" *-*-*
+ }
+ gdb_test "" "Breakpoint.* foo .* at .*:9.*" $test
+ }
-gdb_run_cmd
-gdb_expect {
- -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $" {
- pass "run to foo()";
- }
- -re ".*$gdb_prompt $" {
- fail "run to foo()";
- gdb_suppress_tests;
- }
- timeout { fail "run to foo() (timeout)" ; gdb_suppress_tests }
-}
-
-# Restore first executable to its original name, and move
-# second executable into its place. Ensure that the new
-# executable is at least a second newer than the old.
-
-gdb_rename_execfile ${binfile} ${binfile1}
-gdb_rename_execfile ${binfile2} ${binfile}
-gdb_test "shell sleep 1" ".*" ""
-gdb_touch_execfile ${binfile}
-
-# Run a second time; GDB should detect that the executable has changed
-# and reset the breakpoints correctly.
-# Should see "Breakpoint 1, foo () at reread2.c:9"
-
-if [is_remote target] {
- unsupported "run to foo() second time ";
-} else {
- gdb_run_cmd
- gdb_expect {
- # -re ".*re-reading symbols.*Breakpoint.* foo .* at .*$srcfile2:9.*$gdb_prompt $" {}
- -re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
- pass "run to foo() second time ";
- }
- -re ".*$gdb_prompt $" {
- fail "run to foo() second time";
- gdb_suppress_tests;
- }
- timeout {
- fail "run to foo() second time (timeout)" ;
- gdb_suppress_tests
+ ### Second pass: verify that GDB checks the executable file's
+ ### timestamp when the program is *restarted*, not just when it exits.
+
+ if [is_remote target] {
+ unsupported "second pass: GDB should check for changes before running"
+ } else {
+
+ # Put the older executable back in place.
+ gdb_rename_execfile ${binfile} ${binfile2}
+ gdb_rename_execfile ${binfile1} ${binfile}
+
+ # Restart GDB entirely.
+ clean_restart ${binfile}
+
+ # Set a breakpoint on foo and run to it.
+ gdb_test "break foo" \
+ "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
+ "second pass: breakpoint foo in first file"
+ gdb_run_cmd
+ gdb_test "" "Breakpoint.* foo .* at .*$srcfile1:14.*" \
+ "second pass: run to foo()"
+
+ # This time, let the program run to completion. If GDB checks the
+ # executable file's timestamp now, it won't notice any change.
+ gdb_continue_to_end "second pass"
+
+ # Now move the newer executable into place, and re-run. GDB
+ # should still notice that the executable file has changed,
+ # and still re-set the breakpoint appropriately.
+ gdb_rename_execfile ${binfile} ${binfile1}
+ gdb_rename_execfile ${binfile2} ${binfile}
+ gdb_run_cmd
+ if { $readnow_p } {
+ setup_kfail "gdb/26800" *-*-*
+ }
+ gdb_test "" "Breakpoint.* foo .* at .*:9.*" \
+ "second pass: run to foo() second time"
}
- }
-}
-
-
-### Second pass: verify that GDB checks the executable file's
-### timestamp when the program is *restarted*, not just when it exits.
-
-if [is_remote target] {
- unsupported "second pass: GDB should check for changes before running"
-} else {
-
- # Put the older executable back in place.
- gdb_rename_execfile ${binfile} ${binfile2}
- gdb_rename_execfile ${binfile1} ${binfile}
-
- # Restart GDB entirely.
- gdb_start
- gdb_reinitialize_dir $srcdir/$subdir
- gdb_load ${binfile}
-
- # Set a breakpoint on foo and run to it.
- gdb_test "break foo" \
- "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
- "second pass: breakpoint foo in first file"
- gdb_run_cmd
- gdb_expect {
- -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $" {
- pass "second pass: run to foo()";
- }
- -re ".*$gdb_prompt $" {
- fail "second pass: run to foo()";
- gdb_suppress_tests;
- }
- timeout {
- fail "second pass: run to foo() (timeout)"
- gdb_suppress_tests
- }
- }
- # This time, let the program run to completion. If GDB checks the
- # executable file's timestamp now, it won't notice any change.
- gdb_continue_to_end "second pass"
-
- # Now move the newer executable into place, and re-run. GDB
- # should still notice that the executable file has changed,
- # and still re-set the breakpoint appropriately.
- gdb_rename_execfile ${binfile} ${binfile1}
- gdb_rename_execfile ${binfile2} ${binfile}
- gdb_run_cmd
- gdb_expect {
- -re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
- pass "second pass: run to foo() second time ";
- }
- -re ".*$gdb_prompt $" {
- fail "second pass: run to foo() second time";
- gdb_suppress_tests;
- }
- timeout {
- fail "second pass: run to foo() second time (timeout)" ;
- gdb_suppress_tests
- }
}
-}
-
# End of tests.
-gdb_stop_suppressing_tests
-
return 0