mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-05 12:53:16 +08:00
The canonical form of 'if' in modern TCL is 'if {} {}'. But there's still a bunch of places in the testsuite where we make use of the 'then' keyword, and sometimes these get copies into new tests, which just spreads poor practice. This commit removes all use of the 'then' keyword from the gdb.base/ test script directory. There should be no changes in what is tested after this commit.
123 lines
3.3 KiB
Plaintext
123 lines
3.3 KiB
Plaintext
# Copyright 2010-2022 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*] {
|
|
return
|
|
}
|
|
|
|
# In remote mode we cannot use the 'set args' command, and this
|
|
# test requires it.
|
|
if {[target_info exists gdb_protocol]} {
|
|
if {[target_info gdb_protocol] == "remote"} {
|
|
return
|
|
}
|
|
}
|
|
|
|
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" "" "info breakpoints first"
|
|
|
|
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" "" "info breakpoints second"
|
|
|
|
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
|
|
}
|