diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-10-19 05:20:44 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-10-19 05:21:01 -0700 |
commit | 1ba1f393faac96f6ad80499d7133df23d6187b8c (patch) | |
tree | b028ce5446d3a99809f51020c4a7b2cc66882ac0 /bfd/elf32-tilepro.c | |
parent | 0fb7012e88683b8bd67a4fb8f782359fa0e11724 (diff) | |
download | gdb-1ba1f393faac96f6ad80499d7133df23d6187b8c.zip gdb-1ba1f393faac96f6ad80499d7133df23d6187b8c.tar.gz gdb-1ba1f393faac96f6ad80499d7133df23d6187b8c.tar.bz2 |
tilepro: Check bfd_link_executable for TLS check
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.
Diffstat (limited to 'bfd/elf32-tilepro.c')
-rw-r--r-- | bfd/elf32-tilepro.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index 0bdb6c4..7731318 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. */ @@ -2105,7 +2105,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; @@ -2786,8 +2786,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) @@ -2864,7 +2864,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, @@ -3191,7 +3191,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; @@ -3246,7 +3246,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) |