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
|
# Copyright 2011 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/>.
# This file was written by Justin Lebar. (justin.lebar@gmail.com)
#
# Tests skipping shared libraries.
#
# This only works on GNU/Linux.
if { ![isnative] || [is_remote host] || ![istarget *-linux*] || [skip_shlib_tests]} {
continue
}
set test "skip-solib"
set srcfile_main "${test}-main.c"
set binfile_main "${test}-test"
set srcfile_lib "${test}-lib.c"
set libname "lib${test}"
set binfile_lib ${objdir}/${subdir}/${libname}.so
#
# Compile our program under test. The main program references a shared library
# libskip-solib.so, which contains two functions, square(), which is
# referenced by the main program, and multiply(), which is not referenced by
# the main program.
#
if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-fPIC -Wl,-soname,${libname}.so]] != ""} {
return -1
}
if {[gdb_compile "${srcdir}/${subdir}/${srcfile_main}" "${binfile_main}.o" object debug] != ""} {
return -1
}
if {[gdb_compile "${binfile_main}.o" "${binfile_main}" executable \
[list debug "additional_flags=-L${objdir}/${subdir} -l${test} \
-Wl,-rpath=${objdir}/${subdir}"]] != ""} {
return -1
}
gdb_start
clean_restart ${binfile_main}
#
# At this point, if we try to skip the file ${srcfile_lib} or the function
# multiply(), we should get a prompt asking us if we want to enable the
# skip entry pending a shared library load.
#
gdb_test "skip file ${srcfile_lib}" \
"File ${srcfile_lib} will be skipped when stepping." \
"ignoring file in solib" \
"No source file named ${srcfile_lib}.*
Ignore file pending future shared library load.*" \
"y"
#
# Does info skip list this entry as pending?
#
gdb_test "info skip" \
"Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+file\\s+y\\s+\\s+${srcfile_lib} \\(PENDING\\)\\s*" \
"info skip with pending file"
if ![runto_main] { fail "skip tests suppressed" }
#
# We shouldn't step into square(), since we skipped skip-solib-lib.c.
#
gdb_test "step" ""
gdb_test "bt" "#0\\s+main.*" "step after ignoring solib file."
#
# Our entry should no longer be pending. Note that we unfortunately need to do
# at least one step before the entry will be unmarked as pending.
#
gdb_test "info skip" \
"Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+file\\s+y\\s+\\s+.*${srcfile_lib}\\s*" \
"info skip with pending file"
#
# Now restart gdb and testing ignoring of a function inside a solib.
#
gdb_exit
gdb_start
clean_restart ${binfile_main}
gdb_test "skip function multiply" \
"Function multiply will be skipped when stepping, pending shared library load." \
"ignoring function in solib" \
"No function found named multiply..*
Ignore function pending future shared library load.*" \
"y"
if ![runto_main] { fail "skip tests suppressed" }
#
# Our first step should take us into square.
#
gdb_test "step" "square.*"
#
# Now our entry should no longer be pending.
#
gdb_test "info skip" \
"Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
1\\s+function\\s+y\\s+0x\[0-9a-f\]+\\s+multiply at .*${srcfile_lib}:.*\\s*" \
"skip should no longer be pending."
#
# This step shouldn't go into multiply -- we should skip it and go on to the
# last line of square.
#
gdb_test "step" ""
gdb_test "bt" "#0\\s+square.*"
|