x86: Add TLS_TRANSITION_IE_TO_LE_P

Add TLS_TRANSITION_IE_TO_LE_P which returns TRUE if TLS IE->LE transition
is OK.

	* elfxx-x86.h (TLS_TRANSITION_IE_TO_LE_P): New.
	* elf32-i386.c (elf_i386_tls_transition): Use it.
	* elf64-x86-64.c (elf_x86_64_tls_transition): Likewise.
This commit is contained in:
H.J. Lu 2017-10-06 00:11:41 -07:00
parent e98fdf1ab0
commit 51537393bd
4 changed files with 15 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2017-10-06 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-x86.h (TLS_TRANSITION_IE_TO_LE_P): New.
* elf32-i386.c (elf_i386_tls_transition): Use it.
* elf64-x86-64.c (elf_x86_64_tls_transition): Likewise.
2017-10-05 H.J. Lu <hongjiu.lu@intel.com> 2017-10-05 H.J. Lu <hongjiu.lu@intel.com>
* elf32-ppc.c (readonly_dynrelocs): Add a link_info argument. * elf32-ppc.c (readonly_dynrelocs): Add a link_info argument.

View File

@ -1105,10 +1105,7 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
{ {
unsigned int new_to_type = to_type; unsigned int new_to_type = to_type;
if (bfd_link_executable (info) if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
&& h != NULL
&& h->dynindx == -1
&& (tls_type & GOT_TLS_IE))
new_to_type = R_386_TLS_LE_32; new_to_type = R_386_TLS_LE_32;
if (to_type == R_386_TLS_GD if (to_type == R_386_TLS_GD

View File

@ -1281,10 +1281,7 @@ elf_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
{ {
unsigned int new_to_type = to_type; unsigned int new_to_type = to_type;
if (bfd_link_executable (info) if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
&& h != NULL
&& h->dynindx == -1
&& tls_type == GOT_TLS_IE)
new_to_type = R_X86_64_TPOFF32; new_to_type = R_X86_64_TPOFF32;
if (to_type == R_X86_64_TLSGD if (to_type == R_X86_64_TLSGD

View File

@ -74,6 +74,13 @@
&& ((EH)->elf.root.u.def.section->owner->flags & DYNAMIC) != 0 \ && ((EH)->elf.root.u.def.section->owner->flags & DYNAMIC) != 0 \
&& ((EH)->elf.root.u.def.section->flags & SEC_CODE) == 0) && ((EH)->elf.root.u.def.section->flags & SEC_CODE) == 0)
/* TRUE if TLS IE->LE transition is OK. */
#define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \
(bfd_link_executable (INFO) \
&& (H) != NULL \
&& (H)->dynindx == -1 \
&& (TLS_TYPE & GOT_TLS_IE))
/* x86 ELF linker hash entry. */ /* x86 ELF linker hash entry. */
struct elf_x86_link_hash_entry struct elf_x86_link_hash_entry