diff options
author | Jim Wilson <jimw@sifive.com> | 2020-01-06 15:34:50 -0800 |
---|---|---|
committer | Jim Wilson <jimw@sifive.com> | 2020-01-06 15:34:50 -0800 |
commit | 85f783647061e58968ecdc516137d8df9f2d5e16 (patch) | |
tree | f746bf0ec31629fbd171c10bc960c27d0571f530 /bfd/elfnn-riscv.c | |
parent | 85e290dc1252d77e726c0892b197be449b34bd16 (diff) | |
download | gdb-85f783647061e58968ecdc516137d8df9f2d5e16.zip gdb-85f783647061e58968ecdc516137d8df9f2d5e16.tar.gz gdb-85f783647061e58968ecdc516137d8df9f2d5e16.tar.bz2 |
RISC-V: Fix weak function call reloc overflow on llvm build.
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
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r-- | bfd/elfnn-riscv.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index d30fc8b..46f0100 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -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; |