RISC-V: Fix weak function call reloc overflow on llvm build.
authorJim Wilson <jimw@sifive.com>
Mon, 6 Jan 2020 23:34:50 +0000 (15:34 -0800)
committerJim Wilson <jimw@sifive.com>
Mon, 6 Jan 2020 23:34:50 +0000 (15:34 -0800)
bfd/
PR 25205
* elfnn-riscv.c (riscv_elf_relocate_section) <R_RISCV_CALL>: Add
check for !bfd_link_pic (info).
<R_RISCV_CALL_PLT>: Move next to R_RISCV_CALL.
<R_RISCV_JAL>: Add comment.
(_bfd_riscv_relax_section): For plt.offset check, add check for
bfd_link_pic (info).  Add comment.

Change-Id: Ie769bc3d5adf096a51df5cc12efe3d50e80acb8f

bfd/ChangeLog
bfd/elfnn-riscv.c

index 97c9309616d50c285710acfdcec13691725182b1..da9260b10539a39c0ce3009270a814bed1cec426 100644 (file)
@@ -1,3 +1,13 @@
+2020-01-06  Jim Wilson  <jimw@sifive.com>
+
+       PR 25205
+       * elfnn-riscv.c (riscv_elf_relocate_section) <R_RISCV_CALL>: Add
+       check for !bfd_link_pic (info).
+       <R_RISCV_CALL_PLT>: Move next to R_RISCV_CALL.
+       <R_RISCV_JAL>: Add comment.
+       (_bfd_riscv_relax_section): For plt.offset check, add check for
+       bfd_link_pic (info).  Add comment.
+
 2020-01-06  Alan Modra  <amodra@gmail.com>
 
        * format.c (bfd_check_format_matches): Ignore bfd_error on target
index d30fc8b66a780b687228b6375dbb057bdde8ffbb..46f0100ace3da966ee94932df17cfc1721266451 100644 (file)
@@ -1987,10 +1987,11 @@ riscv_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_RISCV_CALL:
+       case R_RISCV_CALL_PLT:
          /* Handle a call to an undefined weak function.  This won't be
             relaxed, so we have to handle it here.  */
          if (h != NULL && h->root.type == bfd_link_hash_undefweak
-             && h->plt.offset == MINUS_ONE)
+             && (!bfd_link_pic (info) || h->plt.offset == MINUS_ONE))
            {
              /* We can use x0 as the base register.  */
              bfd_vma insn = bfd_get_32 (input_bfd,
@@ -2003,9 +2004,9 @@ riscv_elf_relocate_section (bfd *output_bfd,
            }
          /* Fall through.  */
 
-       case R_RISCV_CALL_PLT:
        case R_RISCV_JAL:
        case R_RISCV_RVC_JUMP:
+         /* This line has to match the check in _bfd_riscv_relax_section.  */
          if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE)
            {
              /* Refer to the PLT entry.  */
@@ -4128,7 +4129,9 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec,
              undefined_weak = TRUE;
            }
 
-         if (h->plt.offset != MINUS_ONE)
+         /* This line has to match the check in riscv_elf_relocate_section
+            in the R_RISCV_CALL[_PLT] case.  */
+         if (bfd_link_pic (info) && h->plt.offset != MINUS_ONE)
            {
              sym_sec = htab->elf.splt;
              symval = h->plt.offset;