diff options
Diffstat (limited to 'gdb/testsuite/gdb.base/break-interp.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/break-interp.exp | 204 |
1 files changed, 181 insertions, 23 deletions
diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index e628979..413af76 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -221,30 +221,61 @@ proc strip_debug {dest} { } # `runto' does not check we stopped really at the function we specified. -proc reach {func command} { - global gdb_prompt +# DISPLACEMENT can be "NONE", "ZERO" or "NONZERO" +proc reach {func command displacement} { + global gdb_prompt expect_out + + global pf_prefix + set old_ldprefix $pf_prefix + lappend pf_prefix "reach-$func:" if [gdb_breakpoint $func allow-pending] { - set test "reach $func" + set test "reach" + set test_displacement "seen displacement message as $displacement" gdb_test_multiple $command $test { + -re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " { + # Missing "$gdb_prompt $" is intentional. + if {$expect_out(1,string) == "0x0"} { + set case "ZERO" + } else { + set case "NONZERO" + } + if {$displacement == $case} { + pass $test_displacement + # Permit multiple such messages. + set displacement "FOUND-$displacement" + } elseif {$displacement != "FOUND-$case"} { + fail $test_displacement + } + exp_continue + } -re "Breakpoint \[0-9\]+, $func \\(.*\\) at .*:\[0-9\]+\r\n.*$gdb_prompt $" { pass $test } - -re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in $func \\(\\)( from .*)?\r\n$gdb_prompt $" { + -re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in $func \\(\\)( from .*)?\r\n$gdb_prompt $" { pass $test } } + if ![regexp {^(NONE|FOUND-.*)$} $displacement] { + fail $test_displacement + } } + + set pf_prefix $old_ldprefix } -proc test_core {file} { - global srcdir subdir gdb_prompt +proc test_core {file displacement} { + global srcdir subdir gdb_prompt expect_out set corefile [core_find $file {} "segv"] if {$corefile == ""} { return } + global pf_prefix + set old_ldprefix $pf_prefix + lappend pf_prefix "core:" + gdb_exit gdb_start # Clear it to never find any separate debug infos in $debug_root. @@ -252,14 +283,44 @@ proc test_core {file} { gdb_reinitialize_dir $srcdir/$subdir gdb_load $file - # Do not check the binary filename as it may be truncated. - gdb_test "core-file $corefile" "Core was generated by .*\r\n#0 .*" "core loaded" + # Print the "PIE (Position Independent Executable) displacement" message. + gdb_test "set verbose on" + + set test "core loaded" + set test_displacement "seen displacement message" + gdb_test_multiple "core-file $corefile" $test { + -re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " { + # Missing "$gdb_prompt $" is intentional. + if {$expect_out(1,string) == "0x0"} { + set case "ZERO" + } else { + set case "NONZERO" + } + if {$displacement == $case} { + pass $test_displacement + # Permit multiple such messages. + set displacement "FOUND-$displacement" + } elseif {$displacement != "FOUND-$case"} { + fail $test_displacement + } + exp_continue + } + -re "Core was generated by .*\r\n#0 .*$gdb_prompt $" { + # Do not check the binary filename as it may be truncated. + pass $test + } + } + if ![regexp {^(NONE|FOUND-.*)$} $displacement] { + fail $test_displacement + } gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "core main bt" + + set pf_prefix $old_ldprefix } -proc test_attach {file} { - global board_info +proc test_attach {file displacement} { + global board_info gdb_prompt expect_out gdb_exit @@ -287,17 +348,61 @@ proc test_attach {file} { } } + global pf_prefix + set old_ldprefix $pf_prefix + lappend pf_prefix "attach:" + gdb_exit gdb_start - gdb_test "attach $pid" "Attaching to process $pid\r\n.*" "attach" + + # Print the "PIE (Position Independent Executable) displacement" message. + gdb_test "set verbose on" + + set test "attach" + gdb_test_multiple "attach $pid" $test { + -re "Attaching to process $pid\r\n" { + # Missing "$gdb_prompt $" is intentional. + pass $test + } + } + + set test "attach final prompt" + set test_displacement "seen displacement message" + gdb_test_multiple "" $test { + -re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " { + # Missing "$gdb_prompt $" is intentional. + if {$expect_out(1,string) == "0x0"} { + set case "ZERO" + } else { + set case "NONZERO" + } + if {$displacement == $case} { + pass $test_displacement + # Permit multiple such messages. + set displacement "FOUND-$displacement" + } elseif {$displacement != "FOUND-$case"} { + fail $test_displacement + } + exp_continue + } + -re "$gdb_prompt $" { + pass $test + } + } + if ![regexp {^(NONE|FOUND-.*)$} $displacement] { + fail $test_displacement + } + gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "attach main bt" gdb_exit remote_exec host "kill -9 $pid" + + set pf_prefix $old_ldprefix } -proc test_ld {file ifmain trynosym} { - global srcdir subdir gdb_prompt +proc test_ld {file ifmain trynosym displacement} { + global srcdir subdir gdb_prompt expect_out # First test normal `file'-command loaded $FILE with symbols. @@ -308,20 +413,31 @@ proc test_ld {file ifmain trynosym} { gdb_reinitialize_dir $srcdir/$subdir gdb_load $file - reach "dl_main" "run segv" + # Print the "PIE (Position Independent Executable) displacement" message. + gdb_test "set verbose on" + + reach "dl_main" "run segv" $displacement gdb_test "bt" "#0 +\[^\r\n\]*\\mdl_main\\M.*" "dl bt" if $ifmain { - reach "main" continue + # Displacement message will be printed the second time on initializing + # the linker from svr4_special_symbol_handling. If any ANOFFSET has + # been already set as non-zero the detection will no longer be run. + if {$displacement == "NONZERO"} { + set displacement_main "NONE" + } else { + set displacement_main $displacement + } + reach "main" continue $displacement_main - reach "libfunc" continue + reach "libfunc" continue "NONE" gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt" - test_core $file + test_core $file $displacement - test_attach $file + test_attach $file $displacement } if !$trynosym { @@ -341,18 +457,21 @@ proc test_ld {file ifmain trynosym} { gdb_test "set debug-file-directory" gdb_reinitialize_dir $srcdir/$subdir + # Print the "PIE (Position Independent Executable) displacement" message. + gdb_test "set verbose on" + # Test no (error) message has been printed by `exec-file'. set escapedfile [string_to_regexp $file] gdb_test "exec-file $file" "exec-file $escapedfile" "load" if $ifmain { - reach "dl_main" run + reach "dl_main" run $displacement set test "info files" set entrynohex "" gdb_test_multiple $test $test { -re "\r\n\[\t \]*Entry point:\[\t \]*0x(\[0-9a-f\]+)\r\n.*$gdb_prompt $" { - set entrynohex $expect_out(1,string) + set entrynohex $expect_out(1,string) pass $test } } @@ -363,7 +482,34 @@ proc test_ld {file ifmain trynosym} { } else { # There is no symbol to break at ld.so. Moreover it can exit with an # error code. - gdb_test "run" "Program exited (normally|with code \[0-9\]+)\\." "ld.so exit" + + set test "ld.so exit" + set test_displacement "seen displacement message" + gdb_test_multiple "run" $test { + -re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " { + # Missing "$gdb_prompt $" is intentional. + if {$expect_out(1,string) == "0x0"} { + set case "ZERO" + } else { + set case "NONZERO" + } + if {$displacement == $case} { + pass $test_displacement + # Permit multiple such messages. + set displacement "FOUND-$displacement" + } elseif {$displacement != "FOUND-$case"} { + fail $test_displacement + } + exp_continue + } + -re "Program exited (normally|with code \[0-9\]+)\\.\r\n$gdb_prompt $" { + # Do not check the binary filename as it may be truncated. + pass $test + } + } + if ![regexp {^(NONE|FOUND-.*)$} $displacement] { + fail $test_displacement + } } set pf_prefix $old_ldprefix @@ -450,7 +596,12 @@ foreach ldprelink {NO YES} { if ![prelink$ldprelink $interp] { continue } - test_ld $interp 0 [expr {$ldsepdebug == "NO"}] + if {$ldprelink == "NO"} { + set displacement "NONZERO" + } else { + set displacement "ZERO" + } + test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement if ![copy $interp $interp_saved] { continue @@ -531,7 +682,14 @@ foreach ldprelink {NO YES} { if {[prelink$binprelink "--dynamic-linker=$interp --ld-library-path=$dir $exec $interp [concat $dests]" [file tail $exec]] && [copy $interp_saved $interp]} { - test_ld $exec 1 [expr {$binsepdebug == "NO"}] + if {$binpie == "NO"} { + set displacement "NONE" + } elseif {$binprelink == "NO"} { + set displacement "NONZERO" + } else { + set displacement "ZERO" + } + test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement } } } |