xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.base/solib.exp (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis#   Copyright 1997, 1998, 1999 Free Software Foundation, Inc.
2*b725ae77Skettenis
3*b725ae77Skettenis# This program is free software; you can redistribute it and/or modify
4*b725ae77Skettenis# it under the terms of the GNU General Public License as published by
5*b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or
6*b725ae77Skettenis# (at your option) any later version.
7*b725ae77Skettenis#
8*b725ae77Skettenis# This program is distributed in the hope that it will be useful,
9*b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of
10*b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*b725ae77Skettenis# GNU General Public License for more details.
12*b725ae77Skettenis#
13*b725ae77Skettenis# You should have received a copy of the GNU General Public License
14*b725ae77Skettenis# along with this program; if not, write to the Free Software
15*b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
16*b725ae77Skettenis
17*b725ae77Skettenis# Please email any bugs, comments, and/or additions to this file to:
18*b725ae77Skettenis# bug-gdb@prep.ai.mit.edu
19*b725ae77Skettenis
20*b725ae77Skettenisif $tracelevel then {
21*b725ae77Skettenis	strace $tracelevel
22*b725ae77Skettenis	}
23*b725ae77Skettenis
24*b725ae77Skettenisset prms_id 0
25*b725ae77Skettenisset bug_id 0
26*b725ae77Skettenis
27*b725ae77Skettenis# are we on a target board
28*b725ae77Skettenisif ![isnative] then {
29*b725ae77Skettenis    return
30*b725ae77Skettenis}
31*b725ae77Skettenis
32*b725ae77Skettenis# This test is presently only valid on HP-UX.  It verifies GDB's
33*b725ae77Skettenis# ability to catch loads and unloads of shared libraries.
34*b725ae77Skettenis#
35*b725ae77Skettenis
36*b725ae77Skettenis#setup_xfail "*-*-*"
37*b725ae77Skettenis#clear_xfail "hppa*-*-*hpux*"
38*b725ae77Skettenisif {![istarget "hppa*-*-hpux*"]} {
39*b725ae77Skettenis    return 0
40*b725ae77Skettenis}
41*b725ae77Skettenis
42*b725ae77Skettenisset testfile "solib"
43*b725ae77Skettenisset srcfile ${testfile}.c
44*b725ae77Skettenisset binfile ${objdir}/${subdir}/${testfile}
45*b725ae77Skettenis
46*b725ae77Skettenis# build the first test case
47*b725ae77Skettenisif  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
48*b725ae77Skettenis     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
49*b725ae77Skettenis}
50*b725ae77Skettenis
51*b725ae77Skettenisif [get_compiler_info ${binfile}] {
52*b725ae77Skettenis    return -1
53*b725ae77Skettenis}
54*b725ae77Skettenis
55*b725ae77Skettenis# Build the shared libraries this test case needs.
56*b725ae77Skettenis#
57*b725ae77Skettenis#cd ${subdir}
58*b725ae77Skettenis#remote_exec build "$CC -g +z -c ${testfile}1.c -o ${testfile}1.o"
59*b725ae77Skettenis#remote_exec build "$CC -g +z -c ${testfile}2.c -o ${testfile}2.o"
60*b725ae77Skettenis
61*b725ae77Skettenisif {$gcc_compiled == 0} {
62*b725ae77Skettenis    if [istarget "hppa*-hp-hpux*"] then {
63*b725ae77Skettenis	set additional_flags "additional_flags=+z"
64*b725ae77Skettenis    } else {
65*b725ae77Skettenis	# don't know what the compiler is...
66*b725ae77Skettenis	set additional_flags ""
67*b725ae77Skettenis    }
68*b725ae77Skettenis} else {
69*b725ae77Skettenis    set additional_flags "additional_flags=-fpic"
70*b725ae77Skettenis}
71*b725ae77Skettenis
72*b725ae77Skettenisif {[gdb_compile "${srcdir}/${subdir}/${testfile}1.c" "${binfile}1.o" object [list debug $additional_flags]] != ""} {
73*b725ae77Skettenis    perror "Couldn't compile ${testfile}1.c"
74*b725ae77Skettenis    #return -1
75*b725ae77Skettenis}
76*b725ae77Skettenisif {[gdb_compile "${srcdir}/${subdir}/${testfile}2.c" "${binfile}2.o" object [list debug, $additional_flags]] != ""} {
77*b725ae77Skettenis    perror "Couldn't compile ${testfile}2.c"
78*b725ae77Skettenis    #return -1
79*b725ae77Skettenis}
80*b725ae77Skettenis
81*b725ae77Skettenisif [istarget "hppa*-*-hpux*"] {
82*b725ae77Skettenis    remote_exec build "ld -b ${binfile}1.o -o ${binfile}1.sl"
83*b725ae77Skettenis    remote_exec build "ld -b ${binfile}2.o -o ${binfile}2.sl"
84*b725ae77Skettenis} else {
85*b725ae77Skettenis    set additional_flags "additional_flags=-shared"
86*b725ae77Skettenis    gdb_compile "${binfile}1.o" "${binfile}1.sl" executable [list debug $additional_flags]
87*b725ae77Skettenis    gdb_compile "${binfile}2.o" "${binfile}2.sl" executable [list debug $additional_flags]
88*b725ae77Skettenis}
89*b725ae77Skettenis
90*b725ae77Skettenis# Build a version where the main program is in a shared library.  For
91*b725ae77Skettenis# testing an indirect call made in a shared library.
92*b725ae77Skettenis
93*b725ae77Skettenisif {[gdb_compile "${srcdir}/${subdir}/${testfile}.c" "${binfile}_sl.o" object [list debug $additional_flags]] != ""} {
94*b725ae77Skettenis    perror "Couldn't compile ${testfile}.c for ${binfile}_sl.o"
95*b725ae77Skettenis    #return -1
96*b725ae77Skettenis}
97*b725ae77Skettenis
98*b725ae77Skettenisif { [istarget "hppa*-*-hpux*"] } {
99*b725ae77Skettenis    remote_exec build "ld -b ${binfile}_sl.o -o ${binfile}_sl.sl"
100*b725ae77Skettenis} else {
101*b725ae77Skettenis    set additional_flags "additional_flags=-shared"
102*b725ae77Skettenis    gdb_compile "${binfile}_sl.o" "${binfile}_sl.sl" executable [list debug $additional_flags]
103*b725ae77Skettenis}
104*b725ae77Skettenis
105*b725ae77Skettenisif { [istarget "hppa*-*-hpux*"] } {
106*b725ae77Skettenis    set additional_flags "-Wl,-u,main"
107*b725ae77Skettenis    if { [gdb_compile "${binfile}_sl.sl" "${binfile}_sl" executable [list debug $additional_flags]] != "" } {
108*b725ae77Skettenis        gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
109*b725ae77Skettenis    }
110*b725ae77Skettenis} else {
111*b725ae77Skettenis    # FIXME: need to fill this part in for non-HP build
112*b725ae77Skettenis}
113*b725ae77Skettenis
114*b725ae77Skettenis#cd ..
115*b725ae77Skettenis
116*b725ae77Skettenis# Start with a fresh gdb
117*b725ae77Skettenis
118*b725ae77Skettenisgdb_exit
119*b725ae77Skettenisgdb_start
120*b725ae77Skettenisgdb_reinitialize_dir $srcdir/$subdir
121*b725ae77Skettenisgdb_load ${binfile}
122*b725ae77Skettenis
123*b725ae77Skettenis# This program manually loads and unloads SOM shared libraries, via calls
124*b725ae77Skettenis# to shl_load and shl_unload.
125*b725ae77Skettenis#
126*b725ae77Skettenisif ![runto_main] then { fail "catch load/unload tests suppressed" }
127*b725ae77Skettenis
128*b725ae77Skettenis# Verify that we complain if the user tells us to catch something we
129*b725ae77Skettenis# don't understand.
130*b725ae77Skettenis#
131*b725ae77Skettenissend_gdb "catch a_cold\n"
132*b725ae77Skettenisgdb_expect {
133*b725ae77Skettenis  -re "Unknown event kind specified for catch.*$gdb_prompt $"\
134*b725ae77Skettenis          {pass "bogus catch kind is disallowed"}
135*b725ae77Skettenis  -re "$gdb_prompt $"\
136*b725ae77Skettenis          {fail "bogus catch kind is disallowed"}
137*b725ae77Skettenis  timeout {fail "(timeout) bogus catch kind is disallowed"}
138*b725ae77Skettenis}
139*b725ae77Skettenis
140*b725ae77Skettenis# Verify that we can set a generic catchpoint on shlib loads.  I.e., that
141*b725ae77Skettenis# we can catch any shlib load, without specifying the name.
142*b725ae77Skettenis#
143*b725ae77Skettenissend_gdb "catch load\n"
144*b725ae77Skettenisgdb_expect {
145*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .load <any library>.*$gdb_prompt $"\
146*b725ae77Skettenis          {pass "set generic catch load"}
147*b725ae77Skettenis  -re "$gdb_prompt $"\
148*b725ae77Skettenis          {fail "set generic catch load"}
149*b725ae77Skettenis  timeout {fail "(timeout) set generic catch load"}
150*b725ae77Skettenis}
151*b725ae77Skettenis
152*b725ae77Skettenissend_gdb "continue\n"
153*b725ae77Skettenisgdb_expect {
154*b725ae77Skettenis  -re "Catchpoint \[0-9\] .loaded gdb.base/solib1.sl.*$gdb_prompt $"\
155*b725ae77Skettenis          {pass "caught generic solib load"}
156*b725ae77Skettenis  -re "$gdb_prompt $"\
157*b725ae77Skettenis          {fail "caught generic solib load"}
158*b725ae77Skettenis  timeout {fail "(timeout) caught generic solib load"}
159*b725ae77Skettenis}
160*b725ae77Skettenis
161*b725ae77Skettenis# Set a breakpoint on the line following the shl_load call, and
162*b725ae77Skettenis# continue.
163*b725ae77Skettenis#
164*b725ae77Skettenis# ??rehrauer: It appears that we can't just say "finish" from here;
165*b725ae77Skettenis# GDB is getting confused by the dld's presense on the stack.
166*b725ae77Skettenis#
167*b725ae77Skettenissend_gdb "break 27\n"
168*b725ae77Skettenisgdb_expect {
169*b725ae77Skettenis  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
170*b725ae77Skettenis          {pass "set break after shl_load"}
171*b725ae77Skettenis  -re "$gdb_prompt $"\
172*b725ae77Skettenis          {fail "set break after shl_load"}
173*b725ae77Skettenis  timeout {fail "(timeout) set break after shl_load"}
174*b725ae77Skettenis}
175*b725ae77Skettenis
176*b725ae77Skettenissend_gdb "continue\n"
177*b725ae77Skettenisgdb_expect {
178*b725ae77Skettenis  -re "Breakpoint \[0-9\]*, main .. at .*solib.c:27.*$gdb_prompt $"\
179*b725ae77Skettenis          {pass "continue after generic catch load"}
180*b725ae77Skettenis  -re "$gdb_prompt $"\
181*b725ae77Skettenis          {fail "continue after generic catch load"}
182*b725ae77Skettenis  timeout {fail "(timeout) continue after generic catch load"}
183*b725ae77Skettenis}
184*b725ae77Skettenis
185*b725ae77Skettenis# Step over the call to shl_findsym.
186*b725ae77Skettenis#
187*b725ae77Skettenis# ??rehrauer: In theory, since the call to shl_load asked for
188*b725ae77Skettenis# immediate binding of the shlib's symbols, and since the
189*b725ae77Skettenis# shlib's symbols should have been auto-loaded, we ought to
190*b725ae77Skettenis# be able to set a breakpoint on solib_main now.  However,
191*b725ae77Skettenis# that seems not to be the case.  Dunno why for sure; perhaps
192*b725ae77Skettenis# the breakpoint wants to be set on an import stub in the
193*b725ae77Skettenis# main program for solib_main?  There wouldn't be one, in
194*b725ae77Skettenis# this case...
195*b725ae77Skettenis#
196*b725ae77Skettenissend_gdb "next\n"
197*b725ae77Skettenisgdb_expect {
198*b725ae77Skettenis  -re "$gdb_prompt $"\
199*b725ae77Skettenis          {pass "step over shl_findsym"}
200*b725ae77Skettenis  timeout {fail "(timeout) step over shl_findsym"}
201*b725ae77Skettenis}
202*b725ae77Skettenis
203*b725ae77Skettenis# Verify that we can catch an unload of any library.
204*b725ae77Skettenis#
205*b725ae77Skettenissend_gdb "catch unload\n"
206*b725ae77Skettenisgdb_expect {
207*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .unload <any library>.*$gdb_prompt $"\
208*b725ae77Skettenis          {pass "set generic catch unload"}
209*b725ae77Skettenis  -re "$gdb_prompt $"\
210*b725ae77Skettenis          {fail "set generic catch unload"}
211*b725ae77Skettenis  timeout {fail "(timeout) set generic catch load"}
212*b725ae77Skettenis}
213*b725ae77Skettenis
214*b725ae77Skettenissend_gdb "continue\n"
215*b725ae77Skettenisgdb_expect {
216*b725ae77Skettenis  -re "Catchpoint \[0-9\] .unloaded gdb.base/solib1.sl.*$gdb_prompt $"\
217*b725ae77Skettenis          {pass "caught generic solib unload"}
218*b725ae77Skettenis  -re "$gdb_prompt $"\
219*b725ae77Skettenis          {fail "caught generic solib unload"}
220*b725ae77Skettenis  timeout {fail "(timeout) caught generic solib unload"}
221*b725ae77Skettenis}
222*b725ae77Skettenis
223*b725ae77Skettenis# Verify that we can catch a load of a specific library.  (Delete
224*b725ae77Skettenis# all the other catchpoints first, so that the generic catchpoints
225*b725ae77Skettenis# we've previously set don't trigger.)
226*b725ae77Skettenis#
227*b725ae77Skettenissend_gdb "delete\n"
228*b725ae77Skettenisgdb_expect {
229*b725ae77Skettenis  -re "Delete all breakpoints.*y or n.*"\
230*b725ae77Skettenis          {send_gdb "y\n"
231*b725ae77Skettenis           gdb_expect {
232*b725ae77Skettenis             -re "$gdb_prompt $"\
233*b725ae77Skettenis                     {pass "delete all catchpoints"}
234*b725ae77Skettenis             timeout {fail "(timeout) delete all catchpoints"}
235*b725ae77Skettenis           }
236*b725ae77Skettenis          }
237*b725ae77Skettenis  -re "$gdb_prompt $"\
238*b725ae77Skettenis          {fail "delete all catchpoints"}
239*b725ae77Skettenis  timeout {fail "(timeout) delete all catchpoints"}
240*b725ae77Skettenis}
241*b725ae77Skettenis
242*b725ae77Skettenissend_gdb "catch load gdb.base/solib2.sl\n"
243*b725ae77Skettenisgdb_expect {
244*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .load gdb.base/solib2.sl.*$gdb_prompt $"\
245*b725ae77Skettenis          {pass "set specific catch load"}
246*b725ae77Skettenis  -re "$gdb_prompt $"\
247*b725ae77Skettenis          {fail "set specific catch load"}
248*b725ae77Skettenis  timeout {fail "(timeout) set specific catch load"}
249*b725ae77Skettenis}
250*b725ae77Skettenis
251*b725ae77Skettenissend_gdb "continue\n"
252*b725ae77Skettenisgdb_expect {
253*b725ae77Skettenis  -re "Catchpoint \[0-9\] .loaded gdb.base/solib2.sl.*$gdb_prompt $"\
254*b725ae77Skettenis          {pass "caught specific solib load"}
255*b725ae77Skettenis  -re "$gdb_prompt $"\
256*b725ae77Skettenis          {fail "caught specific solib load"}
257*b725ae77Skettenis  timeout {fail "(timeout) caught specific solib load"}
258*b725ae77Skettenis}
259*b725ae77Skettenis
260*b725ae77Skettenis# Verify that we can catch an unload of a specific library.
261*b725ae77Skettenis#
262*b725ae77Skettenissend_gdb "catch unload gdb.base/solib2.sl\n"
263*b725ae77Skettenisgdb_expect {
264*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .unload gdb.base/solib2.sl.*$gdb_prompt $"\
265*b725ae77Skettenis          {pass "set specific catch unload"}
266*b725ae77Skettenis  -re "$gdb_prompt $"\
267*b725ae77Skettenis          {fail "set specific catch unload"}
268*b725ae77Skettenis  timeout {fail "(timeout) set specific catch unload"}
269*b725ae77Skettenis}
270*b725ae77Skettenis
271*b725ae77Skettenissend_gdb "continue\n"
272*b725ae77Skettenisgdb_expect {
273*b725ae77Skettenis  -re "Catchpoint \[0-9\] .unloaded gdb.base/solib2.sl.*$gdb_prompt $"\
274*b725ae77Skettenis          {pass "caught specific solib unload"}
275*b725ae77Skettenis  -re "$gdb_prompt $"\
276*b725ae77Skettenis          {fail "caught specific solib unload"}
277*b725ae77Skettenis  timeout {fail "(timeout) caught specific solib unload"}
278*b725ae77Skettenis}
279*b725ae77Skettenis
280*b725ae77Skettenis# Verify that we can set a catchpoint on a specific library that
281*b725ae77Skettenis# happens not to be loaded by the program.  And, that this catchpoint
282*b725ae77Skettenis# won't trigger inappropriately when other shlibs are loaded.
283*b725ae77Skettenis#
284*b725ae77Skettenissend_gdb "break 55\n"
285*b725ae77Skettenisgdb_expect {
286*b725ae77Skettenis  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
287*b725ae77Skettenis          {pass "set break on shl_unload"}
288*b725ae77Skettenis  -re "$gdb_prompt $"\
289*b725ae77Skettenis          {fail "set break on shl_unload"}
290*b725ae77Skettenis  timeout {fail "(timeout) set break on shl_unload"}
291*b725ae77Skettenis}
292*b725ae77Skettenis
293*b725ae77Skettenissend_gdb "break 58\n"
294*b725ae77Skettenisgdb_expect {
295*b725ae77Skettenis  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
296*b725ae77Skettenis          {pass "set break after shl_unload"}
297*b725ae77Skettenis  -re "$gdb_prompt $"\
298*b725ae77Skettenis          {fail "set break after shl_unload"}
299*b725ae77Skettenis  timeout {fail "(timeout) set break after shl_unload"}
300*b725ae77Skettenis}
301*b725ae77Skettenis
302*b725ae77Skettenissend_gdb "catch load foobar.sl\n"
303*b725ae77Skettenisgdb_expect {
304*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .load foobar.sl.*$gdb_prompt $"\
305*b725ae77Skettenis          {pass "set specific catch load for nonloaded shlib"}
306*b725ae77Skettenis  -re "$gdb_prompt $"\
307*b725ae77Skettenis          {fail "set specific catch load for nonloaded shlib"}
308*b725ae77Skettenis  timeout {fail "(timeout) set specific catch load for nonloaded shlib"}
309*b725ae77Skettenis}
310*b725ae77Skettenis
311*b725ae77Skettenissend_gdb "catch unload foobar.sl\n"
312*b725ae77Skettenisgdb_expect {
313*b725ae77Skettenis  -re "Catchpoint \[0-9\]* .unload foobar.sl.*$gdb_prompt $"\
314*b725ae77Skettenis          {pass "set specific catch unload for nonloaded shlib"}
315*b725ae77Skettenis  -re "$gdb_prompt $"\
316*b725ae77Skettenis          {fail "set specific catch unload for nonloaded shlib"}
317*b725ae77Skettenis  timeout {fail "(timeout) set specific catch unload for nonloaded shlib"}
318*b725ae77Skettenis}
319*b725ae77Skettenis
320*b725ae77Skettenissend_gdb "continue\n"
321*b725ae77Skettenisgdb_expect {
322*b725ae77Skettenis  -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\
323*b725ae77Skettenis          {pass "specific catch load doesn't trigger inappropriately"}
324*b725ae77Skettenis  -re "$gdb_prompt $"\
325*b725ae77Skettenis          {fail "specific catch load doesn't trigger inappropriately"}
326*b725ae77Skettenis  timeout {fail "(timeout) specific catch load doesn't trigger inappropriately"}
327*b725ae77Skettenis}
328*b725ae77Skettenis
329*b725ae77Skettenissend_gdb "continue\n"
330*b725ae77Skettenisgdb_expect {
331*b725ae77Skettenis  -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\
332*b725ae77Skettenis          {pass "specific catch unload doesn't trigger inappropriately"}
333*b725ae77Skettenis  -re "$gdb_prompt $"\
334*b725ae77Skettenis          {fail "specific catch unload doesn't trigger inappropriately"}
335*b725ae77Skettenis  timeout {fail "(timeout) specific catch unload doesn't trigger inappropriately"}
336*b725ae77Skettenis}
337*b725ae77Skettenis
338*b725ae77Skettenis# ??rehrauer: There ought to be testpoints here that verify that
339*b725ae77Skettenis# load/unload catchpoints can use conditionals, can be temporary,
340*b725ae77Skettenis# self-disabling, etc etc.
341*b725ae77Skettenis#
342*b725ae77Skettenis
343*b725ae77Skettenisgdb_exit
344*b725ae77Skettenis
345*b725ae77Skettenis#
346*b725ae77Skettenis# Test stepping into an indirect call in a shared library.
347*b725ae77Skettenis#
348*b725ae77Skettenis
349*b725ae77Skettenisgdb_start
350*b725ae77Skettenisgdb_load ${binfile}_sl
351*b725ae77Skettenisgdb_test "break main" ".*deferred. at .main..*" "break on main"
352*b725ae77Skettenisgdb_test "run" ".*Breakpoint.*main.*solib.c.*" "hit breakpoint at main"
353*b725ae77Skettenisgdb_test "break 45" "Breakpoint.*solib.c, line 45.*" "break on indirect call"
354*b725ae77Skettenisgdb_test "continue" "Continuing.*solib.c:45.*" \
355*b725ae77Skettenis	"continue to break on indirect call"
356*b725ae77Skettenisgdb_test "step" "solib_main.*solib1.c:17.*return arg.arg.*" \
357*b725ae77Skettenis	"step into indirect call from a shared library"
358*b725ae77Skettenisgdb_exit
359*b725ae77Skettenis
360*b725ae77Skettenisreturn 0
361