# Expect script for ld-version tests
#   Copyright (C) 1997-2014 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
  build_binary $shared "" $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"
