1 # Expect script
for ld-auto
-import tests
3 # Free Software Foundation
, Inc.
5 # This file is part of the GNU Binutils.
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.
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.
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
,
22 # Written by Ralf.Habacker@freenet.de
23 # Based
on ls
-shared
/shared.exp by Ian Lance Taylor
(ian@cygnus.com
)
28 # This test checks the
"auto importing direct from a dll" functionality,
29 # which dramatically reduces the linking time
for big libraries and applications
30 # by skipping creating
/using
import libraries. Instead it links directly to the
31 # related dll or to a symlinked dll
for replacing regular
import libraries.
33 # The test has
4 stages
:
35 #
1.
compile and link a test dll exporting some
text and data symbols and a
36 # standard
import library
38 #
2. create a symbolic link to this dll to simulate a replaced
import library.
40 #
3.
compile and link a client application with the standard
import library.
41 # This should produce no errors.
43 #
4.
compile and link a client application with the created dll.
44 # This should also produce no errors.
46 #
5.
compile and link a client application using the
"import library".
47 # This should also produce no errors.
49 #
6.
compile and link a client application with auto
-import disabled.
50 # This should produce a linking error.
52 # This test can only be run
if ld generates native executables.
53 if ![isnative
] then {return}
55 # This test can only be run
on a couple of ELF platforms.
56 # Square bracket expressions seem to confuse istarget.
57 if { ![istarget
*-pc
-cygwin
]
58 && ![istarget
*-pc
-mingw
*] } {
62 # No compiler
, no test.
63 if { [which $CC
] == 0 } {
64 untested
"Auto import test"
69 # link a
program using
ld, without including
any libraries
71 proc ld_special_link
{ ld target objects
} {
75 if { [which $
ld] == 0 } then {
76 perror
"$ld does not exist"
80 if [is_endian_output_format $objects
] then {
81 set flags
[big_or_little_endian
]
86 verbose
-log "$ld $flags -o $target $objects"
88 catch
"exec $ld $flags -o $target $objects" link_output
89 set exec_output
[prune_warnings $link_output
]
91 # We don
't care if we get a warning about a non-existent start
92 # symbol, since the default linker script might use ENTRY.
93 regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
95 # We don't care
if we
get a message about creating a library file.
96 regsub
-all
"(^|\n)(Creating library file\[^\n\]*\n?)" $exec_output "\\1" exec_output
98 if [string match
"" $exec_output] then {
101 verbose
-log "$exec_output"
109 if [istarget
*-pc
-cygwin
] {
110 #
Set some libs needed
for cygwin.
111 set MYLIBS
"-L/usr/lib -lcygwin -L/usr/lib/w32api -lkernel32"
114 if ![ld_compile
"$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/dll.c $tmpdir/dll.o ] {
115 fail
"compiling shared lib"
116 } elseif
![ld_special_link
"$ld -shared --out-implib=$tmpdir/libstandard.dll.a" $tmpdir/dll.dll "$tmpdir/dll.o $MYLIBS" ] {
117 fail
"linking shared lib"
119 # Create symbolic link.
120 catch
"exec ln -fs dll.dll $tmpdir/libsymlinked_dll.dll.a" ln_catch
122 #
Compile and link the client
program.
123 if ![ld_compile
"$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/client.c $tmpdir/client.o ] {
124 fail
"compiling client"
126 # Check linking with
import library.
127 set msg
"linking auto-import client using a standard import library"
128 if [ld_special_link $
ld $tmpdir
/client.exe
"--enable-auto-import /lib/crt0.o $tmpdir/client.o -L$tmpdir -lstandard $MYLIBS" ] {
134 # Check linking directly with dll.
135 set msg
"linking auto-import client using the dll"
136 if [ld_special_link $
ld $tmpdir
/client.exe
"--enable-auto-import /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS" ] {
142 # Check linking with symlinked dll.
143 set msg
"linking auto-import client using symbolic linked dll"
144 if [ld_special_link $
ld $tmpdir
/clientimport.exe
"--enable-auto-import /lib/crt0.o $tmpdir/client.o -L$tmpdir -lsymlinked_dll $MYLIBS" ] {
150 # Check linking with disabled auto
-import, this must produce linking error.
151 set msg
"linking with disabled auto-import"
152 if ![ld_special_link $
ld $tmpdir
/clientimport.exe
"--disable-auto-import /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS" ] {
161 if [istarget
*-pc
-mingw
*] {
162 unsupported
"mingw currently not supported"