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
This commit is contained in:
parent
85e290dc12
commit
85f7836470
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user