1# Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# Please email any bugs, comments, and/or additions to this file to: 17# bug-gdb@gnu.org 18 19# This file was written by Alexandre Oliva <aoliva@redhat.com> 20 21if $tracelevel then { 22 strace $tracelevel 23 } 24 25 26if { ![isnative] || [is_remote host] || [skip_shlib_tests]} { 27 return 28} 29 30if [get_compiler_info "ignored"] { 31 return -1 32} 33 34if {$gcc_compiled == 0} { 35 return -1 36} 37 38load_lib prelink-support.exp 39 40set testfile "prelink" 41 42set libsrcfile ${testfile}-lib.c 43set libfile ${objdir}/${subdir}/${testfile}.so 44 45# Use -soname so that the new library gets copied by build_executable_own_libs. 46 47if { [gdb_compile_shlib "${srcdir}/${subdir}/${libsrcfile}" "${libfile}" [list debug "ldflags=-Wl,-soname,[file tail ${libfile}]"]] != ""} { 48 # If creating the shared library fails, maybe we don't have the right tools 49 return -1 50} 51 52set srcfile ${testfile}.c 53set executable ${testfile}t 54set binfile ${objdir}/${subdir}/${executable} 55set prelink_args [build_executable_own_libs ${testfile}.exp $executable $srcfile [list debug "ldflags=-Wl,${libfile},-rpath,[file dirname ${libfile}]"]] 56if {$prelink_args == ""} { 57 return -1 58} 59 60set test "split debug of executable" 61if [gdb_gnu_strip_debug $binfile] { 62 fail $test 63} else { 64 pass $test 65} 66 67if ![prelink_yes $prelink_args] { 68 # Maybe we don't have prelink. 69 return -1 70} 71 72set found 0 73set coredir "${objdir}/${subdir}/coredir.[getpid]" 74file mkdir $coredir 75catch "system \"(cd ${coredir}; ulimit -c unlimited; ${binfile}; true) >/dev/null 2>&1\"" 76 77foreach i "${coredir}/core ${coredir}/core.coremaker.c ${binfile}.core" { 78 if [remote_file build exists $i] { 79 remote_exec build "mv $i ${objdir}/${subdir}/prelink.core" 80 set found 1 81 } 82} 83# Check for "core.PID". 84if { $found == 0 } { 85 set names [glob -nocomplain -directory $coredir core.*] 86 if {[llength $names] == 1} { 87 set corefile [file join $coredir [lindex $names 0]] 88 remote_exec build "mv $corefile ${objdir}/${subdir}/prelink.core" 89 set found 1 90 } 91} 92 93# Try to clean up after ourselves. 94remote_file build delete [file join $coredir coremmap.data] 95remote_exec build "rmdir $coredir" 96 97if { $found == 0 } { 98 warning "can't generate a core file - prelink tests suppressed - check ulimit -c" 99 return 0 100} 101 102# Relink $libfile to a different address. 103if ![prelink_yes $prelink_args] { 104 return -1 105} 106 107# Start with a fresh gdb 108 109clean_restart $executable 110 111# Print the "adjusting expectations" message. 112gdb_test_no_output "set verbose on" 113 114gdb_test "core-file $objdir/$subdir/prelink.core" "Using PIC \\(Position Independent Code\\) prelink displacement 0x\[^0\]\[0-9a-f\]* for \[^\r\n\]*[file tail ${libfile}].*" "seen displacement message" 115 116gdb_test "p &bssvar == bssvarp" " = 1" ".dynbss vs. .bss address shift" 117