# Expect script for common symbol override.
#
# Copyright 2011, 2012 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#

#
# Written by Maciej W. Rozycki <macro@codesourcery.com>
#

# This test is for ELF shared-library targets.
if { ![is_elf_format] || ![check_shared_lib_support] } {
    return
}

# This target requires extra GAS options when building code for shared
# libraries.
set AFLAGS_PIC ""
if [istarget "tic6x-*-*"] {
    append AFLAGS_PIC " -mpic -mpid=near"
}
# This target requires a non-default emulation for successful shared
# library/executable builds.
set LFLAGS ""
if [istarget "tic6x-*-*"] {
    append LFLAGS " -melf32_tic6x_le"
}

set testname "Common symbol override test"

# Define a global symbol.
run_ld_link_tests [list \
    [list \
	"$testname (auxiliary shared object build)" \
	"$LFLAGS -shared" "" \
	"$AFLAGS_PIC" \
	{ comm-data1.s } \
	{ \
	    { readelf -s comm-data1.sd } \
	} \
	"libcomm-data.so" \
    ] \
]

# Set the pointer size according to the ELF flavor.
set AFLAGS ""
if [is_elf64 "tmpdir/libcomm-data.so"] {
    append AFLAGS " --defsym ELF64=1"
}
# HPUX targets use a different .comm syntax.
if [istarget "*-*-hpux*"] {
    append AFLAGS " --defsym HPUX=1"
}

setup_xfail "arm*-*-*" "ld/13802"

# List targets here that keep copy relocs rather than eliminating
# them where possible in favour to dynamic relocs in the relevant
# loadable sections; see also the "-z nocopyreloc" command-line
# option and the ELIMINATE_COPY_RELOCS macro some backends use.
set copy_reloc [expr [istarget mn10300-*-*] || [istarget vax-*-*]]

# Verify that a common symbol has been converted to an undefined
# reference to the global symbol of the same name defined above
# and that the debug reference has been dropped.
run_ld_link_tests [list \
    [list \
	"$testname" \
	"$LFLAGS -T comm-data2.ld -Ltmpdir -lcomm-data" "" \
	"$AFLAGS" \
	{ comm-data2.s } \
	[list \
	    [list readelf -s \
		[expr { $copy_reloc ? "comm-data2r.sd" : "comm-data2.sd"}]] \
	    [list readelf -r \
		[expr { $copy_reloc ? "comm-data2r.rd" : "comm-data2.rd"}]] \
	    [list readelf "-x .debug_foo" \
		[expr { $copy_reloc ? "comm-data2r.xd" : "comm-data2.xd"}]]] \
	"comm-data" \
    ] \
    [list \
	"$testname 3a" \
	"-static" "" \
	"" \
	{ comm-data3a.s comm-data3b.s } \
	{ \
	    { readelf -s comm-data3.sd } \
	} \
	"comm-data3a" \
    ] \
    [list \
	"$testname 3b" \
	"-static" "" \
	"" \
	{ comm-data3b.s comm-data3a.s } \
	{ \
	    { readelf -s comm-data3.sd } \
	} \
	"comm-data3b" \
    ] \
]
