aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/info-shared.exp
blob: e1314bf5dd79515749815adb012fdfcae6a6267d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# Copyright 2012-2019 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 <http://www.gnu.org/licenses/>.

if { [skip_shlib_tests] } {
    return 0
}

standard_testfile

set lib1name $testfile-solib1
set srcfile_lib1 $srcdir/$subdir/$lib1name.c
set binfile_lib1 [standard_output_file $lib1name.so]
set define1 -DSHLIB1_NAME=\"$binfile_lib1\"

set lib2name $testfile-solib2
set srcfile_lib2 $srcdir/$subdir/$lib2name.c
set binfile_lib2 [standard_output_file $lib2name.so]
set define2 -DSHLIB2_NAME=\"$binfile_lib2\"

if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \
	  [list additional_flags=-fPIC]] != "" } {
    untested "failed to compile shared library 1"
    return -1
}

if { [gdb_compile_shlib $srcfile_lib2 $binfile_lib2 \
	  [list additional_flags=-fPIC]] != "" } {
    untested "failed to compile shared library 2"
    return -1
}

set cflags "$define1 $define2"
if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
	  [list additional_flags=$cflags shlib_load]] } {
    return -1
}

# Run "info sharedlibrary" and check for the presence or absence of
# our libraries.
proc check_info_shared { test expect1 expect2 } {
    global lib1name
    global lib2name
    global gdb_prompt

    set actual1 0
    set actual2 0

    gdb_test_multiple "info sharedlibrary" $test {
	-re $lib1name {
	    set actual1 1
	    exp_continue
	}
	-re $lib2name {
	    set actual2 1
	    exp_continue
	}
	-re "\r\n$gdb_prompt $" {
	    if { $actual1 == $expect1 && $actual2 == $expect2 } {
		pass $test
	    } else {
		fail $test
	    }
	}
    }
}

# Start the inferior, and check neither of the libraries are loaded at
# the start.
if ![runto_main] {
    return 0
}
check_info_shared "info sharedlibrary #1" 0 0

# Set up breakpoints.
gdb_breakpoint "stop"
gdb_breakpoint "foo" allow-pending
gdb_breakpoint "bar" allow-pending

# Run to the first stop and check that only the first library is loaded.
gdb_continue_to_breakpoint "library load #1" "\\.?stop .*"
check_info_shared "info sharedlibrary #2" 1 0

# Run to the second stop and check that both libraries are loaded.
gdb_continue_to_breakpoint "library load #2" "\\.?stop .*"
check_info_shared "info sharedlibrary #3" 1 1

# Check that the next stop is in foo.
gdb_continue_to_breakpoint "library function #1" "\\.?foo .*"

# Check that the next stop is in bar.
gdb_continue_to_breakpoint "library function #2" "\\.?bar .*"

# Restart the inferior and make sure there are no breakpoint reset
# errors.  These can happen with the probes-based runtime linker
# interface if the cache is not cleared correctly.
set test "restart"
gdb_run_cmd
gdb_test_multiple "" $test {
    -re {Start it from the beginning\? \(y or n\) $} {
	send_gdb "y\n"
	exp_continue
    }
    -re {Error in re-setting breakpoint} {
	fail $test
    }
    -re "\r\n$gdb_prompt $" {
	pass $test
    }
}

# Check that neither library is loaded.
check_info_shared "info sharedlibrary #4" 0 0

# Run to the first stop and check that only the first library is loaded.
gdb_continue_to_breakpoint "library load #3" "\\.?stop .*"
check_info_shared "info sharedlibrary #5" 1 0

# Run to the second stop and check that both libraries are loaded.
gdb_continue_to_breakpoint "library load #4" "\\.?stop .*"
check_info_shared "info sharedlibrary #6" 1 1

# Check that the next stop is in foo.
gdb_continue_to_breakpoint "library function #3" "\\.?foo .*"

# Check that the next stop is in bar.
gdb_continue_to_breakpoint "library function #4" "\\.?bar .*"

# Run to the next stop and check that the first library has been unloaded.
gdb_continue_to_breakpoint "library unload #1" "\\.?stop .*"
check_info_shared "info sharedlibrary #7" 0 1

# Run to the last stop and check that both libraries are gone.
gdb_continue_to_breakpoint "library unload #2" "\\.?stop .*"
check_info_shared "info sharedlibrary #8" 0 0

with_test_prefix styled {
    save_vars { env(TERM) } {
	# We need an ANSI-capable terminal to get the output.
	setenv TERM ansi

	clean_restart $testfile

	gdb_test_no_output "set style enabled off"
	if {![runto_main]} {
	    return 0
	}
	gdb_breakpoint "stop"
	gdb_continue_to_breakpoint "library load #1" "\\.?stop .*"

	# Simple test for "info sharedlibrary" styling.  Look for styled
	# addresses and file name.
	set addr "\033\\\[34m${hex}\033\\\[m"
	set sofile "\033\\\[32m\[^\033\]+\033\\\[m"
	gdb_test_no_output "set style enabled on"
	gdb_test "info sharedlibrary" \
	    "$addr\[ \t\]+$addr.*$sofile\r\n.*"
    }
}