old-cross-binutils/ld/testsuite/ld-i386/tls.exp
H.J. Lu 6eaa7fb59b Support i386 TLS code sequences without PLT
We can generate i386 TLS code sequences for general and local dynamic
models without PLT, which uses indirect call via GOT:

call *___tls_get_addr@GOT(%reg)

where EBX register isn't required as GOT base, instead of direct call:

call ___tls_get_addr[@PLT]

which requires EBX register as GOT base.

Since direct call is 4-byte long and indirect call, is 5-byte long, the
extra one byte must be handled properly.

For general dynamic model, 7-byte lea instruction before call instruction
is replaced by 6-byte one to make room for indirect call.  For local
dynamic model, we simply use 5-byte indirect call.

TLS linker optimization is updated to recognize new instruction patterns.
For local dynamic model to local exec model transition, we generate
a 6-byte lea instruction as nop, instead of a 1-byte nop plus a 4-byte
lea instruction.  Since linker may convert

call ___tls_get_addr[@PLT]

to

addr32 call ____tls_get_addr

when producing static executable, both patterns are recognized.

bfd/

	* elf64-i386.c (elf_i386_link_hash_entry): Add tls_get_addr.
	(elf_i386_link_hash_newfunc): Initialize tls_get_addr to 2.
	(elf_i386_check_tls_transition): Check indirect call and direct
	call with the addr32 prefix for general and local dynamic models.
	Set the tls_get_addr feild.
	(elf_i386_convert_load_reloc): Always use addr32 prefix for
	indirect ___tls_get_addr call via GOT.
	(elf_i386_relocate_section): Handle GD->LE, GD->IE and LD->LE
	transitions with indirect call and direct call with the addr32
	prefix.

ld/

	* testsuite/ld-i386/i386.exp: Run libtlspic2.so, tlsbin2,
	tlsgd3, tlsld2, tlsgd4, tlspie3a, tlspie3b and tlspie3c.
	* testsuite/ld-i386/pass.out: New file.
	* testsuite/ld-i386/tls-def1.c: Likewise.
	* testsuite/ld-i386/tls-gd1.S: Likewise.
	* testsuite/ld-i386/tls-ld1.S: Likewise.
	* testsuite/ld-i386/tls-main1.c: Likewise.
	* testsuite/ld-i386/tls.exp: Likewise.
	* testsuite/ld-i386/tlsbin2-nacl.rd: Likewise.
	* testsuite/ld-i386/tlsbin2.dd: Likewise.
	* testsuite/ld-i386/tlsbin2.rd: Likewise.
	* testsuite/ld-i386/tlsbin2.sd: Likewise.
	* testsuite/ld-i386/tlsbin2.td: Likewise.
	* testsuite/ld-i386/tlsbinpic2.s: Likewise.
	* testsuite/ld-i386/tlsgd3.dd: Likewise.
	* testsuite/ld-i386/tlsgd3.s: Likewise.
	* testsuite/ld-i386/tlsgd4.d: Likewise.
	* testsuite/ld-i386/tlsgd4.s: Likewise.
	* testsuite/ld-i386/tlsld2.s: Likewise.
	* testsuite/ld-i386/tlspic2-nacl.rd: Likewise.
	* testsuite/ld-i386/tlspic2.dd: Likewise.
	* testsuite/ld-i386/tlspic2.rd: Likewise.
	* testsuite/ld-i386/tlspic2.sd: Likewise.
	* testsuite/ld-i386/tlspic2.td: Likewise.
	* testsuite/ld-i386/tlspic3.s: Likewise.
	* testsuite/ld-i386/tlspie3.s: Likewise.
	* testsuite/ld-i386/tlspie3a.d: Likewise.
	* testsuite/ld-i386/tlspie3b.d: Likewise.
	* testsuite/ld-i386/tlspie3c.d: Likewise.
2016-06-08 12:01:50 -07:00

125 lines
2.9 KiB
Text

# Expect script for i386 TLS tests.
# Copyright (C) 2016 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 "i?86-*-linux*"] {
return
}
# Check to see if the C compiler works
if { [which $CC] == 0 } {
return
}
run_cc_link_tests [list \
[list \
"Build tls-def1.o tls-main1.o" \
"" \
"-fPIE" \
{tls-def1.c tls-main1.c} \
] \
[list \
"Build tls-gd1.o tls-ld1.o" \
"" \
"-fPIC -Wa,-mrelax-relocations=yes" \
{tls-gd1.S tls-ld1.S} \
] \
[list \
"Build libtls-1a.so" \
"-shared tmpdir/tls-def1.o" \
"" \
{dummy.s} \
{} \
"libtls-1a.so" \
] \
[list \
"Build libtls-1b.so" \
"-shared tmpdir/tls-gd1.o tmpdir/tls-ld1.o" \
"" \
{dummy.s} \
{} \
"libtls-1b.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" \
"" \
{ dummy.s } \
"tls-1a" \
"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" \
"" \
{ dummy.s } \
"tls-1b" \
"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" \
"" \
{ dummy.s } \
"tls-1c" \
"pass.out" \
] \
[list \
"TLS GD/LD -> IE transition without PLT" \
"tmpdir/tls-main1.o tmpdir/tls-gd1.o tmpdir/tls-ld1.o \
tmpdir/libtls-1a.so -R tmpdir" \
"" \
{ dummy.s } \
"tls-1d" \
"pass.out" \
] \
[list \
"TLS without PLT (1)" \
"tmpdir/tls-main1.o \
tmpdir/libtls-1a.so tmpdir/libtls-1b.so -R tmpdir" \
"" \
{ dummy.s } \
"tls-1e" \
"pass.out" \
] \
[list \
"TLS without PLT (2)" \
"tmpdir/tls-main1.o tmpdir/tls-def1.o \
tmpdir/libtls-1b.so -R tmpdir" \
"" \
{ dummy.s } \
"tls-1f" \
"pass.out" \
] \
]