RISC-V: Fix TLS copy relocs

The dynrelro introduction wasn't implemented quite right for RISC-V,
as it didn't consider TLS copy relocs.

bfd/ChangeLog

2017-06-29  Andrew Waterman  <andrew@sifive.com>

        * elfnn-riscv.c (riscv_elf_adjust_dynamic_symbol): Fix TLS copy
        relocs.
This commit is contained in:
Andrew Waterman 2017-06-27 22:44:24 -07:00 committed by Palmer Dabbelt
parent eb17d4137d
commit 3df5cd1394
2 changed files with 11 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2017-06-29 Andrew Waterman <andrew@sifive.com>
* elfnn-riscv.c (riscv_elf_adjust_dynamic_symbol): Fix TLS copy
relocs.
2017-06-29 Egeyar Bagcioglu <egeyar.bagcioglu@oracle.com> 2017-06-29 Egeyar Bagcioglu <egeyar.bagcioglu@oracle.com>
* elfxx-sparc.c (allocate_dynrelocs): Don't make a symbol dynamic * elfxx-sparc.c (allocate_dynrelocs): Don't make a symbol dynamic

View File

@ -965,7 +965,12 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
to copy the initial value out of the dynamic object and into the to copy the initial value out of the dynamic object and into the
runtime process image. We need to remember the offset into the runtime process image. We need to remember the offset into the
.rel.bss section we are going to use. */ .rel.bss section we are going to use. */
if ((h->root.u.def.section->flags & SEC_READONLY) != 0) if (eh->tls_type & ~GOT_NORMAL)
{
s = htab->sdyntdata;
srel = htab->elf.srelbss;
}
else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
{ {
s = htab->elf.sdynrelro; s = htab->elf.sdynrelro;
srel = htab->elf.sreldynrelro; srel = htab->elf.sreldynrelro;
@ -981,9 +986,6 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
h->needs_copy = 1; h->needs_copy = 1;
} }
if (eh->tls_type & ~GOT_NORMAL)
return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdyntdata);
return _bfd_elf_adjust_dynamic_copy (info, h, s); return _bfd_elf_adjust_dynamic_copy (info, h, s);
} }