This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] tilepro: Check bfd_link_executable for TLS check
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: binutils at sourceware dot org
- Cc: Walter Lee <walt at tilera dot com>
- Date: Sun, 8 Oct 2017 14:58:09 -0700
- Subject: [PATCH] tilepro: Check bfd_link_executable for TLS check
- Authentication-results: sourceware.org; auth=none
Copied from x86, check bfd_link_executable, instead of bfd_link_pic,
for TLS transition check. Not sure if it works correctly. All usages
of bfd_link_pic should be audited.
PR ld/22263
* elf32-tilepro.c (tilepro_elf_tls_transition): Replace
bfd_link_pic with !bfd_link_executable, !bfd_link_pic with
bfd_link_executable for TLS check.
(tilepro_elf_check_relocs): Likewise.
(allocate_dynrelocs): Likewise.
(tilepro_elf_relocate_section): Likewise.
---
bfd/elf32-tilepro.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
index 75a7de5f6e..138c9a8a01 100644
--- a/bfd/elf32-tilepro.c
+++ b/bfd/elf32-tilepro.c
@@ -1433,7 +1433,7 @@ static int
tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type,
int is_local)
{
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
return r_type;
if (is_local)
@@ -1518,7 +1518,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
goto r_tilepro_plt32;
break;
@@ -1543,7 +1543,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
tls_type = GOT_TLS_IE;
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
info->flags |= DF_STATIC_TLS;
goto have_got_reference;
@@ -1629,7 +1629,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
break;
case R_TILEPRO_TLS_GD_CALL:
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
{
/* These are basically R_TILEPRO_JOFFLONG_X1_PLT relocs
against __tls_get_addr. */
@@ -2261,7 +2261,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
requiring no TLS entry. */
if (h->got.refcount > 0
- && !bfd_link_pic (info)
+ && bfd_link_executable (info)
&& h->dynindx == -1
&& tilepro_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
h->got.offset = (bfd_vma) -1;
@@ -2941,8 +2941,8 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
else if (h != NULL)
tls_type = tilepro_elf_hash_entry(h)->tls_type;
- is_tls_iele = (! bfd_link_pic (info) || tls_type == GOT_TLS_IE);
- is_tls_le = is_tls_iele && (!bfd_link_pic (info)
+ is_tls_iele = (bfd_link_executable (info) || tls_type == GOT_TLS_IE);
+ is_tls_le = is_tls_iele && (bfd_link_executable (info)
&& (h == NULL || h->dynindx == -1));
if (r_type == R_TILEPRO_TLS_GD_CALL)
@@ -3019,7 +3019,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
}
break;
case R_TILEPRO_TLS_IE_LOAD:
- if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
+ if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
/* IE -> LE */
tilepro_replace_insn (contents + rel->r_offset,
insn_mask_X1_no_dest_no_srca,
@@ -3342,7 +3342,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
{
Elf_Internal_Rela outrel;
bfd_boolean skip;
@@ -3397,7 +3397,9 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
else if (h != NULL)
{
tls_type = tilepro_elf_hash_entry(h)->tls_type;
- if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type == GOT_TLS_IE)
+ if (bfd_link_executable (info)
+ && h->dynindx == -1
+ && tls_type == GOT_TLS_IE)
r_type = tilepro_tls_translate_to_le (r_type);
}
if (tls_type == GOT_TLS_IE)
--
2.13.6