# Copyright 2010 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/>.

# This test only works on GNU/Linux.
if { ![isnative] || [is_remote host] || ![istarget *-linux*] || [skip_shlib_tests]} {
    continue
}

load_lib prelink-support.exp

set test "attach-pie-misread"
set srcfile ${test}.c
set genfile ${objdir}/${subdir}/${test}-gen.h
set executable ${test}
set binfile ${objdir}/${subdir}/${executable}

if {[build_executable_own_libs ${test}.exp $executable $srcfile [list "additional_flags=-fPIE -pie"]] == ""} {
    return -1
}

# Program Headers:
#   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
#   LOAD           0x000000 0x0000000000400000 0x0000000000400000 0x134f5ec 0x134f5ec R E 0x200000
#   LOAD           0x134f5f0 0x000000000194f5f0 0x000000000194f5f0 0x1dbc60 0x214088 RW  0x200000
#   DYNAMIC        0x134f618 0x000000000194f618 0x000000000194f618 0x000200 0x000200 RW  0x8
#
proc read_phdr {binfile test} {
    set readelf_program [transform readelf]
    set command "exec $readelf_program -Wl $binfile"
    verbose -log "command is $command"
    set result [catch $command output]
    verbose -log "result is $result"
    verbose -log "output is $output"
    if {$result != 0} {
	fail $test
	return
    }
    if ![regexp {\nProgram Headers:\n *Type [^\n]* Align\n(.*?)\n\n} $output trash phdr] {
	fail "$test (no Program Headers)"
	return
    }
    if ![regexp -line {^ *DYNAMIC +0x[0-9a-f]+ +(0x[0-9a-f]+) } $phdr trash dynamic_vaddr] {
	fail "$test (no DYNAMIC found)"
	return
    }
    verbose -log "dynamic_vaddr is $dynamic_vaddr"
    set align_max -1
    foreach {trash align} [regexp -line -all -inline {^ *LOAD .* (0x[0-9]+)$} $phdr] {
	if {$align_max < $align} {
	    set align_max $align
	}
    }
    verbose -log "align_max is $align_max"
    if {$align_max == -1} {
	fail "$test (no LOAD found)"
	return
    }
    pass $test
    return [list $dynamic_vaddr $align_max]
}

set phdr [read_phdr $binfile "readelf initial scan"]
set dynamic_vaddr [lindex $phdr 0]
set align_max [lindex $phdr 1]

set stub_size [format 0x%x [expr "2 * $align_max - ($dynamic_vaddr & ($align_max - 1))"]]
verbose -log "stub_size is $stub_size"

# On x86_64 it is commonly about 4MB.
if {$stub_size > 25000000} {
    xfail "stub size $stub_size is too large"
    return
}

set test "generate stub"
set command "exec $binfile $stub_size >$genfile"
verbose -log "command is $command"
set result [catch $command output]
verbose -log "result is $result"
verbose -log "output is $output"
if {$result == 0} {
    pass $test
} else {
    fail $test
}

set prelink_args [build_executable_own_libs ${test}.exp $executable $srcfile [list "additional_flags=-fPIE -pie -DGEN=\"$genfile\""]]
if {$prelink_args == ""} {
    return -1
}

# x86_64 file has 25MB, no need to keep it.
file delete -- $genfile

set phdr [read_phdr $binfile "readelf rebuilt with stub_size"]
set dynamic_vaddr_prelinkno [lindex $phdr 0]

if ![prelink_yes $prelink_args] {
    return -1
}

set phdr [read_phdr $binfile "readelf with prelink -R"]
set dynamic_vaddr_prelinkyes [lindex $phdr 0]

set first_offset [format 0x%x [expr $dynamic_vaddr_prelinkyes - $dynamic_vaddr_prelinkno]]
verbose -log "first_offset is $first_offset"

set test "first offset is non-zero"
if {$first_offset == 0} {
    fail "$test (-fPIE -pie in effect?)"
} else {
    pass $test
}

set test "start inferior"
gdb_exit

set res [remote_spawn host $binfile];
if { $res < 0 || $res == "" } {
    perror "Spawning $binfile failed."
    fail $test
    return
}
set pid [exp_pid -i $res]
gdb_expect {
    -re "sleeping\r\n" {
	pass $test
    }
    eof {
	fail "$test (eof)"
	remote_exec host "kill -9 $pid"
	return
    }
    timeout {
	fail "$test (timeout)"
	remote_exec host "kill -9 $pid"
	return
    }
}

# Due to alignments it was reproducible with 1 on x86_64 but 2 on i686.
foreach align_mult {1 2} {
    set old_ldprefix $pf_prefix
    lappend pf_prefix "shift-by-$align_mult:"

    # FIXME: We believe there is enough room under FIRST_OFFSET.
    set shifted_offset [format 0x%x [expr "$first_offset - $align_mult * $align_max"]]
    verbose -log "shifted_offset is $shifted_offset"

    # For normal prelink (prelink_yes call), we need to supply $prelink_args.
    # For the prelink `-r' option below, $prelink_args is not required.
    # Moreover, if it was used, the problem would not longer be reproducible
    # as the libraries would also get relocated.
    set command "exec /usr/sbin/prelink -q -N --no-exec-shield -r $shifted_offset $binfile"
    verbose -log "command is $command"
    set result [catch $command output]
    verbose -log "result is $result"
    verbose -log "output is $output"

    set test "prelink -r"
    if {$result == 0 && $output == ""} {
	pass $test
    } else {
	fail $test
    }

    clean_restart $executable

    set test "attach"
    gdb_test_multiple "attach $pid" $test {
	-re "Attaching to program: .*, process $pid\r\n" {
	    # Missing "$gdb_prompt $" is intentional.
	    pass $test
	}
    }

    set test "error on Cannot access memory at address"
    gdb_test_multiple "" $test {
	-re "\r\nCannot access memory at address .*$gdb_prompt $" {
	    fail $test
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }

    gdb_test "detach" "Detaching from program: .*"

    set pf_prefix $old_ldprefix
}

remote_exec host "kill -9 $pid"
