60b3033e6e
We already skip "attach" tests if the target board is remote, in dejagnu's sense, as we use TCL's exec to spawn the program on the build machine. We should also skip these tests if testing with "target remote" or other stub-like targets where "attach" doesn't make sense. Add a helper procedure that centralizes the checks a test that needs to spawn a program for testing "attach" and make all test files that use spawn_wait_for_attach check it. gdb/testsuite/ 2015-01-09 Pedro Alves <palves@redhat.com> * lib/gdb.exp (can_spawn_for_attach): New procedure. (spawn_wait_for_attach): Error out if can_spawn_for_attach returns false. * gdb.base/attach.exp: Use can_spawn_for_attach instead of checking whether the target board is remote. * gdb.multi/multi-attach.exp: Likewise. * gdb.python/py-sync-interp.exp: Likewise. * gdb.server/ext-attach.exp: Likewise. * gdb.python/py-prompt.exp: Use can_spawn_for_attach before the tests that need to attach, instead of checking whether the target board is remote at the top of the file.
127 lines
5 KiB
Text
127 lines
5 KiB
Text
# Copyright 2009-2015 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 <http://www.gnu.org/licenses/>.
|
|
#
|
|
# Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>.
|
|
|
|
# Test GDB can cope with two libraries loaded with overlapping VMA ranges.
|
|
# Prelink libraries first so they can be loaded and their native address.
|
|
# In such case `struct linkmap'.l_addr will be zero. Provide different
|
|
# unprelinked library files on the disk which have zero-based VMAs. These
|
|
# different files should have their .dynamic section at a different offset in
|
|
# page size so that we get for
|
|
# warning: .dynamic section for "..." is not at the expected address
|
|
# the reason
|
|
# (wrong library or version mismatch?)
|
|
# and not:
|
|
# difference appears to be caused by prelink, adjusting expectations
|
|
# In such case both disk libraries will be loaded at VMAs starting at zero.
|
|
|
|
if [skip_shlib_tests] {
|
|
return 0
|
|
}
|
|
|
|
if {![can_spawn_for_attach]} {
|
|
return 0
|
|
}
|
|
|
|
if [get_compiler_info] {
|
|
return -1
|
|
}
|
|
|
|
# Library file.
|
|
set libname "solib-overlap-lib"
|
|
set srcfile_lib ${srcdir}/${subdir}/${libname}.c
|
|
# Binary file.
|
|
set testfile "solib-overlap-main"
|
|
set srcfile ${srcdir}/${subdir}/${testfile}.c
|
|
|
|
# Base addresses for `prelink -r' which should be compatible with both -m32 and
|
|
# -m64 targets. If it clashes with system prelinked libraries it would give
|
|
# false PASS.
|
|
# Prelink first lib1 at 0x40000000 and lib2 at 0x41000000.
|
|
# During second pass try lib1 at 0x50000000 and lib2 at 0x51000000.
|
|
foreach prelink_lib1 {0x40000000 0x50000000} { with_test_prefix "$prelink_lib1" {
|
|
set prelink_lib2 [format "0x%x" [expr $prelink_lib1 + 0x01000000]]
|
|
|
|
# Library file.
|
|
set binfile_lib1 [standard_output_file ${libname}1-${prelink_lib1}.so]
|
|
set binfile_lib1_test_msg OBJDIR/${subdir}/${libname}1-${prelink_lib1}.so
|
|
set binfile_lib2 [standard_output_file ${libname}2-${prelink_lib1}.so]
|
|
set binfile_lib2_test_msg OBJDIR/${subdir}/${libname}2-${prelink_lib1}.so
|
|
set lib_flags {debug}
|
|
# Binary file.
|
|
set binfile_base ${testfile}-${prelink_lib1}
|
|
set binfile [standard_output_file ${binfile_base}]
|
|
set binfile_test_msg OBJDIR/${subdir}/${binfile_base}
|
|
set bin_flags [list debug shlib=${binfile_lib1} shlib=${binfile_lib2}]
|
|
set escapedbinfile [string_to_regexp ${binfile}]
|
|
|
|
if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != ""
|
|
|| [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != ""
|
|
|| [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } {
|
|
untested "Could not compile ${binfile_lib1_test_msg}, ${binfile_lib2_test_msg} or ${binfile_test_msg}."
|
|
return -1
|
|
}
|
|
|
|
if {[catch "system \"prelink -N -r ${prelink_lib1} ${binfile_lib1}\""] != 0
|
|
|| [catch "system \"prelink -N -r ${prelink_lib2} ${binfile_lib2}\""] != 0} {
|
|
# Maybe we don't have prelink.
|
|
untested "Could not prelink ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}."
|
|
return -1
|
|
}
|
|
|
|
set testpid [spawn_wait_for_attach $binfile]
|
|
|
|
remote_exec build "mv -f ${binfile_lib1} ${binfile_lib1}-running"
|
|
remote_exec build "mv -f ${binfile_lib2} ${binfile_lib2}-running"
|
|
|
|
# Provide another exported function name to cause different sizes of sections.
|
|
lappend lib_flags additional_flags=-DSYMB
|
|
|
|
if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != ""
|
|
|| [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != ""} {
|
|
untested "Could not recompile ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}."
|
|
remote_exec build "kill -9 ${testpid}"
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${binfile_base}
|
|
# This testcase currently does not support remote targets.
|
|
# gdb_load_shlibs ${binfile_lib1} ${binfile_lib2}
|
|
|
|
# Here we should get:
|
|
# warning: .dynamic section for ".../solib-overlap-lib1.so" is not at the expected address (wrong library or version mismatch?)
|
|
# warning: .dynamic section for ".../solib-overlap-lib2.so" is not at the expected address (wrong library or version mismatch?)
|
|
|
|
set test attach
|
|
gdb_test_multiple "attach $testpid" $test {
|
|
-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
-re "Attaching to program.*`?$escapedbinfile\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" {
|
|
# Response expected on Cygwin
|
|
pass $test
|
|
}
|
|
}
|
|
|
|
# Detach the process.
|
|
|
|
gdb_test "detach" "Detaching from program: .*$escapedbinfile, process $testpid"
|
|
|
|
# Wait a bit for gdb to finish detaching
|
|
|
|
sleep 5
|
|
|
|
remote_exec build "kill -9 ${testpid}"
|
|
}}
|