http://sourceware.org/ml/gdb-patches/2013-05/msg00630.html Subject: [RFA 7/7] Linker-debugger interface tests --DCA/C9WSnDtl50zu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This patch adds some testcases for the linker-debugger interface. --DCA/C9WSnDtl50zu Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="rtld-probes-7-tests-gb.patch" 2013-05-16 Gary Benson * gdb.base/break-probes.exp: New file. * gdb.base/break-probes.c: Likewise. * gdb.base/break-probes-solib.c: Likewise. * gdb.base/info-shared.exp: New file. * gdb.base/info-shared.c: Likewise. * gdb.base/info-shared-solib1.c: Likewise. * gdb.base/info-shared-solib2.c: Likewise. diff --git a/gdb/testsuite/gdb.base/break-probes.exp b/gdb/testsuite/gdb.base/break-probes.exp new file mode 100644 index 0000000..8372636 --- /dev/null +++ b/gdb/testsuite/gdb.base/break-probes.exp @@ -0,0 +1,77 @@ +# Copyright 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 . + +if { [skip_shlib_tests] } { + return 0 +} + +standard_testfile + +set libname $testfile-solib +set srcfile_lib $srcdir/$subdir/$libname.c +set binfile_lib [standard_output_file $libname.so] + +set normal_bp "_dl_debug_state" +set probes_bp "dl_main" + +if { [gdb_compile_shlib $srcfile_lib $binfile_lib \ + [list additional_flags=-fPIC]] != "" } { + untested "Could not compile $binfile_lib." + return -1 +} + +if { [prepare_for_testing $testfile.exp $testfile $srcfile \ + [list additional_flags=-DSHLIB_NAME\=\"$binfile_lib\" libs=-ldl]] } { + return -1 +} + +# Enable stop-on-solib-events +gdb_test_no_output "set stop-on-solib-events 1" + +# Start the inferior and run to the first stop +gdb_run_cmd +gdb_test "" ".*Stopped due to shared library event.*" + +# XFAIL if we are not using probes +set test "ensure using probes" +set using_probes 0 +gdb_test_multiple "bt" $test { + -re "#0 +\[^\r\n\]*\\m(__GI_)?$normal_bp\\M.*$gdb_prompt $" { + xfail $test + } + -re "#0 +\[^\r\n\]*\\m(__GI_)?$probes_bp\\M.*$gdb_prompt $" { + pass $test + set using_probes 1 + } +} + +if { $using_probes } { + # Run til it loads our library + set test "run til our library loads" + set loaded_library 0 + while { !$loaded_library } { + gdb_test_multiple "c" $test { + -re "Inferior loaded $binfile_lib\\M.*$gdb_prompt $" { + pass $test + set loaded_library 1 + } + -re "Stopped due to shared library event\\M.*$gdb_prompt $" { + } + } + } + + # Call something to ensure that relocation occurred + gdb_test "call foo(23)" "\\\$.* = 31.*\\\M.*" +} diff --git a/gdb/testsuite/gdb.base/break-probes.c b/gdb/testsuite/gdb.base/break-probes.c new file mode 100644 index 0000000..a778099 --- /dev/null +++ b/gdb/testsuite/gdb.base/break-probes.c @@ -0,0 +1,26 @@ +/* Copyright 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 . */ + +#include + +int +main () +{ + void *handle = dlopen (SHLIB_NAME, RTLD_LAZY); + + dlclose (handle); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/break-probes-solib.c b/gdb/testsuite/gdb.base/break-probes-solib.c new file mode 100644 index 0000000..bdde2db --- /dev/null +++ b/gdb/testsuite/gdb.base/break-probes-solib.c @@ -0,0 +1,22 @@ +/* Copyright 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 . */ + +#include + +int +foo (int n) +{ + return n * n / 17; +} diff --git a/gdb/testsuite/gdb.base/info-shared.exp b/gdb/testsuite/gdb.base/info-shared.exp new file mode 100644 index 0000000..1dabb9f --- /dev/null +++ b/gdb/testsuite/gdb.base/info-shared.exp @@ -0,0 +1,145 @@ +# Copyright 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 . + +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. +runto_main +check_info_shared "info sharedlibrary #1" 0 0 + +# Set up breakpoints. +gdb_test "break stop" {Breakpoint [0-9]+ at .*} +gdb_test_no_output "set breakpoint pending on" +gdb_test "break foo" {Breakpoint [0-9]+ \(foo\) pending\.} +gdb_test "break bar" {Breakpoint [0-9]+ \(bar\) pending\.} + +# Run to the first stop and check that only the first library is loaded. +gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #2" 1 0 + +# Run to the second stop and check that both libraries are loaded. +gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #3" 1 1 + +# Check that the next stop is in foo. +gdb_test "c" {Breakpoint [0-9]+, .* in foo \(\) from .*} + +# Check that the next stop is in bar. +gdb_test "c" {Breakpoint [0-9]+, .* in bar \(\) from .*} + +# 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_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #5" 1 0 + +# Run to the second stop and check that both libraries are loaded. +gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #6" 1 1 + +# Check that the next stop is in foo. +gdb_test "c" {Breakpoint [0-9]+, .* in foo \(\) from .*} + +# Check that the next stop is in bar. +gdb_test "c" {Breakpoint [0-9]+, .* in bar \(\) from .*} + +# Run to the next stop and check that the first library has been unloaded. +gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #7" 0 1 + +# Run to the last stop and check that both libraries are gone. +gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +check_info_shared "info sharedlibrary #8" 0 0 diff --git a/gdb/testsuite/gdb.base/info-shared.c b/gdb/testsuite/gdb.base/info-shared.c new file mode 100644 index 0000000..d699a11 --- /dev/null +++ b/gdb/testsuite/gdb.base/info-shared.c @@ -0,0 +1,48 @@ +/* Copyright 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 . */ + +#include + +void +stop () +{ +} + +int +main () +{ + void *handle1, *handle2; + void (*func)(int); + + handle1 = dlopen (SHLIB1_NAME, RTLD_LAZY); + stop (); + + handle2 = dlopen (SHLIB2_NAME, RTLD_LAZY); + stop (); + + func = (void (*)(int)) dlsym (handle1, "foo"); + func (1); + + func = (void (*)(int)) dlsym (handle2, "bar"); + func (2); + + dlclose (handle1); + stop (); + + dlclose (handle2); + stop (); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/info-shared-solib1.c b/gdb/testsuite/gdb.base/info-shared-solib1.c new file mode 100644 index 0000000..9979ee7 --- /dev/null +++ b/gdb/testsuite/gdb.base/info-shared-solib1.c @@ -0,0 +1,24 @@ +/* Copyright 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 . */ + +#include + +int +foo (int n) +{ + printf ("foo %d\n", n); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/info-shared-solib2.c b/gdb/testsuite/gdb.base/info-shared-solib2.c new file mode 100644 index 0000000..d4ed1e6 --- /dev/null +++ b/gdb/testsuite/gdb.base/info-shared-solib2.c @@ -0,0 +1,24 @@ +/* Copyright 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 . */ + +#include + +int +bar (int n) +{ + printf ("bar %d\n", n); + + return 0; +} --DCA/C9WSnDtl50zu--