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

# Copyright 2010-2020 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 arm*-*-symbianelf*]
    && ![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"
