
The result of running etc/update-copyright.py --this-year, fixing all the files whose mode is changed by the script, plus a build with --enable-maintainer-mode --enable-cgen-maint=yes, then checking out */po/*.pot which we don't update frequently. The copy of cgen was with commit d1dd5fcc38ead reverted as that commit breaks building of bfp opcodes files.
176 lines
5.9 KiB
Text
176 lines
5.9 KiB
Text
# Expect script for ld-auto-import tests
|
|
# Copyright (C) 2002-2022 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of the GNU Binutils.
|
|
#
|
|
# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
#
|
|
# Written by Ralf.Habacker@freenet.de
|
|
# Based on ls-shared/shared.exp by Ian Lance Taylor (ian@cygnus.com)
|
|
#
|
|
|
|
# Note:
|
|
#
|
|
# This script tests some auto-import functionality:
|
|
#
|
|
# A. "auto importing direct from a dll" functionality, which dramatically reduces the
|
|
# linking time for big libraries and applications by skipping creating/using
|
|
# import libraries. Instead it links directly to the related dll or to a symlinked
|
|
# dll for replacing regular import libraries. The test has 6 stages:
|
|
#
|
|
# 1. compile and link a test dll exporting some text and data symbols and a
|
|
# standard import library
|
|
#
|
|
# 2. create a symbolic link to this dll to simulate a replaced import library.
|
|
#
|
|
# 3. compile and link a client application with the standard import library.
|
|
# This should produce no errors.
|
|
#
|
|
# 4. compile and link a client application with the created dll.
|
|
# This should also produce no errors.
|
|
#
|
|
# 5. compile and link a client application using the "import library".
|
|
# This should also produce no errors.
|
|
#
|
|
# 6. compile and link a client application with auto-import disabled.
|
|
# This should produce a linking error.
|
|
#
|
|
# B. runtime check if there are no segfaults when importing const data variables
|
|
#
|
|
|
|
# This test can only be run if ld generates native executables.
|
|
if ![isnative] then {return}
|
|
|
|
# This test can only be run on a couple of platforms.
|
|
# Square bracket expressions seem to confuse istarget.
|
|
if { ![istarget *-pc-cygwin]
|
|
&& ![istarget *-pc-mingw*] } {
|
|
return
|
|
}
|
|
|
|
if [istarget *-pc-mingw*] {
|
|
# FIXME: Add support for this target.
|
|
unsupported "mingw currently not supported"
|
|
}
|
|
|
|
# No compiler, no test.
|
|
if { ![check_compiler_available] } {
|
|
untested "Auto import test (compiler not found)"
|
|
return
|
|
}
|
|
|
|
# ld_special_link
|
|
# link a program using ld, without including any libraries
|
|
#
|
|
proc ld_special_link { ld target objects } {
|
|
global host_triplet
|
|
global link_output
|
|
|
|
if { [which $ld] == 0 } then {
|
|
perror "$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 SHCFLAG ""
|
|
|
|
if [istarget *-pc-cygwin] {
|
|
# Set some libs needed for cygwin.
|
|
set MYLIBS "-L/usr/lib -lcygwin -L/usr/lib/w32api -lkernel32"
|
|
|
|
# Compile the dll.
|
|
if ![ld_compile "$CC_FOR_TARGET $SHCFLAG" $srcdir/$subdir/dll.c $tmpdir/dll.o] {
|
|
fail "compiling shared lib"
|
|
}
|
|
if ![ld_special_link "$ld -shared --enable-auto-import -e __cygwin_dll_entry@12 --out-implib=$tmpdir/libstandard.dll.a" $tmpdir/dll.dll "$tmpdir/dll.o $MYLIBS"] {
|
|
fail "linking shared lib"
|
|
}
|
|
|
|
# Create symbolic link.
|
|
catch "exec ln -fs dll.dll $tmpdir/libsymlinked_dll.dll.a" ln_catch
|
|
|
|
# Compile and link the client program.
|
|
if ![ld_compile "$CC_FOR_TARGET $SHCFLAG" $srcdir/$subdir/client.c $tmpdir/client.o] {
|
|
fail "compiling client"
|
|
}
|
|
|
|
# Check linking with import library.
|
|
set msg "linking auto-import client using a standard import library"
|
|
if [ld_special_link $ld $tmpdir/client-linklib.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -lstandard $MYLIBS"] {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
|
|
# Check linking directly with dll.
|
|
set msg "linking auto-import client using the dll"
|
|
if [ld_special_link $ld $tmpdir/client-linkdll.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS"] {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
|
|
# Check linking with symlinked dll.
|
|
set msg "linking auto-import client using symbolic linked dll"
|
|
if [ld_special_link $ld $tmpdir/client-symlinkeddll.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -lsymlinked_dll $MYLIBS"] {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
|
|
# Check linking with disabled auto-import, this must produce linking error.
|
|
set msg "linking with disabled auto-import"
|
|
if ![ld_special_link $ld $tmpdir/client-failed.exe "--disable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS"] {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
|
|
# Check that the app works - ie that there is output when the applications runs.
|
|
set msg "application runtime segfault check"
|
|
catch "exec $tmpdir/client-linklib.exe" exec_output
|
|
if ![string match "" $exec_output] then {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
}
|