diff options
author | Alan Modra <amodra@gmail.com> | 2019-07-18 11:12:40 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-07-18 22:17:30 +0930 |
commit | 71c4e95abe66ec9fc2c064268e3f9640a5b951d8 (patch) | |
tree | 56c3c717039ed81afda0f85e85a77a7e0caf4b8f /bfd | |
parent | 46e9995a207140408309dbea40c64f11843db777 (diff) | |
download | gdb-71c4e95abe66ec9fc2c064268e3f9640a5b951d8.zip gdb-71c4e95abe66ec9fc2c064268e3f9640a5b951d8.tar.gz gdb-71c4e95abe66ec9fc2c064268e3f9640a5b951d8.tar.bz2 |
[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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 39 |
2 files changed, 12 insertions, 33 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index eb64f86..a9dce78 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 0c0d4a4..df4a12c 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); |