mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 06:17:47 +08:00
[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.
This commit is contained in:
@ -1,3 +1,9 @@
|
||||
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.
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user