weak.exp   [plain text]


# 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