1 # Copyright 2020-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 # Test to reproduce the crash described in PR 26813. 17 # 18 # When reading a list in any table in the .debug_rnglists section, GDB would 19 # read the header at offset 0 in the section (the header of the first table). 20 # When the index of the list we read was greater than the number of lists of 21 # the first table, GDB would erroneously report that the index is invalid. 22 # 23 # So this test creates a .debug_rnglists section with two tables. The second 24 # table has more lists than the first one and we try to read a high index in 25 # the second table. 26 27 load_lib dwarf.exp 28 29 require dwarf2_support 30 31 # Test with 32-bit and 64-bit DWARF. 32 foreach_with_prefix is_64 {false true} { 33 if { $is_64 } { 34 standard_testfile main.c -dw64.S 35 set testfile ${testfile}-dw64 36 } else { 37 standard_testfile main.c -dw32.S 38 set testfile ${testfile}-dw32 39 } 40 41 set asm_file [standard_output_file $srcfile2] 42 Dwarf::assemble $asm_file { 43 global is_64 44 45 # The CU uses the DW_FORM_rnglistx form to refer to the .debug_rnglists 46 # section. 47 cu { 48 version 5 49 is_64 $is_64 50 } { 51 DW_TAG_compile_unit { 52 {DW_AT_ranges 1 DW_FORM_rnglistx} 53 {DW_AT_rnglists_base cu_table DW_FORM_sec_offset} 54 } { 55 # This tests a DW_AT_ranges attribute of form DW_FORM_rnglistx on a 56 # function, which was buggy at some point. 57 DW_TAG_subprogram { 58 {DW_AT_name "foo"} 59 {DW_AT_ranges 2 DW_FORM_rnglistx} 60 } 61 } 62 } 63 64 rnglists {is-64 $is_64} { 65 # This table is unused, but exists so that the used table is not at 66 # the beginning of the section. 67 table {} { 68 list_ { 69 start_end 0x1000 0x2000 70 } 71 } 72 73 # The lists in this table are accessed by index (DW_FORM_rnglistx). 74 table {post-header-label cu_table} { 75 # This list is unused, but exists to offset the next ones. 76 list_ { 77 start_end 0x2000 0x3000 78 } 79 80 # For the CU. 81 list_ { 82 start_end 0x3000 0x4000 83 } 84 85 # For function foo. 86 list_ { 87 start_end 0x3000 0x3010 88 } 89 } 90 } 91 } 92 93 if { [prepare_for_testing "failed to prepare" ${testfile} \ 94 [list $srcfile $asm_file] {nodebug}] } { 95 return -1 96 } 97 98 # Sanity checks to make sure GDB slurped the symbols correctly. 99 gdb_test "p/x &foo" " = 0x3000" 100 } 101