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>
* 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
runtime process image. We need to remember the offset into the
.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;
srel = htab->elf.sreldynrelro;
@ -981,9 +986,6 @@ riscv_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
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);
}