# Copyright 2005 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Test the environment of someone working on dyld. Which is # # 1. The dyld they're working on is not installed as /usr/lib/dyld -- it's no # fun to trash your system while you're working on a bug. # 2. dyld was built as "dyld" by Xcode, so when Xcode sets breakpoints # it'll specify a shlib for those breakpoints of "dyld" and they'll never # hit when the actual dynamic loader is "dyld-tst". So /tmp/dyld-tst becomes # a symlink to the dyld in the built directory. # i.e. at runtime we have # # BUILDDIR/test-program (some random program we don't care about) # BUILDDIR/dyld (the dyld we're debugging) # /tmp/dyld-tst -> BUILDDIR/dyld # # The test-program has /usr/lib/dyld listed as its dynamic linker, so we # need to post-process BUILDDIR/test-program to change the string # "/usr/lib/dyld" to "/tmp/dyld-tst" so it will use the symlink to # BUILDDIR/dyld which we want to debug. if $tracelevel then { strace $tracelevel } set prms_id 0 set bug_id 0 set testfile "nick" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/$srcfile" "${binfile}" executable {debug}] != "" } { gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." } remote_exec build "perl -pi -e s#/usr/lib/dyld#/tmp/dyld-tst# $binfile" remote_exec build "rm -f ${objdir}/${subdir}/dyld" remote_exec build "cp /usr/lib/dyld ${objdir}/${subdir}/dyld" remote_exec build "rm -f /tmp/dyld-tst" remote_exec build "ln -s ${objdir}/${subdir}/dyld /tmp/dyld-tst" set dyld_before_event __dyld__ZN4dyld24initializeMainExecutableEv # Start with a fresh gdb gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} gdb_test "break -shlib dyld $dyld_before_event" "Breakpoint 1 at $hex.*" "setting breakpoint at dyld initializeMainExecutable, shlib-restricted" gdb_test "break main" "Breakpoint 2 at $hex: file.*" "setting breakpoint on main" gdb_test "run" "Starting program: $binfile *\r\n\.*Breakpoint 1, .*$dyld_before_event.*" "stopped in dyld" gdb_test "continue" "Continuing\\..*Breakpoint 2, main.*" "stopped at main" gdb_test "info shared" "dyld.*dyld Y Y.*nick.*exec Y Y.*libSystem.B.dylib.*dyld Y Y.*" "gdb is getting load notifications" send_gdb "info shared\n" gdb_expect { -re ".*dyld-tst.*$gdb_prompt $" { fail "dyld-tst should not be in info shared output" } -re ".*libSystem.B.dylib.*$gdb_prompt $" { pass "dyld-tst should not be in info shared output" } -re "$gdb_prompt $" { fail "dyld-tst should not be in info shared output" } timeout { fail "(timeout) dyld-tst should not be in info shared output" } } gdb_test "info shared" ".*${objdir}/${subdir}/dyld.*" "copy of dyld should be in info shared output" gdb_test "maint info br" ".*-$decimal *shlib events *keep y *$hex.*gdb_image_notifier.*" "dylib notification internal breakpoint was set" gdb_exit return 0