aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-07-18 11:12:40 +0930
committerAlan Modra <amodra@gmail.com>2019-07-18 22:17:30 +0930
commit71c4e95abe66ec9fc2c064268e3f9640a5b951d8 (patch)
tree56c3c717039ed81afda0f85e85a77a7e0caf4b8f
parent46e9995a207140408309dbea40c64f11843db777 (diff)
[PowerPC64] Use STN_UNDEF internally for edited relocs
It's not correct to use non-STT_TLS symbols with TLS relocation, not that it matters much when editing relocs, but this edited reloc can be output by --emit-relocs. So don't use a symbol on the reloc. * elf64-ppc.c (ppc64_elf_relocate_section): Don't bother selecting a TLS section symbol for edited relocs. Tighten TLS symbol/reloc match test.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf64-ppc.c39
2 files changed, 12 insertions, 33 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index eb64f86389f..a9dce78afca 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2019-07-18 Alan Modra <amodra@gmail.com>
+ * elf64-ppc.c (ppc64_elf_relocate_section): Don't bother selecting
+ a TLS section symbol for edited relocs. Tighten TLS symbol/reloc
+ match test.
+
+2019-07-18 Alan Modra <amodra@gmail.com>
+
* elf64-ppc.c (TLS_EXPLICIT): Define as 256.
(ppc64_elf_check_relocs): Don't store TLS_EXPLICIT even if char
is more than 8 bits.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 0c0d4a4c13e..df4a12c58d7 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -14304,10 +14304,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
&& (h == NULL
|| h->elf.root.type == bfd_link_hash_defined
|| h->elf.root.type == bfd_link_hash_defweak)
- && (IS_PPC64_TLS_RELOC (r_type)
- != (sym_type == STT_TLS
- || (sym_type == STT_SECTION
- && (sec->flags & SEC_THREAD_LOCAL) != 0))))
+ && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
{
if ((tls_mask & TLS_TLS) != 0
&& (r_type == R_PPC64_TLS
@@ -14547,20 +14544,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (tls_gd == 0)
{
/* Was an LD reloc. */
- if (toc_symndx)
- sec = local_sections[toc_symndx];
- for (r_symndx = 0;
- r_symndx < symtab_hdr->sh_info;
- r_symndx++)
- if (local_sections[r_symndx] == sec)
- break;
- if (r_symndx >= symtab_hdr->sh_info)
- r_symndx = STN_UNDEF;
+ r_symndx = STN_UNDEF;
rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
- if (r_symndx != STN_UNDEF)
- rel->r_addend -= (local_syms[r_symndx].st_value
- + sec->output_offset
- + sec->output_section->vma);
}
else if (toc_symndx != 0)
{
@@ -14669,24 +14654,12 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
bfd_put_32 (output_bfd, NOP, contents + offset + 4);
- if (toc_symndx)
- sec = local_sections[toc_symndx];
- for (r_symndx = 0;
- r_symndx < symtab_hdr->sh_info;
- r_symndx++)
- if (local_sections[r_symndx] == sec)
- break;
- if (r_symndx >= symtab_hdr->sh_info)
- r_symndx = STN_UNDEF;
- rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
- if (r_symndx != STN_UNDEF)
- rel->r_addend -= (local_syms[r_symndx].st_value
- + sec->output_offset
- + sec->output_section->vma);
-
+ rel->r_offset = offset + d_offset;
+ r_symndx = STN_UNDEF;
r_type = R_PPC64_TPREL16_LO;
rel->r_info = ELF64_R_INFO (r_symndx, r_type);
- rel->r_offset = offset + d_offset;
+ rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
+
/* Zap the reloc on the _tls_get_addr call too. */
BFD_ASSERT (offset == rel[1].r_offset);
rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);