From a29a3fb7a350b70ec755b1964d2830094314dba8 Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Tue, 4 Jun 2013 13:23:32 +0000 Subject: 2013-06-04 Jan Kratochvil Gary Benson * lib/gdb.exp (build_executable_from_specs): Use gdb_compile_pthread, gdb_compile_shlib or gdb_compile_shlib_pthreads where appropriate. * lib/prelink-support.exp (build_executable_own_libs): Allow INTERP to be set to "no" to indicate that no ld.so copy should be made. * gdb.base/break-interp.exp (solib_bp): New constant. (reach_1): Use the above instead of "_dl_debug_state". (test_attach): Likewise. (test_ld): Likewise. * gdb.threads/dlopen-libpthread.exp: New file. * gdb.threads/dlopen-libpthread.c: Likewise. * gdb.threads/dlopen-libpthread-lib.c: Likewise. * gdb.base/solib-corrupted.exp: Disable test if GDB is using probes. --- gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c | 40 ++++++++++++ gdb/testsuite/gdb.threads/dlopen-libpthread.c | 46 ++++++++++++++ gdb/testsuite/gdb.threads/dlopen-libpthread.exp | 74 +++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c create mode 100644 gdb/testsuite/gdb.threads/dlopen-libpthread.c create mode 100644 gdb/testsuite/gdb.threads/dlopen-libpthread.exp (limited to 'gdb/testsuite/gdb.threads') diff --git a/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c b/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c new file mode 100644 index 0000000..85fb2dd --- /dev/null +++ b/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c @@ -0,0 +1,40 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011-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 +#include + +static void * +tfunc (void *arg) +{ + void (*notifyp) (void) = arg; + + notifyp (); +} + +void +f (void (*notifyp) (void)) +{ + pthread_t t; + int i; + + i = pthread_create (&t, NULL, tfunc, notifyp); + assert (i == 0); + + i = pthread_join (t, NULL); + assert (i == 0); +} diff --git a/gdb/testsuite/gdb.threads/dlopen-libpthread.c b/gdb/testsuite/gdb.threads/dlopen-libpthread.c new file mode 100644 index 0000000..7d6c00e --- /dev/null +++ b/gdb/testsuite/gdb.threads/dlopen-libpthread.c @@ -0,0 +1,46 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011-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 +#include +#include + +static const char *volatile filename; + +static void +notify (void) +{ + filename = NULL; /* notify-here */ +} + +int +main (void) +{ + void *h; + void (*fp) (void (*) (void)); + + assert (filename != NULL); + h = dlopen (filename, RTLD_LAZY); + assert (h != NULL); + + fp = dlsym (h, "f"); + assert (fp != NULL); + + fp (notify); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/dlopen-libpthread.exp b/gdb/testsuite/gdb.threads/dlopen-libpthread.exp new file mode 100644 index 0000000..98706c8 --- /dev/null +++ b/gdb/testsuite/gdb.threads/dlopen-libpthread.exp @@ -0,0 +1,74 @@ +# Copyright 2011-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 {![istarget *-linux*] || [skip_shlib_tests]} { + return 0 +} + +load_lib prelink-support.exp + +set testfile "dlopen-libpthread" +set srcmainfile ${testfile}.c +set srclibfile ${testfile}-lib.c +set executable ${testfile} +set binfile_lib ${objdir}/${subdir}/${executable}.so +set binfile ${objdir}/${subdir}/${executable} +set lib_dlopen [shlib_target_file ${executable}.so] + +# Use build_executable_own_libs as prelinked libpthread.so can produce false +# PASS - it is OK if GDB processes it still before relocation. + +set relink_args [build_executable_own_libs ${testfile}.exp ${executable}.so $srclibfile {debug shlib_pthreads} no] +if {$relink_args == "" || ![prelink_no $relink_args] + || [prepare_for_testing ${testfile}.exp ${executable} ${srcmainfile} {debug shlib_load}] } { + return -1 +} +gdb_load_shlibs $binfile_lib + +if { ![runto_main] } { + return -1 +} + +set test "info probes all rtld rtld_map_complete" +gdb_test_multiple $test $test { + -re "\[ \t\]rtld_map_complete\[ \t\]+0x\[0-9a-f\]+.*\r\n$gdb_prompt $" { + pass $test + } + -re "No probes matched\\.\r\n$gdb_prompt $" { + xfail $test + untested ${testfile}.exp + return + } +} + +set test "libpthread.so not found" +gdb_test_multiple "info sharedlibrary" $test { + -re "/libpthread\\.so.*\r\n$gdb_prompt $" { + fail $test + } + -re "/libc\\.so.*\r\n$gdb_prompt $" { + pass $test + } +} + +gdb_test "set variable filename=\"$lib_dlopen\"" + +gdb_breakpoint "notify" + +# The error was: +# Cannot find new threads: generic error +gdb_continue_to_breakpoint "notify" ".* notify-here .*" + +gdb_test "info sharedlibrary" {/libpthread\.so.*} "libpthread.so found" -- cgit v1.1