1# Copyright 2010-2020 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
16if {[skip_shlib_tests]} {
17    return 0
18}
19
20if {[is_remote target]} {
21    # gdbserver prints the warning message but expect is parsing only the GDB
22    # output, not the gdbserver output.
23    return 0
24}
25
26set testfile "solib-corrupted"
27set srcfile start.c
28
29if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
30    return -1
31}
32
33if ![runto_main] {
34    fail "can't run to main"
35    return
36}
37
38# With probes interface GDB no longer scans the inferior library list so its
39# corruption cannot be tested.  There is no way to disable the probes
40# interface.
41
42set probes { init_start init_complete map_start reloc_complete unmap_start
43	     unmap_complete }
44set test "info probes"
45gdb_test_multiple $test $test {
46    -re "^stap\[ \t\]+rtld\[ \t\]+(?:rtld_)?(\[a-z_\]+)\[ \t\]" {
47	set idx [lsearch -exact $probes $expect_out(1,string)]
48	if { $idx >= 0 } {
49	    set probes [lreplace $probes $idx $idx]
50	}
51	exp_continue
52    }
53    -re "^\[^\r\n\]*\r\n" {
54	exp_continue
55    }
56    -re "^$gdb_prompt $" {
57    }
58}
59if { [llength $probes] == 0 } {
60    xfail $test
61    untested "GDB is using probes"
62    return
63}
64
65gdb_test "info sharedlibrary" "From * To .*" "normal list"
66
67# GDB checks there for matching L_PREV.
68set test "make solibs looping"
69gdb_test_multiple "p/x _r_debug->r_map->l_next = _r_debug->r_map" $test {
70    -re "(No symbol \"_r_debug\" in current context\\.|Attempt to extract a component of a value that is not a structure pointer\\.)\r\n$gdb_prompt $" {
71	# glibc debug info is not available and it is too difficult to find and
72	# parse it from this testcase without the gdb supporting functions.
73	xfail $test
74	untested "no _r_debug symbol has been found"
75	return
76    }
77    -re " = 0x\[0-9a-f\]+\r\n$gdb_prompt $" {
78	pass $test
79    }
80}
81gdb_test "info sharedlibrary" "warning: Corrupted shared library list: .*" "corrupted list"
82