aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/unload.exp
blob: 5cd935a1292bbe51a92f990ec0eab80b000dfd00 (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
#   Copyright 2003-2017 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 created by Jeff Johnston. (jjohnstn@redhat.com)

#
# test running programs
#

if {[skip_shlib_tests]} {
    return 0
}

set testfile "unload"
set libfile "unloadshr"
set libfile2 "unloadshr2"
set libname "${libfile}.sl"
set libname2 "${libfile2}.sl"
set libsrcfile ${libfile}.c
set libsrcfile2 ${libfile2}.c
set srcfile $srcdir/$subdir/$testfile.c
set binfile [standard_output_file $testfile]
set shlibdir [standard_output_file {}]
set libsrc  $srcdir/$subdir/$libfile.c
set libsrc2  $srcdir/$subdir/$libfile2.c
set lib_sl  [standard_output_file $libname]
set lib_sl2  [standard_output_file $libname2]
set lib_dlopen [shlib_target_file ${libname}]
set lib_dlopen2 [shlib_target_file ${libname2}]
set lib_syms [shlib_symbol_file ${libname}]
set lib_syms2 [shlib_symbol_file ${libname2}]

if [get_compiler_info] {
    return -1
}

set lib_opts debug
set exec_opts [list debug shlib_load additional_flags=-DSHLIB_NAME=\"${lib_dlopen}\" additional_flags=-DSHLIB_NAME2=\"${lib_dlopen2}\"]

if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != ""
     || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""
     || [gdb_compile $srcfile $binfile executable $exec_opts] != ""} {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_load_shlib $lib_sl
gdb_load_shlib $lib_sl2

#
# Test setting a breakpoint in a dynamically loaded library which is
# manually loaded and unloaded
#

gdb_breakpoint "shrfunc1" allow-pending
gdb_breakpoint "shrfunc2" allow-pending

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *<PENDING> *shrfunc1\r?
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2" \
"pending breakpoint info before run"

set unloadshr_line [gdb_get_line_number "unloadshr break" ${libsrcfile}]

gdb_run_cmd
gdb_test "" \
"Breakpoint 1, shrfunc1 \\\(x=1\\\).*${libsrcfile}:$unloadshr_line.*" \
"running program"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc1 at .*
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2.*" \
"pending breakpoint info on first run at shrfunc1"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-1" $testfile.c]" temporary

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms}.*y-set-1.*" \
"continuing to unloaded libfile"

gdb_test "print y" " = 10" "print y from libfile"

#
# Try to rerun program and verify that shared breakpoint is reset properly
#

gdb_run_cmd
gdb_test "" \
"Breakpoint 1, shrfunc1 \\\(x=1\\\).*${libsrcfile}:$unloadshr_line.*" \
"rerun to shared library breakpoint"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc1 at .*
2\[\t \]+breakpoint     keep y *<PENDING> *shrfunc2.*" \
"pending breakpoint info on second run at shrfunc1"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-1" $testfile.c]" temporary

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms}.*y-set-1.*" \
"continuing to unloaded libfile"

set unloadshr_line2 [gdb_get_line_number "unloadshr2 break" ${libsrcfile2}]

gdb_test "continue" \
"Breakpoint 2, shrfunc2 \\\(x=2\\\).*${libsrcfile2}:$unloadshr_line2\r\n.*" \
"continue to shrfunc2"

gdb_test "info break" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What\r?
1\[\t \]+breakpoint     keep y *<PENDING> *shrfunc1\r?
\[\t \]+breakpoint already hit \[0-9\]+ (time|times)\r?
2\[\t \]+breakpoint     keep y *0x\[0-9a-f\]+ *in shrfunc2 at .*" \
"pending breakpoint info on second run at shrfunc2"

gdb_breakpoint "$testfile.c:[gdb_get_line_number "y-set-2" $testfile.c]"

gdb_test "continue" \
"Continuing.*warning: Temporarily disabling breakpoints for.*${lib_syms2}.*y-set-2.*" \
"continuing to unloaded libfile2"

gdb_test "print y" " = 200" "print y from libfile2"