Index: gdb/testsuite/gdb.base/info-shared.exp |
diff --git a/gdb/testsuite/gdb.base/info-shared.exp b/gdb/testsuite/gdb.base/info-shared.exp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ab0961765ba56fac1bd88b98c561c96707a1706f |
--- /dev/null |
+++ b/gdb/testsuite/gdb.base/info-shared.exp |
@@ -0,0 +1,146 @@ |
+# Copyright 2012-2013 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 |