# Copyright 2009-2021 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 "failed to compile"
	return -1
    }

    if {[catch "exec prelink -N -r ${prelink_lib1} ${binfile_lib1}" output] != 0
	|| [catch "exec prelink -N -r ${prelink_lib2} ${binfile_lib2}" output] != 0} {
	# Maybe we don't have prelink.
	verbose -log "prelink failed: $output"
	untested "could not prelink ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}."
	return -1
    }

    set test_spawn_id [spawn_wait_for_attach $binfile]
    set testpid [spawn_id_get_pid $test_spawn_id]

    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 "failed to compile shared library"
	kill_wait_spawned_process $test_spawn_id
	return -1
    }

    clean_restart ${binfile_base}
    # This testcase currently does not support remote targets.
    # gdb_load_shlib ${binfile_lib1}
    # gdb_load_shlib ${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\r\n\\\[Inferior $decimal \\(.*\\) detached\\\]"

    # Wait a bit for gdb to finish detaching

    sleep 5

    kill_wait_spawned_process $test_spawn_id
}}
