RISC-V: Fix 3 PIE related ld testsuite failures.
authorJim Wilson <jimw@sifive.com>
Thu, 21 Jun 2018 18:45:43 +0000 (11:45 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 21 Jun 2018 18:45:43 +0000 (11:45 -0700)
bfd/
* elfnn-riscv.c (riscv_elf_finish_dynamic_symbol): Update comment.
Use SYMBOL_REFERENCES_LOCAL.  Add asserts for h->got.offset.

bfd/ChangeLog
bfd/elfnn-riscv.c

index 46e314d970729266bca15ab278160bf943e5e4c3..e9628226b88895444844756c85b8e26dcf7a0672 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-21  Jim Wilson  <jimw@sifive.com>
+
+       * 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  <amodra@gmail.com>
 
        * doc/Makefile.am (AUTOMAKE_OPTIONS): Add "foreign".
index 7b1ca47083c69d88c4ec04f28c893cb9da7d0021..934704a87e78604b526f1a7c8f138a471bb46c5b 100644 (file)
@@ -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;