Run more ld tests when not native
[external/binutils.git] / ld / testsuite / ld-pe / pe-compile.exp
1 # Expect script for complex PE tests that require a C compiler
2 # in addition to the just-built binutils.
3 #   Copyright (C) 2009-2017 Free Software Foundation, Inc.
4 #
5 # This file is part of the GNU Binutils.
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 # MA 02110-1301, USA.
21 #
22
23 # These tests can only be run on PE/COFF platforms.
24 if {![is_pecoff_format]} {
25     return
26 }
27
28 # No compiler, no test.
29 if { [which $CC] == 0 } {
30     untested "PE version scripts"
31     untested "aligned common tests"
32     # Add more "untested" directives here when adding more tests below.
33     return
34 }
35
36 proc build_basefile1_o {} {
37     global CC
38     global CFLAGS
39     global srcdir
40     global subdir
41
42     # Compile the object file.
43     if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/basefile1.s tmpdir/basefile1.o] {
44         fail "compiling basefile1 object"
45     }
46 }
47
48 proc run_basefile_test { testname } {
49     global LD
50     global DLLTOOL
51     global srcdir
52     global subdir
53     global verbose
54
55     if ![ld_link "$LD -e start \
56             --base-file=tmpdir/$testname.base \
57             --export-all-symbols" tmpdir/$testname.dll \
58             "tmpdir/basefile1.o"] {
59         fail "linking DLL"
60         return
61     }
62
63     if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.base]" 3 }
64
65     catch "exec wc -c tmpdir/$testname.base" err
66
67     if ![string match "0 tmpdir/$testname.base" [string trim $err]] then {
68       send_log "$err\n"
69       if { $verbose == 2 } then { verbose "$err" 2 }
70       fail $testname
71       return
72     }
73
74     pass "$testname"
75 }
76
77 proc build_vers_script_dll_o {} {
78     global CC
79     global CFLAGS
80     global srcdir
81     global subdir
82
83     # Compile the object file.
84     if ![ld_compile "$CC $CFLAGS -shared" $srcdir/$subdir/vers-script-dll.c tmpdir/vers-script-dll.o] {
85         fail "compiling shared lib object"
86     }
87 }
88
89 proc run_ver_script_test { testname } {
90     global CC
91     global srcdir
92     global subdir
93     global verbose
94
95     if ![ld_link "$CC -shared \
96             -Wl,--version-script,$srcdir/$subdir/$testname.ver \
97             -Wl,--output-def,tmpdir/$testname.def" tmpdir/$testname.dll \
98             "tmpdir/vers-script-dll.o"] {
99         fail "linking DLL"
100     }
101
102     if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 3 }
103     if { [regexp_diff tmpdir/$testname.def $srcdir/$subdir/$testname.d] } then {
104         fail $testname
105         if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 2 }
106         return
107     }
108
109     pass "$testname"
110 }
111
112
113 build_vers_script_dll_o
114
115 run_ver_script_test "vers-script-1"
116 run_ver_script_test "vers-script-2"
117 run_ver_script_test "vers-script-3"
118 run_ver_script_test "vers-script-4"
119
120 if {[istarget i*86-*-cygwin*]
121     || [istarget i*86-*-pe]
122     || [istarget i*86-*-mingw*]
123     || [istarget x86_64-*-mingw*] } {
124
125    build_basefile1_o
126    run_basefile_test "basefile-secrel"
127  } else {
128     untested "PE basefile test"
129  }
130
131 set align_tests {
132   {"aligned common 1" "" "" "" {aligncomm-1.c}
133    {{nm -C aligncomm.d}} "aligncomm-1.x"}
134   {"aligned common 2" "" "" "" {aligncomm-2.c}
135    {{nm -C aligncomm.d}} "aligncomm-2.x"}
136   {"aligned common 3" "" "" "" {aligncomm-3.c}
137    {{nm -C aligncomm.d}} "aligncomm-3.x"}
138   {"aligned common 4" "" "" "" {aligncomm-4.c}
139    {{nm -C aligncomm.d}} "aligncomm-4.x"}
140 }
141
142 run_ld_link_tests $align_tests