# Copyright 2003, 2004, 2005, 2007, 2008, 2009, 2010 # 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 . # This file was created by Jeff Johnston. (jjohnstn@redhat.com) if $tracelevel then { strace $tracelevel } # # test running programs # set prms_id 0 set bug_id 0 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 $objdir/$subdir/$testfile set shlibdir ${objdir}/${subdir} set libsrc $srcdir/$subdir/$libfile.c set libsrc2 $srcdir/$subdir/$libfile2.c set lib_sl $objdir/$subdir/$libname set lib_sl2 $objdir/$subdir/$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 ${binfile}] { 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 "Couldn't compile $libsrc or $libsrc2 or $srcfile." return -1 } # Start with a fresh gdb. gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} gdb_load_shlibs $lib_sl $lib_sl2 if [target_info exists gdb_stub] { gdb_step_for_stub; } # # 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 * *shrfunc1\r? 2\[\t \]+breakpoint keep y * *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 * *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 * *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 * *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"