# Expect script for ld-version tests
#   Copyright (C) 1997-2016 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 Eric Youngdale (eric@andante.jic.com)

#

# This test can only be run if ld generates native executables.
if ![isnative] then {return}

# This test can only be run on a couple of ELF platforms.
# Square bracket expressions seem to confuse istarget.
# This is similar to the test that is used in ld-shared, BTW.
if { ![istarget hppa*64*-*-hpux*]
     && ![istarget hppa*-*-linux*]
     && ![istarget i?86-*-sysv4*]
     && ![istarget i?86-*-unixware]
     && ![istarget i?86-*-elf*]
     && ![istarget i?86-*-linux*]
     && ![istarget i?86-*-gnu*]
     && ![istarget i?86-*-nacl*]
     && ![istarget ia64-*-elf*]
     && ![istarget ia64-*-linux*]
     && ![istarget m68k-*-linux*]
     && ![istarget mips*-*-irix5*]
     && ![istarget powerpc*-*-elf*]
     && ![istarget powerpc*-*-linux*]
     && ![istarget powerpc*-*-sysv4*]
     && ![istarget sparc*-*-elf]
     && ![istarget sparc*-*-solaris2*]
     && ![istarget sparc*-*-linux*]
     && ![istarget aarch64*-*-linux*]
     && ![istarget arm*-*-linux*]
     && ![istarget mips*-*-linux*]
     && ![istarget alpha*-*-linux*]
     && ![istarget s390*-*-linux*]
     && ![istarget sh\[34\]*-*-linux*]
     && ![istarget x86_64-*-linux*]
     && ![istarget x86_64-*-nacl*] } {
    return
}

if { [istarget *-*-linux*aout*]
     || [istarget *-*-linux*oldld*] } {
    return
}

if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
    return
}

set diff diff
set tmpdir tmpdir
set VOBJDUMP_FLAGS --private-headers
set DOBJDUMP_FLAGS --dynamic-syms
set SOBJDUMP_FLAGS --syms
set shared "--shared --no-undefined-version"
set script --version-script

# Old version of GCC for MIPS default to enabling -fpic
# and get confused if it is used on the command line.
if { [istarget mips*-*-*] && ! [at_least_gcc_version 4 3] } then {
    set picflag ""
} else {
    # Unfortunately, the gcc argument is -fpic and the cc argument is
    # -KPIC.  We have to try both.
    set picflag "-fpic"
    send_log "$CC $picflag\n"
    verbose "$CC $picflag"
    catch "exec $CC $picflag" exec_output
    send_log "$exec_output\n"
    verbose "--" "$exec_output"
    if { [string match "*illegal option*" $exec_output]
	 || [string match "*option ignored*" $exec_output]
	 || [string match "*unrecognized option*" $exec_output]
	 || [string match "*passed to ld*" $exec_output] } {
	if [istarget *-*-sunos4*] {
	    set picflag "-pic"
	} else {
	    set picflag "-KPIC"
	}
    }
}

case $target_triplet in {
    { ia64-*-* } { set as_options "-x" }
    { sparc-*-* } { set as_options "-Av9a" }
    default { set as_options "" }
}

proc test_ar { test lib object expect } {
    global ar
    global nm
    global tmpdir
    global srcdir
    global subdir
    global diff

    verbose -log "$ar -cr $tmpdir/$lib $tmpdir/$object"
    catch "exec $ar -cr $tmpdir/$lib $tmpdir/$object" exec_output
    set exec_output [prune_warnings $exec_output]
    if ![string match "" $exec_output] {
	verbose -log "$exec_output"
	unresolved "$test"
	return
    }

    verbose -log "$nm --print-armap $tmpdir/$lib | grep \" in \" | egrep \"VERS\\|bar\\|foo\" | sort > $tmpdir/nm.out"

    catch "exec $nm --print-armap $tmpdir/$lib | grep \\\ in\\\  | egrep VERS\\\|bar\\\|foo | sort > $tmpdir/nm.out" exec_output
    if [string match "" $exec_output] then {
	catch "exec sort $srcdir/$subdir/$expect | $diff $tmpdir/nm.out -" exec_output
	set exec_output [prune_warnings $exec_output]
	if [string match "" $exec_output] then {
	    pass $test
	    return
	} else {
	    verbose -log "$exec_output"
	    fail "$test"
	    return
	}
    } else {
	verbose -log "$exec_output"
	fail "$test"
    }
}

#
# objdump_emptysymstuff
#	Check non-dynamic symbols and make sure there are none with '@'.
#
proc objdump_emptysymstuff { objdump object } {
    global SOBJDUMP_FLAGS
    global version_output
    global diff

    if ![info exists SOBJDUMP_FLAGS] { set SOBJDUMP_FLAGS "" }

    verbose -log "$objdump $SOBJDUMP_FLAGS $object | sed -n /\@/p"

    catch "exec $objdump $SOBJDUMP_FLAGS $object | sed -n /\@/p" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
# We shouldn't get anything here.
	return 1
    } else {
# it is not normal to come here - we have no output to compare.
	verbose -log "$exec_output"
	verbose -log "objdump_emptysymstuff: did not expect any output from objdump"
	return 0
    }

}

#
# objdump_emptydynsymstuff
#	Check dynamic symbols and make sure there are none with '@'.
#
proc objdump_emptydynsymstuff { objdump object } {
    global DOBJDUMP_FLAGS
    global version_output
    global diff

    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }

    verbose -log "$objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p"

    catch "exec $objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
# We shouldn't get anything here.
	return 1
    } else { if [string match "*objdump: *: not a dynamic object" $exec_output] then {
	return 1
    } else {
# it is not normal to come here - we have no output to compare.
	verbose -log "$exec_output"
	verbose -log "objdump_emptydynsymstuff: did not expect any output from objdump"
	return 0
    } }
}

#
# objdump_emptyverstuff
#	Make sure there is no version information
#
proc objdump_emptyverstuff { objdump object } {
    global VOBJDUMP_FLAGS
    global version_output
    global diff
    global tmpdir

    if {[which $objdump] == 0} then {
	perror "$objdump does not exist"
	return 0
    }

    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }

    verbose -log "$objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out"

    catch "exec $objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
# it is normal to fail here - we have no output to compare.
	return 1
    } else { if { [string match "*libc*" $exec_output] } then {
# this probably means that there is version information in libc, so we
# can't really perform this test.
	return 1
    } else {
	verbose -log "$exec_output"
	verbose -log "objdump_emptyverstuff: did not expect any output from objdump"
	return 0
    } }

}

#
# objdump_symstuff
#	Dump non-dynamic symbol stuff and make sure that it is sane.
#
proc objdump_symstuff { objdump object expectfile } {
    global SOBJDUMP_FLAGS
    global version_output
    global diff
    global tmpdir

    if ![info exists SOBJDUMP_FLAGS] { set SOBJDUMP_FLAGS "" }

    verbose -log "$objdump $SOBJDUMP_FLAGS $object | grep \@ | sort -k 6  > $tmpdir/objdump.out"

    catch "exec $objdump $SOBJDUMP_FLAGS $object | grep \@ | sort -k 6 > $tmpdir/objdump.out" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {

# Now do a line-by-line comparison to effectively diff the darned things
# The stuff coming from the expectfile is actually a regex, so we can
# skip over the actual addresses and so forth.  This is currently very
# simpleminded - it expects a one-to-one correspondence in terms of line
# numbers.

	if [file exists $expectfile] then {
	    set file_a [open $expectfile r]
	} else {
	    perror "$expectfile doesn't exist"
	    return 0
	}

	if [file exists $tmpdir/objdump.out] then {
	    set file_b [open $tmpdir/objdump.out r]
	} else {
	    perror "$tmpdir/objdump.out doesn't exist"
	    return 0
	}

	verbose "# Diff'ing: $expectfile $tmpdir/objdump.out" 2

	set eof -1
	set differences 0

	while { [gets $file_a line] != $eof } {
	    if [regexp "^#.*$" $line] then {
		continue
	    } else {
		lappend list_a $line
	    }
	}
	close $file_a

	while { [gets $file_b line] != $eof } {
	    if [regexp "^#.*$" $line] then {
		continue
	    } else {
		lappend list_b $line
	    }
	}
	close $file_b

	for { set i 0 } { $i < [llength $list_a] } { incr i } {
	    set line_a [lindex $list_a $i]
	    set line_b [lindex $list_b $i]


	    verbose "\t$expectfile: $i: $line_a" 3
	    verbose "\t/tmp/objdump.out: $i: $line_b" 3
	    if [regexp $line_a $line_b] then {
		continue
	    } else {
		verbose -log "\t$expectfile: $i: $line_a"
		verbose -log "\t$tmpdir/objdump.out: $i: $line_b"

		return 0
	    }
	}

	if { [llength $list_a] != [llength $list_b] } {
	    verbose -log "Line count"
	    return 0
	}

	if $differences<1 then {
	    return 1
	}

	return 0
    } else {
	verbose -log "$exec_output"
	return 0
    }

}

#
# objdump_dymsymstuff
#	Dump dynamic symbol stuff and make sure that it is sane.
#
proc objdump_dynsymstuff { objdump object expectfile } {
    global DOBJDUMP_FLAGS
    global version_output
    global diff
    global tmpdir

    if ![info exists DOBJDUMP_FLAGS] { set DOBJDUMP_FLAGS "" }

    verbose -log "$objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p | sort | uniq  > $tmpdir/objdump.out"

    catch "exec $objdump $DOBJDUMP_FLAGS $object | sed -n /VERS/p\\\;/show/p | sort | uniq  > $tmpdir/objdump.out" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {

# Now do a line-by-line comparison to effectively diff the darned things
# The stuff coming from the expectfile is actually a regex, so we can
# skip over the actual addresses and so forth.  This is currently very
# simpleminded - it expects a one-to-one correspondence in terms of line
# numbers.

	if [file exists $expectfile] then {
	    set file_a [open $expectfile r]
	} else {
	    warning "$expectfile doesn't exist"
	    return 0
	}

	if [file exists $tmpdir/objdump.out] then {
	    set file_b [open $tmpdir/objdump.out r]
	} else {
	    fail "$tmpdir/objdump.out doesn't exist"
	    return 0
	}

	verbose "# Diff'ing: $expectfile $tmpdir/objdump.out" 2

	set eof -1
	set differences 0

	while { [gets $file_a line] != $eof } {
	    if [regexp "^#.*$" $line] then {
		continue
	    } else {
		lappend list_a $line
	    }
	}
	close $file_a

	while { [gets $file_b line] != $eof } {
	    if [regexp "^#.*$" $line] then {
		continue
	    } else {
		lappend list_b $line
	    }
	}
	close $file_b

	# Support empty files.
	if { ![info exists list_a] && ![info exists list_b] } then {
	    return 1
	}

	for { set i 0 } { $i < [llength $list_b] } { incr i } {
	    set line_b [lindex $list_b $i]

# The tests are rigged so that we should never export a symbol with the
# word 'hide' in it.  Thus we just search for it, and bail if we find it.
	    if [regexp "hide" $line_b] then {
		verbose -log "\t$tmpdir/objdump.out: $i: $line_b"

		return 0
	    }

	    verbose "\t$expectfile: $i: $line_b" 3

	    # We can't assume that the sort is consistent across
	    # systems, so we must check each regexp.  When we find a
	    # regexp, we null it out, so we don't match it twice.
	    for { set j 0 } { $j < [llength $list_a] } { incr j } {
		set line_a [lindex $list_a $j]

		if [regexp $line_a $line_b] then {
		    lreplace $list_a $j $j "CAN NOT MATCH"
		    break
		}
	    }

	    if { $j >= [llength $list_a] } {
		verbose -log "\t$tmpdir/objdump.out: $i: $line_b"

		return 0
	    }
	}

	if { [llength $list_a] != [llength $list_b] } {
	    verbose -log "Line count"
	    return 0
	}

	if $differences<1 then {
	    return 1
	}

	return 0
    } else {
	verbose -log "$exec_output"
	return 0
    }

}

#
# objdump_versionstuff
#	Dump version definitions/references and make sure that it is sane.
#
proc objdump_versionstuff { objdump object expectfile } {
    global VOBJDUMP_FLAGS
    global version_output
    global diff
    global tmpdir

    if {[which $objdump] == 0} then {
	perror "$objdump does not exist"
	return 0
    }

    if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" }

    verbose -log "$objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out"

    catch "exec $objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {

	# It's OK if there are extra lines in the actual output; they
	# may come from version information in libc.  We require that
	# every line in EXPECTFILE appear in the output in any order.

	set f2 [open $expectfile r]
	while { [gets $f2 l2] != -1 } {
	    if { ![regexp "^#.*$" $l2] } then {
		set f1 [open $tmpdir/objdump.out r]
		while { [gets $f1 l1] != -1 } {
		    if { [string match $l2 $l1] } then {
			break
		    }
		}
		close $f1

		if { ![string match $l2 $l1] } then {
		    verbose -log "Did not find \"$l2\""
		    set f1 [open $tmpdir/objdump.out r]
		    while { [gets $f1 l1] != -1 } {
			verbose -log $l1
		    }
		    close $f1
		    close $f2
		    return 0
		}
	    }
	}
	close $f2
	return 1
    } else {
	verbose -log "$exec_output"
	return 0
    }
}

proc build_binary { shared pic test source libname other mapfile verexp versymexp symexp ldargs } {
    global ld
    global srcdir
    global subdir
    global exec_output
    global host_triplet
    global tmpdir
    global as
    global as_options
    global objdump
    global CC
    global CFLAGS
    global script

    if ![ld_compile "$CC -S $pic $CFLAGS" $srcdir/$subdir/$source $tmpdir/$libname.s]     {
	unresolved "$test"
	return
    }

    if ![ld_assemble $as "$as_options $tmpdir/$libname.s" $tmpdir/$libname.o ]     {
	unresolved "$test"
	return
    }

    set other_lib ""
    if ![string match "" $other] then {
	foreach o $other {
	    set other_lib "$other_lib $tmpdir/$o"
	}
    }

    if [string match "" $mapfile] then {
	set script_arg ""
    } else {
	set script_arg "$script $srcdir/$subdir/$mapfile"
    }

    if {![ld_simple_link $ld $tmpdir/$libname.so "$shared $tmpdir/$libname.o $other_lib $script_arg $ldargs"]}     {
	fail "$test"
	return
    }

    if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]}     {
	fail "$test"
	return
    }

    if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]}     {
	fail "$test"
	return
    }

    if [string match "" $symexp] then {
	if {![objdump_emptysymstuff $objdump $tmpdir/$libname.o ]}     {
	    fail "$test"
	    return
	}
    } else {
	if {![objdump_symstuff $objdump $tmpdir/$libname.o $srcdir/$subdir/$symexp ]}     {
	    fail "$test"
	    return
	}
    }

    pass $test

}

proc build_executable { test source libname other mapfile verexp versymexp symexp } {
  build_binary "" "" $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
}

proc build_vers_lib_no_pic { test source libname other mapfile verexp versymexp symexp } {
  global shared
  # Make sure that PLT is used since PLT is expected.
  global PLT_CFLAGS
  build_binary $shared $PLT_CFLAGS $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
}

proc build_vers_lib_pic { test source libname other mapfile verexp versymexp symexp } {
  global picflag
  global shared
  build_binary $shared $picflag $test $source $libname $other $mapfile $verexp $versymexp $symexp ""
}

proc build_vers_lib_pic_flags { test source libname other mapfile verexp versymexp symexp ldargs } {
  global picflag
  global shared
  build_binary $shared $picflag $test $source $libname $other $mapfile $verexp $versymexp $symexp $ldargs
}

proc test_ldfail { test flag source execname other mapfile whyfail } {
    global srcdir
    global subdir
    global exec_output
    global host_triplet
    global tmpdir
    global as
    global as_options
    global objdump
    global CC
    global CFLAGS
    global script

    if [string match "" $other] then {
	set other_lib ""
    } else {
	set other_lib $tmpdir/$other
    }

    if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
	unresolved "$test"
	return
    }

    if ![ld_assemble $as "$as_options $tmpdir/$execname.s" $tmpdir/$execname.o ]     {
	unresolved "$test"
	return
    }

    verbose -log "This link should fail because of $whyfail"

    if [string match "" $mapfile] then {
	set script_arg ""
    } else {
	set script_arg "-Wl,$script $srcdir/$subdir/$mapfile"
    }

    if {![ld_simple_link $CC $tmpdir/$execname "$tmpdir/$execname.o $other_lib $script_arg"]}     {
	pass "$test"
	return
    }
    fail "$test"
}

proc test_asfail { test flag source execname whyfail } {
    global srcdir
    global subdir
    global tmpdir
    global as
    global CC
    global CFLAGS

    if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
	unresolved "$test"
	return
    }

    verbose -log "This assemble should fail because of $whyfail"
    catch "exec $as -o $tmpdir/$execname.o $tmpdir/$execname.s" exec_output
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
	fail "$test"
	return
    }
    verbose -log "$exec_output"
    pass "$test"
}

proc test_strip_vers_lib { test srclib libname verexp versymexp } {
    global strip
    global srcdir
    global subdir
    global exec_output
    global host_triplet
    global tmpdir
    global objdump

    verbose -log "cp $tmpdir/$srclib $tmpdir/$libname.so"
    exec cp $tmpdir/$srclib $tmpdir/$libname.so

    verbose -log "$strip $tmpdir/$libname.so"
    catch "exec $strip $tmpdir/$libname.so" exec_output
    if [string match "" $exec_output] then {

# If strip went OK, then run the usual tests on the thing to make sure that
# it is sane.
	if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]}     {
	    fail "$test"
	    return
	}

	if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]}     {
	    fail "$test"
	    return
	}

    } else {
	verbose -log "$exec_output"
	fail "$test"
	return
    }
    pass $test
}


proc build_exec { test source execname flags solibname verexp versymexp symexp } {
    global srcdir
    global subdir
    global exec_output
    global host_triplet
    global tmpdir
    global as
    global as_options
    global objdump
    global CC
    global CFLAGS

    set shared "--shared --no-undefined-version"
    set script --version-script
    if ![ld_compile "$CC -S $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s]     {
	unresolved "$test"
	return
    }

    if ![ld_assemble $as "$as_options $tmpdir/$execname.s" $tmpdir/$execname.o ]     {
	unresolved "$test"
	return
    }

    if [string match "" $solibname] then {
	set solibname_lib ""
    } else {
	set solibname_lib $tmpdir/$solibname
    }

    if {![ld_simple_link $CC $tmpdir/$execname "$flags $tmpdir/$execname.o $solibname_lib"]}     {
	fail "$test"
	return
    }

    if [string match "" $verexp] then {
#
# Make sure we get nothing back.
#
	if {![objdump_emptyverstuff $objdump $tmpdir/$execname ]}     {
	    fail "$test"
	    return
	}
    } else {
	if {![objdump_versionstuff $objdump $tmpdir/$execname $srcdir/$subdir/$verexp ]}     {
	    fail "$test"
	    return
	}
    }

    if [string match "" $versymexp] then {
	if {![objdump_emptydynsymstuff $objdump $tmpdir/$execname ]}     {
	    fail "$test"
	    return
	}
    } else {
	if {![objdump_dynsymstuff $objdump $tmpdir/$execname $srcdir/$subdir/$versymexp ]}     {
	    fail "$test"
	    return
	}
    }

    if [string match "" $symexp] then {
	if {![objdump_emptysymstuff $objdump $tmpdir/$execname.o ]}     {
	    fail "$test"
	    return
	}
    } else {
	if {![objdump_symstuff $objdump $tmpdir/$execname.o $srcdir/$subdir/$symexp ]}     {
	    fail "$test"
	    return
	}
    }

    pass $test
}

if { [istarget x86_64-*-linux*] \
     || [istarget arm*-*-*] \
     || ( [istarget mips*-*-linux*] && [at_least_gcc_version 4 3] ) } {
    # x86_64, ARM and newer MIPS toolchains do not like non-pic shared libraries
    set pic "yes"
} else {
    set pic "no"
}

#
# Basic test - build a library with versioned symbols.
#
build_vers_lib_pic "vers1" vers1.c vers1 "" vers1.map vers1.ver vers1.dsym vers1.sym


#
# Test #2 - build a library, and link it against the library we built in step
# 1.
#
build_vers_lib_pic "vers2" vers2.c vers2 vers1.so vers2.map vers2.ver vers2.dsym ""

#
# Test #3 - build an executable, and link it against vers1.so.
#
build_exec "vers3" vers3.c vers3 "-Wl,--no-as-needed" vers1.so vers3.ver vers3.dsym ""

#
# Test #4 - Make sure a version implicitly defined in an executable
# causes a version node to be created.  Verify this both with and without
# --export-dynamic.
#

# This test fails on MIPS.  On the MIPS we must put foo in the dynamic
# symbol table, which the test does not expect.
setup_xfail "mips*-*-*"
build_exec "vers4" vers4.c vers4 "" "" "" "" vers4.sym

build_exec "vers4a" vers4.c vers4a "-Wl,-export-dynamic" "" vers4a.ver vers4a.dsym vers4a.sym

# Verify that --no-export-dynamic undoes the effect of --export-dynamic.
setup_xfail "mips*-*-*"
build_exec "vers4b" vers4.c vers4b "-Wl,-export-dynamic -Wl,--no-export-dynamic" "" "" "" vers4.sym


#
# Try multiple definitions foo@BAR and foo@@BAR and make sure the linker
# complains.
#
test_ldfail "vers5" "" vers5.c vers5 "" "" "multiple definition of foo@VERS_1.2"

#
#
# Now build a test that should reference a bunch of versioned symbols.
# All of them should be correctly referenced.
#
build_exec "vers6" vers6.c vers6 "-Wl,--no-as-needed" vers1.so vers6.ver vers6.dsym vers6.sym

#
# Another test to verify that something made local via 'local' is truly not
# accessible.
#
if [string match "yes" $pic] then {
    xfail "vers7a"
    xfail "vers7"
} else {
    build_vers_lib_no_pic "vers7a" vers7a.c vers7a "" vers7.map vers7a.ver vers7a.dsym vers7a.sym

    test_ldfail "vers7" "" vers7.c vers7 vers7a.so "" "undefined reference to hide_a"
}


#
# This test is designed to verify that we can pass a linker script on the
# command line as if it were a normal .o file.
#
catch "exec cp $srcdir/$subdir/vers8.map $tmpdir/" ignore_output
build_vers_lib_pic "vers8" vers1.c vers8 vers8.map "" vers8.ver vers1.dsym vers1.sym

#
# This test tries to make sure that version references to versioned symbols
# don't collide with default definitions with the same symbol.
#
build_exec "vers9" vers9.c vers9 "-Wl,-export-dynamic" "" vers9.ver vers9.dsym vers9.sym


#
# Try and use a non-existant version node.  The linker should fail with
# an error message.
#
test_ldfail "vers10" "-DDO_TEST10" vers1.c vers10 "" "vers1.map --shared" "invalid version"

#
# Try and some things the assembler should complain about.
#
test_asfail "vers11" "-DDO_TEST11" vers1.c vers11 "no @ in symver"

test_asfail "vers12" "-DDO_TEST12" vers1.c vers12 "extern version definition"

#
# Put a shared library in an archive library, and make sure the global
# archive symbol table is sane.
#
test_ar "ar with versioned solib" vers13.a vers1.so vers13.asym

#
# Strip a shared library, and make sure we didn't screw something up in there.
#
test_strip_vers_lib "vers14" vers1.so vers14 vers1.ver vers1.dsym


#
# Build another test with some versioned symbols.  Here we are going to
# try and override something from the library, and we shouldn't get
# any errors.
#
build_exec "vers15" vers15.c vers15 "-Wl,--no-as-needed" vers1.so vers15.ver vers15.dsym vers15.sym

#
# Test that when we override a versioned symbol from the library this
# symbol appears in the dynamic symbol table of the executable.
#
build_vers_lib_pic "vers16a" vers16a.c vers16a "" vers16.map vers16a.ver vers16a.dsym ""
build_exec "vers16" vers16.c vers16 "-Wl,--no-as-needed" vers16a.so "" vers16.dsym ""

# Test a weak versioned symbol.
build_vers_lib_pic "vers17" vers17.c vers17 "" vers17.map vers17.ver vers17.dsym ""
build_vers_lib_pic "vers18" vers18.c vers18 vers17.so vers18.map vers18.ver vers18.dsym vers18.sym
build_exec "vers19" vers19.c vers19 "-Wl,-rpath,. -Wl,-rpath-link,--no-as-needed" vers18.so vers19.ver vers19.dsym ""

build_vers_lib_no_pic "vers20a" vers20.c vers20a "" vers20.map vers20a.ver vers20.dsym ""
exec cp $tmpdir/vers20a.so $tmpdir/vers20b.so
build_vers_lib_no_pic "vers20" vers20.c vers20 "vers20a.so vers20b.so" vers20.map vers20.ver vers20.dsym ""

# Test .symver override.
build_vers_lib_pic "vers21" vers21.c vers21 "" vers21.map vers21.ver vers21.dsym vers21.sym

# Test moving default definition from one DSO to another.
build_vers_lib_pic "vers22a" vers22a.c vers22a "" vers22.map vers22a.ver vers22a.dsym vers22a.sym
build_vers_lib_pic "vers22b" vers22b.c vers22b "" vers22.map vers22b.ver vers22b.dsym ""
build_vers_lib_pic "vers22" vers22.c vers22 "vers22a.so vers22b.so" "" vers22.ver vers22.dsym ""

# Test versioned definitions in different files.
if [string match "yes" $pic] then {
    xfail "vers23a"
    xfail "vers23b"
    xfail "vers23c"
    xfail "vers23d"
    xfail "vers23"
} else {
    build_vers_lib_no_pic "vers23a" vers23a.c vers23a "" vers23a.map vers23a.ver vers23a.dsym vers23a.sym
    build_vers_lib_no_pic "vers23b" vers23b.c vers23b "" vers23b.map vers23b.ver vers23b.dsym ""
    build_vers_lib_no_pic "vers23c" vers23b.c vers23c "vers23a.so" vers23b.map vers23c.ver vers23b.dsym ""
    build_exec "vers23d" vers23.c vers23d "-Wl,--no-as-needed tmpdir/vers23a.so tmpdir/vers23c.so" "" vers23.ver vers23d.dsym ""
    build_exec "vers23" vers23.c vers23 "-Wl,--no-as-needed tmpdir/vers23a.so tmpdir/vers23b.o tmpdir/vers23b.so" "" vers23.ver vers23.dsym ""
}

# Test .symver x,x@VERS.0
set as_pic_flags ""
if [istarget sparc*-*-*] {
  set as_pic_flags "-K PIC"
}
run_ld_link_tests [list "\"vers24a\"
			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
			 \"$as_pic_flags $as_options\" {vers24a.c vers24b.c} { { readelf -Wrs vers24.rd } }
			 \"libvers24a.so\" \"-fpic\""]
run_ld_link_tests [list "\"vers24b\"
			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
			 \"$as_pic_flags $as_options\" {vers24b.c vers24a.c} { { readelf -Wrs vers24.rd } }
			 \"libvers24b.so\" \"-fpic\""]
run_ld_link_tests [list "\"vers24c\"
			 \"-shared --version-script $srcdir/$subdir/vers24.map\" \"\"
			 \"$as_pic_flags $as_options\" {vers24c.c} { { readelf -Wrs vers24.rd } }
			 \"libvers24c.so\" \"-fpic\""]

# Test versioned definition vs. normal definition in different files.
if [string match "yes" $pic] then {
    xfail "vers25a"
    xfail "vers25b1"
    xfail "vers25b2"
} else {
    build_vers_lib_no_pic "vers25a" vers25a.c vers25a "" vers25a.map vers25a.ver vers25a.dsym ""
    build_vers_lib_no_pic "vers25b1" vers25b.c vers25b1 "vers25a.o vers25a.so" "" vers25b.ver vers25b.dsym ""
    build_vers_lib_no_pic "vers25b2" vers25b.c vers25b2 "vers25a.so vers25a.o" "" vers25b.ver vers25b.dsym ""
}

build_vers_lib_pic "vers26a" vers26a.c vers26a "" vers26a.map vers26a.ver vers26a.dsym ""
build_vers_lib_pic "vers26b1" vers26b.c vers26b1 "" "" vers26b.ver vers26b.dsym ""
build_vers_lib_pic "vers26b2" vers26b.c vers26b2 "vers26a.so vers26b1.so vers26a.o" "" vers26b.ver vers26b.dsym ""
if [string match "yes" $pic] then {
    xfail "vers26b3"
} else {
    build_vers_lib_no_pic "vers26b3" vers26b.c vers26b3 "vers26a.so vers26b1.so vers26a.o" "" vers26b.ver vers26b.dsym ""
}

# Test versioned definition vs. hidden definition in different files.
if [string match "yes" $pic] then {
    xfail "vers27a"
    xfail "vers27b"
    xfail "vers27c1"
    xfail "vers27c2"
    xfail "vers27d1"
    xfail "vers27d2"
    xfail "vers27d3"
    xfail "vers27d4"
    xfail "vers27d5"
} else {
    build_vers_lib_no_pic "vers27a" vers27a.c vers27a "" vers27a.map vers27a.ver vers27a.dsym ""
    build_vers_lib_no_pic "vers27b" vers27b.c vers27b "" "" vers27b.ver vers27b.dsym ""
    build_vers_lib_no_pic "vers27c1" vers27c.c vers27c1 "vers27b.o vers27a.so" "" vers27c.ver vers27c.dsym ""
    build_vers_lib_no_pic "vers27c2" vers27c.c vers27c2 "vers27a.so vers27b.o" "" vers27c.ver vers27c.dsym ""
    build_vers_lib_pic "vers27d1" vers27d1.c vers27d1 "" vers27a.map vers27d.ver vers27d.dsym vers27d.sym
   build_vers_lib_pic "vers27d2" vers27d2.c vers27d2 "" "" vers27b.ver vers27b.dsym ""
    build_executable "vers27d3" vers27d3.c vers27d3 "vers27b.o vers27d2.so vers27d1.so" "" vers27b.ver vers27b.dsym ""
    build_vers_lib_pic "vers27d4" vers27d2.c vers27d4 "vers27a.so" "" vers27d4.ver vers27d4.dsym ""
    build_executable "vers27d5" vers27d3.c vers27d5 "vers27d4.so vers27b.o vers27a.so" "" vers27b.ver vers27b.dsym ""
}

# Test weak versioned definition vs. strong definition in different
# files.
build_vers_lib_pic "vers28a" vers28a.c vers28a "" "" vers28a.ver vers28a.dsym ""
build_vers_lib_pic "vers28b" vers28b.c vers28b "" vers28b.map vers28b.ver vers28b.dsym ""
build_vers_lib_pic "vers28c" vers28c.c vers28c "vers28b.so vers28a.so" "" vers28c.ver vers28c.dsym ""
build_vers_lib_pic_flags "vers29" vers29.c vers29 "" "" vers29.ver vers29.dsym "" "--default-symver"

# Test #30 - test handling of symbol names global, local and extern in the
# version script.
build_vers_lib_pic "vers30" vers30.c vers30 "" vers30.map vers30.ver vers30.dsym ""

# Test #31 -- quoted strings in version sections.
build_vers_lib_pic "vers31" vers31.c vers31 "" vers31.map vers31.ver vers31.dsym ""

# Test #32 -- linker --defsym
build_vers_lib_pic "vers32a" vers32a.c vers32a "" vers32.map vers32a.ver vers32a.dsym ""
build_vers_lib_pic_flags "vers32b" vers32b.c vers32b "vers32a.so" vers32.map vers32b.ver vers32b.dsym "" "--defsym foo=0"
