1# Expect script for complex PE tests that require a C compiler
2# in addition to the just-built binutils.
3#   Copyright (C) 2009-2016 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.
24if {![is_pecoff_format]} {
25    return
26}
27
28# No compiler, no test.
29if { [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
36proc 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
48proc run_basefile_test { testname } {
49    global LD
50    global DLLTOOL
51    global srcdir
52    global subdir
53    global verbose
54
55    if ![ld_simple_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
77proc 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
89proc run_ver_script_test { testname } {
90    global CC
91    global srcdir
92    global subdir
93    global verbose
94
95    if ![ld_simple_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
113build_vers_script_dll_o
114
115run_ver_script_test "vers-script-1"
116run_ver_script_test "vers-script-2"
117run_ver_script_test "vers-script-3"
118run_ver_script_test "vers-script-4"
119
120if {[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
131set 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
142run_ld_link_tests $align_tests
143