# Copyright 2010-2025 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 . standard_testfile .c # If we're using a stub, breakpoints at the entry point will not trigger. # See also the comment in break-entry.exp. require !use_gdb_stub # default_target_compile would otherwise add "-lm" making the testcase # dependent on whether the system libraries are already prelinked. # prelink: Could not set /lib64/libm-2.11.1.so owner or mode: Operation not permitted set compile { gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $opts } foreach_with_prefix pie { "nopie" "pie" } { # OPTS and BINFILE are used by the COMPILE string (defined above) # when it is evaluated below. set opts [list debug additional_flags=-nostdlib $pie] set binfile [standard_output_file $testfile-$pie] set board [target_info name] if [board_info $board exists mathlib] { set mathlib [board_info $dest mathlib] set_board_info mathlib "" set err [eval $compile] set_board_info mathlib $mathlib } else { set_board_info mathlib "" set err [eval $compile] unset_board_info mathlib } if {$err != ""} { untested "failed to compile" return -1 } clean_restart $binfile gdb_breakpoint "*marker" # Say we set a permanent breakpoint on *_start. When setting the # breakpoint, it will resolve to _start in the exec. # After starting to run, that may stay the same, and consequently # execution will stop there. # OTOH, after starting to run, that may change to *_start in the dynamic # linker, and consequently execution will stop there. # There's currently no way to enforce one or the other (PR32748). # # Say we run into a stop in *_start in the dynamic linker. Continuing # from this situation, the dynamic linker is reported as unloaded, which # makes the breakpoint resolve again to *_start in the exec, and # consequently execution will stop there as well. # # However, we cannot rely on this behavior either. Reporting the dynamic # linker as unloaded is a GLIBC bug, which may get fixed eventually. # # Instead of trying to cater for all these possibilities in a controlled # fashion, make the breakpoint temporary, ensuring that there will just be # one stop. gdb_breakpoint "*_start" temporary gdb_run_cmd # Breakpoint 2, Stopped due to shared library event # _start () at ./gdb.base/nostdlib.c:20 gdb_test "" {Temporary breakpoint [0-9]+, .*_start .*} "stop at run" gdb_test "continue" {Breakpoint [0-9]+, marker .*} "continue to marker" # When compiling as PIE the executable will be a dynamic # executable, the dynamic linker performs the PIE relocation. # Some versions of glibc would (possibly due to a bug) report the # dynamic linker as unmapped during startup, which places the # 'shlib event' breakpoint(s) into the PENDING state. # # At one point trying to print these internal breakpoints in a # PENDING state would crash GDB, so lets make sure that doesn't # happen now. We don't really care about the exact output, # gdb_test will spot if running this command crashes GDB, which is # all we're really checking for. gdb_test "maint info breakpoints" ".*" }