Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

# Expect script for x86-64 TLS tests.
#   Copyright (C) 2016-2020 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 "-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" \
    ] \
]