# Expect script for x86-64 TLS tests. # Copyright (C) 2016-2023 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. # # The following tests require running the executable generated by ld, # or enough of a build environment to create a fully linked executable. # This is not commonly available when testing a cross-built linker. if ![isnative] { return } # Only on Linux for now. if ![istarget "x86_64-*-linux*"] { return } # Check to see if the C compiler works if { ![check_compiler_available] } { return } run_cc_link_tests [list \ [list \ "Build tls-def1.o tls-main1.o" \ "" \ "-fPIE -Wa,-mx86-used-note=yes" \ {tls-def1.c tls-main1.c} \ ] \ [list \ "Build tls-gd1.o tls-ld1.o" \ "" \ "-fPIC -Wa,-mrelax-relocations=yes,-mx86-used-note=yes" \ {tls-gd1.S tls-ld1.S} \ ] \ [list \ "Build libtls-1a.so" \ "-shared tmpdir/tls-def1.o" \ "-Wa,-mx86-used-note=yes" \ {dummy.s} \ {} \ "libtls-1a.so" \ ] \ [list \ "Build libtls-1b.so" \ "-shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ {dummy.s} \ {} \ "libtls-1b.so" \ ] \ [list \ "Build libtls-1bn.so" \ "-Wl,-z,now -shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ {dummy.s} \ {} \ "libtls-1bn.so" \ ] \ ] run_ld_link_exec_tests [list \ [list \ "TLS GD/LD -> LE transition without PLT (dynamic)" \ "tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \ tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1a" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> LE transition without PLT (dynamic, -z now)" \ "-Wl,-z,now tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \ tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1an" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> LE transition without PLT (PIE)" \ "-pie tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \ tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1b" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> LE transition without PLT (PIE, -z now)" \ "-pie -Wl,-z,now tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \ tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1bn" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> LE transition without PLT (static)" \ "-static tmpdir/tls-def1.o tmpdir/tls-main1.o tmpdir/tls-gd1.o \ tmpdir/tls-ld1.o" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1c" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> IE transition without PLT" \ "-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \ tmpdir/tls-gd1.o tmpdir/tls-ld1.o tmpdir/libtls-1a.so" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1d" \ "pass.out" \ ] \ [list \ "TLS GD/LD -> IE transition without PLT (-z now)" \ "-Wl,-z,now tmpdir/tls-main1.o tmpdir/tls-gd1.o tmpdir/tls-ld1.o \ tmpdir/libtls-1a.so -Wl,-R,tmpdir" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1dn" \ "pass.out" \ ] \ [list \ "TLS without PLT (1)" \ "-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \ tmpdir/libtls-1a.so tmpdir/libtls-1b.so" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1e" \ "pass.out" \ ] \ [list \ "TLS without PLT (2)" \ "-Wl,--no-as-needed,-R,tmpdir tmpdir/tls-main1.o \ tmpdir/tls-def1.o tmpdir/libtls-1b.so" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1f" \ "pass.out" \ ] \ [list \ "TLS without PLT (3)" \ "-Wl,--no-as-needed -Wl,-z,now tmpdir/tls-main1.o \ tmpdir/libtls-1a.so tmpdir/libtls-1bn.so -Wl,-R,tmpdir" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1en" \ "pass.out" \ ] \ [list \ "TLS without PLT (4)" \ "-Wl,-z,now tmpdir/tls-main1.o tmpdir/tls-def1.o \ tmpdir/libtls-1bn.so -Wl,-R,tmpdir" \ "-Wa,-mx86-used-note=yes" \ { dummy.s } \ "tls-1fn" \ "pass.out" \ ] \ ] # Skip if -mtls-dialect=gnu2 doesn't work. if { ![run_host_cmd_yesno $CC_FOR_TARGET "-c -O2 -fPIC $GNU2_CFLAGS $srcdir/$subdir/tlsdesc1b.c -o tmpdir/tlsdesc1b.o"] } { return } run_cc_link_tests [list \ [list \ "Build libtlsdesc1.so" \ "-shared" \ "-fPIC $GNU2_CFLAGS -Wa,-mx86-used-note=yes" \ { tlsdesc1b.c } \ {} \ "libtlsdesc1.so" \ ] \ [list \ "Build libtlsdesc1n.so" \ "-Wl,-z,now -shared" \ "-fPIC $GNU2_CFLAGS -Wa,-mx86-used-note=yes" \ { tlsdesc1b.c } \ {} \ "libtlsdesc1n.so" \ ] \ ] # Run-time tests which require working GNU2 TLS support. if { ![check_gnu2_tls_available] } { return } if { [at_least_gcc_version 5 0] } { run_ld_link_exec_tests [list \ [list \ "Run tlsdesc1" \ "-Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ "-Wa,-mx86-used-note=yes" \ { tlsdesc1a.c } \ "tlsdesc1a" \ "pass.out" \ "$GNU2_CFLAGS" \ ] \ [list \ "Run tlsdesc1 with PIE" \ "-pie -Wl,--no-as-needed tmpdir/libtlsdesc1.so" \ "-Wa,-mx86-used-note=yes" \ { tlsdesc1a.c } \ "tlsdesc1c" \ "pass.out" \ "-fPIE $GNU2_CFLAGS" \ ] \ ] } run_ld_link_exec_tests [list \ [list \ "Run tlsdesc1 (-z now)" \ "-Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ "-Wa,-mx86-used-note=yes" \ { tlsdesc1a.c } \ "tlsdesc1b" \ "pass.out" \ "$GNU2_CFLAGS" \ ] \ [list \ "Run tlsdesc1 with PIE (-z now)" \ "-pie -Wl,-z,now -Wl,--no-as-needed tmpdir/libtlsdesc1n.so" \ "-Wa,-mx86-used-note=yes" \ { tlsdesc1a.c } \ "tlsdesc1d" \ "pass.out" \ "-fPIE $GNU2_CFLAGS" \ ] \ ]