From 25eb8346acc04b10d62295eb4c67c928b01a8aaf Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Thu, 21 Jun 2018 11:45:43 -0700 Subject: [PATCH] RISC-V: Fix 3 PIE related ld testsuite failures. bfd/ * elfnn-riscv.c (riscv_elf_finish_dynamic_symbol): Update comment. Use SYMBOL_REFERENCES_LOCAL. Add asserts for h->got.offset. --- bfd/ChangeLog | 5 +++++ bfd/elfnn-riscv.c | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 46e314d9707..e9628226b88 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2018-06-21 Jim Wilson + + * elfnn-riscv.c (riscv_elf_finish_dynamic_symbol): Update comment. + Use SYMBOL_REFERENCES_LOCAL. Add asserts for h->got.offset. + 2018-06-21 Alan Modra * doc/Makefile.am (AUTOMAKE_OPTIONS): Add "foreign". diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 7b1ca47083c..934704a87e7 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -2394,15 +2394,15 @@ riscv_elf_finish_dynamic_symbol (bfd *output_bfd, rela.r_offset = sec_addr (sgot) + (h->got.offset &~ (bfd_vma) 1); - /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. Likewise if + /* If this is a local symbol reference, we just want to emit a RELATIVE + reloc. This can happen if it is a -Bsymbolic link, or a pie link, or the symbol was forced to be local because of a version file. The entry in the global offset table will already have been initialized in the relocate_section function. */ if (bfd_link_pic (info) - && (info->symbolic || h->dynindx == -1) - && h->def_regular) + && SYMBOL_REFERENCES_LOCAL (info, h)) { + BFD_ASSERT((h->got.offset & 1) != 0); asection *sec = h->root.u.def.section; rela.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE); rela.r_addend = (h->root.u.def.value @@ -2411,6 +2411,7 @@ riscv_elf_finish_dynamic_symbol (bfd *output_bfd, } else { + BFD_ASSERT((h->got.offset & 1) == 0); BFD_ASSERT (h->dynindx != -1); rela.r_info = ELFNN_R_INFO (h->dynindx, R_RISCV_NN); rela.r_addend = 0; -- 2.30.2