| # 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 |
| |