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
|
# Copyright 2012-2015 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 "Could not compile $binfile_lib1."
return -1
}
if { [gdb_compile_shlib $srcfile_lib2 $binfile_lib2 \
[list additional_flags=-fPIC]] != "" } {
untested "Could not compile $binfile_lib2."
return -1
}
set cflags "$define1 $define2"
if { [prepare_for_testing $testfile.exp $testfile $srcfile \
[list additional_flags=$cflags libs=-ldl]] } {
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
|