diff options
author | Andrew Waterman <andrew@sifive.com> | 2017-06-27 22:44:24 -0700 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-06-29 09:38:50 -0700 |
commit | 3df5cd139455a1448de00e1e173f3ce566a25a48 (patch) | |
tree | e17f48a42944ff0a0c8fc6edb7d4df36b83de716 /bfd | |
parent | eb17d4137dc83a373b8968cd20b256fa8073a4ca (diff) | |
download | gdb-3df5cd139455a1448de00e1e173f3ce566a25a48.zip gdb-3df5cd139455a1448de00e1e173f3ce566a25a48.tar.gz gdb-3df5cd139455a1448de00e1e173f3ce566a25a48.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elfnn-riscv.c | 10 |
2 files changed, 11 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7195221..c384a0f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 455f2ff..6d297ce 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); } |