# Copyright 2016-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 . # Test that gdb's (or gdbserver's) own signal handling does not # interfere with the signal actions (dispositions, etc.) and mask # their spawned children inherit. # # - If gdb inherits some signal set to SIG_IGN, so should the # inferior, even if gdb itself chooses not to ignore the signal. # # - If gdb inherits some signal set to SIG_DFL, so should the inferior # even if gdb itself ignores that signal. # # This requires special support in gdb/gdbserver because the exec # family of functions does not reset the signal disposition of signals # that are set to SIG_IGN, nor signal masks and flags. standard_testfile if {![is_remote host] && ![is_remote target]} { set gdb_txt [standard_output_file gdb.txt] set standalone_txt [standard_output_file standalone.txt] set purely_local 1 } else { set gdb_txt gdb.txt set standalone_txt standalone.txt set purely_local 0 } remote_file host delete $gdb_txt remote_file host delete $standalone_txt remote_file target delete $gdb_txt remote_file target delete $standalone_txt set options [list debug "additional_flags=-DOUTPUT_TXT=\"$gdb_txt\""] if {[build_executable $testfile.exp $testfile $srcfile $options]} { untested "failed to compile" return -1 } set options [list debug "additional_flags=-DOUTPUT_TXT=\"$standalone_txt\""] if {[build_executable $testfile.exp $testfile-standalone $srcfile $options]} { untested "failed to compile" return -1 } # Run the program directly, and dump its initial signal actions and # mask in "standalone.txt". # Use remote_spawn instead of remote_exec, like how we spawn gdb. # This is in order to take the same code code paths in dejagnu # compared to when running the program through gdb. E.g., because # local_exec uses -ignore SIGHUP, while remote_spawn does not, if we # used remote_exec, the test program would start with SIGHUP ignored # when run standalone, but not when run through gdb. set res [remote_spawn target "$binfile-standalone"] if { $res < 0 || $res == "" } { untested "spawning $binfile-standalone failed" return 1 } else { pass "collect standalone signals state" } remote_close target # Now run the program through gdb, and dump its initial signal actions # and mask in "gdb.txt". clean_restart $binfile if { ! [ runto_main ] } then { untested "failed to compile" return -1 } gdb_continue_to_end "collect signals state under gdb" if {!$purely_local} { # Copy file from target to host through build. remote_download host [remote_upload target gdb.txt] gdb.txt remote_download host [remote_upload target standalone.txt] standalone.txt } # Diff the .txt files. They should be identical. gdb_test "shell diff -s $standalone_txt $gdb_txt" \ "Files .* are identical.*" \ "signals states are identical"