blob: 839569a686e2dc6b414666ebe0c7c9f24c24c32f [file] [log] [blame]
# Copyright 2002, 2004
# 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.
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu
# This file was written by Jason Molenda (jmolenda@apple.com)
if $tracelevel then {
strace $tracelevel
}
# Test an executable with a weak library. A "weak library" is unlike any
# ELF thing; if all externally visible functions in a shared library are
# marked as "weak" in their prototypes in a C file, then when that executable
# is run, the shared library may be absent and the program will still work.
# (as oppposed to the normal case, where you'd get an unresolved shared library
# reference from the dynamic linker run-time). All the addresses of the
# functions from the shared library will have a value of 0 in this case.
set timeout 30
set prms_id 0
set bug_id 0
set testfile "weak-prog"
set binfile ${objdir}/${subdir}/${testfile}
set srcfile ${srcdir}/${subdir}/${testfile}.c
set libfile "libweak"
set libbinfile ${objdir}/${subdir}/${libfile}.dylib
set libsrcfile ${srcdir}/${subdir}/${libfile}.c
set additional_flags "additional_flags=-dynamiclib"
if { [gdb_compile "${libsrcfile}" "${libbinfile}" executable [list debug $additional_flags]] != "" } {
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}
global env
set ::env(MACOSX_DEPLOYMENT_TARGET) "10.2"
set additional_flags "additional_flags=-L${objdir}/${subdir} -weak-lweak"
if { [gdb_compile "${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}
# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd "${binfile}"
gdb_test "future-break foo" "Breakpoint 1 at $hex: file .*libweak.c.*, line $decimal." "Set breakpoint on foo"
gdb_test "run" \
"Starting program: $binfile\[ \r\]*
Reading symbols for shared libraries \[+\\.]+ done\[ \r\]*\(Breakpoint 1 at $hex: file .*libweak.c.*, line $decimal.\[ \r\]*\)*
hi, in main\[ \r\]*
\[ \r\]*
Breakpoint 1, foo.*libweak.c.*\[ \r\]*" \
"continue to weak library bp"
gdb_test "info sharedlibrary" "$decimal libweak.dylib *- $hex *dyld Y Y $libbinfile at $hex \\(offset $hex\\).*"
gdb_exit
# Now move the library aside, try again
remote_exec build "mv ${libbinfile} ${libbinfile}.hide"
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_test "file ${binfile}" "Reading symbols for shared libraries \\.+ done\r\nReading symbols from ${binfile}.*done.\[\r\n\]+" "load with missing weak lib, hope for no warnings"
gdb_test "info sharedlibrary" ".*$decimal libweak.dylib *- - *w-init Y ! ${libbinfile}.*" "check sharedlibrary entry for missing weak library pre-run"
gdb_test "future-break foo" "Function \"foo\" not defined..*Breakpoint 1 .foo. pending.*" "Set breakpoint on foo (2), not yet defined"
send_gdb "run\n"
gdb_expect {
-re "Starting program: $binfile \[\r\n\]+\[\r\n\]+(Reading symbols for shared libraries (\\.)+ done\[\r\n\]+)+hi, in main\[\r\n\]+finished in main\[\r\n\]+Program exited with code $decimal\\.\[\r\n\]+$gdb_prompt $" {
pass "test running weak program"
}
-re ".*$gdb_prompt $" {
fail "test running weak program"
}
timeout {
fail "(timeout) test running weak program"
}
}
gdb_test "info sharedlibrary" ".*$decimal libweak.dylib *- - *c-w-init Y ! ${libbinfile}.*" "check sharedlibrary entry for missing weak library post-run"
gdb_exit
return 0