--- /dev/null
+# Expect script for export table in executables tests\r
+# Copyright 2003\r
+# Free Software Foundation, Inc.\r
+#\r
+# This file is free software; you can redistribute it and/or modify\r
+# it under the terms of the GNU General Public License as published by\r
+# the Free Software Foundation; either version 2 of the License, or\r
+# (at your option) any later version.\r
+# \r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+# GNU General Public License for more details.\r
+# \r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+#\r
+# Written by Fabrizio Gennari <fabrizio.ge@tiscalinet.it>\r
+# Based on auto-import.exp by Ralf.Habacker@freenet.de\r
+#\r
+ \r
+# This test can only be run on a cygwin platforms.\r
+if {![istarget *-pc-cygwin]} {\r
+ verbose "Not a cygwin target."\r
+ return\r
+}\r
+\r
+# No compiler, no test.\r
+if { [which $CC] == 0 } {\r
+ untested "Exe export test (no compiler available)"\r
+ return\r
+}\r
+\r
+proc run_dlltool { lib_file def_file } {\r
+ global dlltool\r
+ global base_dir\r
+ global as\r
+ \r
+ if ![info exists dlltool] then {\r
+ set dlltool [findfile $base_dir/../binutils/dlltool]\r
+ }\r
+\r
+ if { [which $dlltool] == 0 } then {\r
+ verbose "$dlltool does not exist"\r
+ return 0\r
+ }\r
+\r
+ verbose "$dlltool --as $as -l $lib_file -d $def_file"\r
+ catch "exec $dlltool --as $as -l $lib_file -d $def_file" dlltool_output\r
+\r
+ #remove empty lines\r
+ regsub -all "\n+" $dlltool_output "" dlltool_output\r
+\r
+ if [string match "" $dlltool_output] then {\r
+ return 1\r
+ }\r
+\r
+ verbose -log "$dlltool_output"\r
+ return 0\r
+}\r
+\r
+# ld_special_link\r
+# A copy of ld_simple_link (from ld-lib.exp) with extra\r
+# code to strip warnings about creating libraries.\r
+#\r
+proc ld_special_link { ld target objects } {\r
+ global host_triplet\r
+ global link_output\r
+\r
+ if { [which $ld] == 0 } then {\r
+ verbose "$ld does not exist"\r
+ return 0\r
+ }\r
+\r
+ if [is_endian_output_format $objects] then {\r
+ set flags [big_or_little_endian]\r
+ } else {\r
+ set flags ""\r
+ }\r
+\r
+ verbose -log "$ld $flags -o $target $objects"\r
+ catch "exec $ld $flags -o $target $objects" link_output\r
+\r
+ set exec_output [prune_warnings $link_output]\r
+\r
+ # We don't care if we get a warning about a non-existent start\r
+ # symbol, since the default linker script might use ENTRY.\r
+ regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output\r
+\r
+ # We don't care if we get a message about creating a library file.\r
+ regsub -all "(^|\n)(Creating library file\[^\n\]*\n?)" $exec_output "\\1" exec_output\r
+\r
+ if [string match "" $exec_output] then {\r
+ return 1\r
+ }\r
+\r
+ verbose -log "$exec_output"\r
+ return 0\r
+}\r
+\r
+set tmpdir tmpdir\r
+\r
+# Set some libs needed for cygwin.\r
+set MYLDFLAGS "-Wl,--out-implib,$tmpdir/testexe.lib -nostartfiles -nostdlib"\r
+\r
+# Build an export library for testdll\r
+if ![run_dlltool $tmpdir/testdll.lib $srcdir/$subdir/testdll.def] {\r
+ fail "building an export library for the shared lib"\r
+ return\r
+} \r
+\r
+# Compile the executable.\r
+if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/testexe.c $tmpdir/testexe.o] {\r
+ fail "compiling executable"\r
+ return\r
+}\r
+\r
+if ![ld_special_link "$CC $LDFLAGS $MYLDFLAGS -e _testexe_main@16" $tmpdir/testexe.exe "$tmpdir/testexe.o $srcdir/$subdir/testexe.def $tmpdir/testdll.lib"] {\r
+ fail "linking executable"\r
+ return\r
+} \r
+\r
+# Compile the dll.\r
+if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/testdll.c $tmpdir/testdll.o] {\r
+ fail "compiling shared lib"\r
+ return\r
+}\r
+\r
+if ![ld_special_link "$CC $LDFLAGS -nostartfiles -nostdlib -e _testdll_main@12" $tmpdir/testdll.dll "$tmpdir/testdll.o $srcdir/$subdir/testdll.def $tmpdir/testexe.lib"] {\r
+ fail "linking shared lib"\r
+ return\r
+} \r
+\r
+# This is as far as we can go with a cross-compiler\r
+if ![isnative] then {\r
+ verbose "Not running natively, so cannot execute binary"\r
+ pass "Compile and link and executable with an export table"\r
+ return\r
+}\r
+\r
+verbose -log "executing $tmpdir/testexe.exe"\r
+catch "exec $tmpdir/testexe.exe" prog_output\r
+\r
+set expected ""\r
+if [string match $expected $prog_output] then {\r
+ pass "export table in executable"\r
+} else {\r
+ verbose $prog_output\r
+ fail "Output does not match expected string $expected"\r
+}\r