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