1# Copyright 2006-2020 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 21 22if { ![isnative] || [is_remote host] || [skip_shlib_tests]} { 23 return 24} 25 26if [get_compiler_info] { 27 return -1 28} 29 30if {$gcc_compiled == 0} { 31 return -1 32} 33 34load_lib prelink-support.exp 35 36set testfile "prelink" 37 38set libsrcfile ${testfile}-lib.c 39set libfile [standard_output_file ${testfile}.so] 40 41# Use -soname so that the new library gets copied by build_executable_own_libs. 42 43if { [gdb_compile_shlib "${srcdir}/${subdir}/${libsrcfile}" "${libfile}" [list debug "ldflags=-Wl,-soname,[file tail ${libfile}]"]] != ""} { 44 # If creating the shared library fails, maybe we don't have the right tools 45 return -1 46} 47 48set srcfile ${testfile}.c 49set executable ${testfile}t 50set binfile [standard_output_file ${executable}] 51set prelink_args [build_executable_own_libs ${testfile}.exp $executable $srcfile [list debug "ldflags=-Wl,${libfile},-rpath,[file dirname ${libfile}]"]] 52if {$prelink_args == ""} { 53 return -1 54} 55 56set test "split debug of executable" 57if [gdb_gnu_strip_debug $binfile] { 58 fail $test 59} else { 60 pass $test 61} 62 63if ![prelink_yes $prelink_args] { 64 # Maybe we don't have prelink. 65 return -1 66} 67 68set found 0 69set coredir "[standard_output_file coredir.[getpid]]" 70file mkdir $coredir 71catch "system \"(cd ${coredir}; ulimit -c unlimited; ${binfile}; true) >/dev/null 2>&1\"" 72 73foreach i "${coredir}/core ${coredir}/core.coremaker.c ${binfile}.core" { 74 if [remote_file build exists $i] { 75 remote_exec build "mv $i [standard_output_file prelink.core]" 76 set found 1 77 } 78} 79# Check for "core.PID". 80if { $found == 0 } { 81 set names [glob -nocomplain -directory $coredir core.*] 82 if {[llength $names] == 1} { 83 set corefile [file join $coredir [lindex $names 0]] 84 remote_exec build "mv $corefile [standard_output_file prelink.core]" 85 set found 1 86 } 87} 88 89# Try to clean up after ourselves. 90remote_file build delete [file join $coredir coremmap.data] 91remote_exec build "rmdir $coredir" 92 93if { $found == 0 } { 94 warning "can't generate a core file - prelink tests suppressed - check ulimit -c" 95 return 0 96} 97 98# Relink $libfile to a different address. 99if ![prelink_yes $prelink_args] { 100 return -1 101} 102 103# Start with a fresh gdb 104 105clean_restart $executable 106 107# Print the "adjusting expectations" message. 108gdb_test_no_output "set verbose on" 109 110gdb_test "core-file [standard_output_file prelink.core]" "Using PIC \\(Position Independent Code\\) prelink displacement 0x\[^0\]\[0-9a-f\]* for \[^\r\n\]*[file tail ${libfile}].*" "seen displacement message" 111 112gdb_test "p &bssvar == bssvarp" " = 1" ".dynbss vs. .bss address shift" 113