From 3df5cd139455a1448de00e1e173f3ce566a25a48 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 27 Jun 2017 22:44:24 -0700 Subject: [PATCH] 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 * elfnn-riscv.c (riscv_elf_adjust_dynamic_symbol): Fix TLS copy relocs. --- bfd/ChangeLog | 5 +++++ bfd/elfnn-riscv.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7195221c0c..c384a0f028 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-06-29 Andrew Waterman + + * elfnn-riscv.c (riscv_elf_adjust_dynamic_symbol): Fix TLS copy + relocs. + 2017-06-29 Egeyar Bagcioglu * elfxx-sparc.c (allocate_dynrelocs): Don't make a symbol dynamic diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 455f2ff292..6d297cea7d 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -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); }