# This testcase is part of GDB, the GNU debugger.

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

# Test inappropriate offseting of multiple sections with the same name.
# When kept in object file (before final executable link) it still works.
# When separate debug info file is not used it still works.
# When the ELF symbol table is kept in the main binary it still works.
# Used .S file as in .c file we would need __attriute__((section)) which is
# a GCC extension.

# This test can only be run on targets which support ELF and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget arm*-*-eabi*]
    && ![istarget powerpc-*-eabi*]} {
    return 0
}

standard_testfile .S
set srcmainfile start.c
set executable ${testfile}

if {[build_executable ${testfile}.exp $executable [list ${srcfile} ${srcmainfile}] {}] == -1} {
    return -1
}

set test "rename section"
set objcopy_program [gdb_find_objcopy]
set result [catch "exec $objcopy_program --rename-section sect2=sect1 $binfile" output]
verbose "result is $result"
verbose "output is $output"
if {$result != 0} {
    fail $test
    return
}
pass $test

set test "split"
if {[gdb_gnu_strip_debug $binfile] != 0} {
    fail $test
} else {
    pass $test
}

# gdb_gnu_strip_debug uses only --strip-debug and keeps the ELF symbol table
# in $binfile.
set test "strip"
set strip_program [transform strip]
set result [catch "exec $strip_program $binfile" output]
verbose "result is $result"
verbose "output is $output"
if {$result != 0} {
    fail $test
    return
}
pass $test

clean_restart $executable

gdb_test "p/d *(const char *) &var1" " = 1" "var1 after strip"
gdb_test "p/d *(const char *) &var2" " = 2" "var2 after strip"
