# Copyright (C) 2011-2012 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/>.

# Manipulation with PID on target is not supported.
if [is_remote target] then {
    return 0
}

set testfile attach-pie-noexec
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}

if { [prepare_for_testing ${testfile}.exp $executable "" [list debug "additional_flags=-fPIE -pie"]] } {
    return -1
}

clean_restart $executable
set arch ""
set test "show architecture"
gdb_test_multiple $test $test {
    -re "The target architecture is set automatically \\(currently (.*)\\)\r\n$gdb_prompt $" {
	set arch $expect_out(1,string)
	pass $test
    }
}
if ![runto_main] {
    return 0
}
set test "sanity check info shared"
gdb_test_multiple "info shared" $test {
    -re "From\[ \t\]+To\[ \t\]+Syms Read\[ \t\]+Shared Object Library\r\n0x.*\r\n$gdb_prompt $" {
	pass $test
    }
    -re "No shared libraries loaded at this time\\.\r\n$gdb_prompt $" {
	untested ${testfile}.exp
    }
}
gdb_exit

if {$arch == ""} {
    untested ${testfile}.exp
    return 0
}

set testpid [eval exec $binfile &]
exec sleep 2

gdb_start
file delete -- $binfile
set test "attach"
gdb_test_multiple "attach $testpid" $test {
    -re "Attaching to process $testpid\r\n.*: No such file or directory\\.\r\n$gdb_prompt $" {
        pass $test
    }
    -re "Attaching to process $testpid\r\nptrace: Operation not permitted.\r\n$gdb_prompt $" {
        untested ${testfile}.exp
    }
}
gdb_test "set architecture $arch" "The target architecture is assumed to be $arch"
gdb_test "info shared" "From\[ \t\]+To\[ \t\]+Syms Read\[ \t\]+Shared Object Library\r\n0x.*"

eval exec kill -9 $testpid
