1 # Copyright 2016-2024 Free Software Foundation, Inc. 2 3 # This program is free software; you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License as published by 5 # the Free Software Foundation; either version 3 of the License, or 6 # (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 # The purpose of this testcase is to verify that, when using a breakpoint 17 # location of the form "*<EXPR>" (Eg: "*main"), GDB is able to start 18 # the program and stop at the correct location. With programs built 19 # as PIE, this means that GDB needs to re-evaluate the location once 20 # the program as started, since PIE ensures that the address of all 21 # symbols have changed after load. 22 # 23 # PIE is not always supported by the target system, so instead of 24 # creating a testcase building executables with PIE, this testcase 25 # takes a slightly different approach. It builds a first program, 26 # breaks on *main, and then runs to that breakpoint. It then builds 27 # a second program, different from the first one, and loads that 28 # executable within the same GDB session. Similarly to the PIE case, 29 # the address of main should be different, and therefore GDB should 30 # recalculate it. We verify that by checking that running to that 31 # breakpoint still works, and that we land at the first instruction 32 # of that function in both cases. 33 34 set testfile1 "break-fun-addr1" 35 set srcfile1 ${testfile1}.c 36 set binfile1 [standard_output_file ${testfile1}] 37 38 if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug}] != "" } { 39 untested "failed to compile first testcase" 40 return -1 41 } 42 43 # Start the debugger with the first executable, put a breakpoint 44 # on the first instruction of function "main" ("*main"), then 45 # run to that breakpoint. 46 47 clean_restart ${binfile1} 48 49 with_test_prefix "${testfile1}" { 50 51 gdb_test "break *main" \ 52 "Breakpoint.*at.* file .*$srcfile1, line .*" \ 53 54 gdb_run_cmd 55 gdb_test "" \ 56 "Breakpoint.* main \\(\\) at .*$srcfile1:.*" \ 57 "run to breakpoint at *main" 58 59 # Verify also that we stopped at the start of the function... 60 gdb_test "p \$pc == main" " = 1" 61 } 62 63 set testfile2 "break-fun-addr2" 64 set srcfile2 ${testfile2}.c 65 set binfile2 [standard_output_file ${testfile2}] 66 67 if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } { 68 untested "failed to compile second testcase" 69 return -1 70 } 71 72 # Now, keeping the same GDB process (so as to keep the same breakpoint), 73 # start a new debugging session with a different executable. 74 gdb_load ${binfile2} 75 76 with_test_prefix "${testfile2}" { 77 78 gdb_run_cmd 79 gdb_test "" \ 80 "Breakpoint.* main \\(\\) at .*$srcfile2:.*" \ 81 "run to breakpoint at *main" 82 83 gdb_test "p \$pc == main" " = 1" 84 } 85