From 3bb727441d45dc357080da05218af31275d03e92 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 2 Jun 2003 09:11:01 +0000 Subject: [PATCH] Add new test for cygwin target: building an executable with an export table. --- ld/testsuite/ChangeLog | 10 ++ ld/testsuite/ld-cygwin/exe-export.exp | 151 ++++++++++++++++++++++++++ ld/testsuite/ld-cygwin/testdll.c | 14 +++ ld/testsuite/ld-cygwin/testdll.def | 4 + ld/testsuite/ld-cygwin/testexe.c | 16 +++ ld/testsuite/ld-cygwin/testexe.def | 5 + 6 files changed, 200 insertions(+) create mode 100644 ld/testsuite/ld-cygwin/exe-export.exp create mode 100644 ld/testsuite/ld-cygwin/testdll.c create mode 100644 ld/testsuite/ld-cygwin/testdll.def create mode 100644 ld/testsuite/ld-cygwin/testexe.c create mode 100644 ld/testsuite/ld-cygwin/testexe.def diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f98a3a2b187..e3152e32ea5 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2003-06-02 Fabrizio Gennari + + * ld-cygwin: New directory. + * ld-cygwin/exe-export.exp: New test script. Checks building + cygwin executables with an export table. + * ld-cygwin/testdll.def: New source file. + * ld-cygwin/testexe.def: New source file. + * ld-cygwin/testdll.c: New source file. + * ld-cygwin/testexe.c: New source file. + 2003-05-30 H.J. Lu * config/default.exp: Load tmpdir/libpath.exp. diff --git a/ld/testsuite/ld-cygwin/exe-export.exp b/ld/testsuite/ld-cygwin/exe-export.exp new file mode 100644 index 00000000000..fe2a3abad2c --- /dev/null +++ b/ld/testsuite/ld-cygwin/exe-export.exp @@ -0,0 +1,151 @@ +# Expect script for export table in executables tests +# Copyright 2003 +# Free Software Foundation, Inc. +# +# This file 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Written by Fabrizio Gennari +# Based on auto-import.exp by Ralf.Habacker@freenet.de +# + +# This test can only be run on a cygwin platforms. +if {![istarget *-pc-cygwin]} { + verbose "Not a cygwin target." + return +} + +# No compiler, no test. +if { [which $CC] == 0 } { + untested "Exe export test (no compiler available)" + return +} + +proc run_dlltool { lib_file def_file } { + global dlltool + global base_dir + global as + + if ![info exists dlltool] then { + set dlltool [findfile $base_dir/../binutils/dlltool] + } + + if { [which $dlltool] == 0 } then { + verbose "$dlltool does not exist" + return 0 + } + + verbose "$dlltool --as $as -l $lib_file -d $def_file" + catch "exec $dlltool --as $as -l $lib_file -d $def_file" dlltool_output + + #remove empty lines + regsub -all "\n+" $dlltool_output "" dlltool_output + + if [string match "" $dlltool_output] then { + return 1 + } + + verbose -log "$dlltool_output" + return 0 +} + +# ld_special_link +# A copy of ld_simple_link (from ld-lib.exp) with extra +# code to strip warnings about creating libraries. +# +proc ld_special_link { ld target objects } { + global host_triplet + global link_output + + if { [which $ld] == 0 } then { + verbose "$ld does not exist" + return 0 + } + + if [is_endian_output_format $objects] then { + set flags [big_or_little_endian] + } else { + set flags "" + } + + verbose -log "$ld $flags -o $target $objects" + catch "exec $ld $flags -o $target $objects" link_output + + set exec_output [prune_warnings $link_output] + + # We don't care if we get a warning about a non-existent start + # symbol, since the default linker script might use ENTRY. + regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output + + # We don't care if we get a message about creating a library file. + regsub -all "(^|\n)(Creating library file\[^\n\]*\n?)" $exec_output "\\1" exec_output + + if [string match "" $exec_output] then { + return 1 + } + + verbose -log "$exec_output" + return 0 +} + +set tmpdir tmpdir + +# Set some libs needed for cygwin. +set MYLDFLAGS "-Wl,--out-implib,$tmpdir/testexe.lib -nostartfiles -nostdlib" + +# Build an export library for testdll +if ![run_dlltool $tmpdir/testdll.lib $srcdir/$subdir/testdll.def] { + fail "building an export library for the shared lib" + return +} + +# Compile the executable. +if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/testexe.c $tmpdir/testexe.o] { + fail "compiling executable" + return +} + +if ![ld_special_link "$CC $LDFLAGS $MYLDFLAGS -e _testexe_main@16" $tmpdir/testexe.exe "$tmpdir/testexe.o $srcdir/$subdir/testexe.def $tmpdir/testdll.lib"] { + fail "linking executable" + return +} + +# Compile the dll. +if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/testdll.c $tmpdir/testdll.o] { + fail "compiling shared lib" + return +} + +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"] { + fail "linking shared lib" + return +} + +# This is as far as we can go with a cross-compiler +if ![isnative] then { + verbose "Not running natively, so cannot execute binary" + pass "Compile and link and executable with an export table" + return +} + +verbose -log "executing $tmpdir/testexe.exe" +catch "exec $tmpdir/testexe.exe" prog_output + +set expected "" +if [string match $expected $prog_output] then { + pass "export table in executable" +} else { + verbose $prog_output + fail "Output does not match expected string $expected" +} diff --git a/ld/testsuite/ld-cygwin/testdll.c b/ld/testsuite/ld-cygwin/testdll.c new file mode 100644 index 00000000000..206430737ab --- /dev/null +++ b/ld/testsuite/ld-cygwin/testdll.c @@ -0,0 +1,14 @@ +extern void exewrite (void); +__attribute((dllimport)) int global_a; + +void +dllwrite (void) +{ + global_a = 3; + exewrite (); +} + +int _stdcall testdll_main(int p1, unsigned long p2, void* p3) +{ + return 1; +} diff --git a/ld/testsuite/ld-cygwin/testdll.def b/ld/testsuite/ld-cygwin/testdll.def new file mode 100644 index 00000000000..05e6c8868f3 --- /dev/null +++ b/ld/testsuite/ld-cygwin/testdll.def @@ -0,0 +1,4 @@ +LIBRARY testdll + +EXPORTS +dllwrite diff --git a/ld/testsuite/ld-cygwin/testexe.c b/ld/testsuite/ld-cygwin/testexe.c new file mode 100644 index 00000000000..333c3892265 --- /dev/null +++ b/ld/testsuite/ld-cygwin/testexe.c @@ -0,0 +1,16 @@ +int global_a = 2; + +void +exewrite (void) +{ + global_a = 1; +} + +extern void dllwrite (void); + +int _stdcall +testexe_main (void* p1, void *p2, char* p3, int p4) +{ + dllwrite (); + return 0; +} diff --git a/ld/testsuite/ld-cygwin/testexe.def b/ld/testsuite/ld-cygwin/testexe.def new file mode 100644 index 00000000000..7570578c3dc --- /dev/null +++ b/ld/testsuite/ld-cygwin/testexe.def @@ -0,0 +1,5 @@ +NAME testexe.exe + +EXPORTS +exewrite +global_a DATA -- 2.30.2