[binutils-gdb] RISC-V: For PCREL_LO12, fix addend handling in auipc lookup.
Jim Wilson
wilson@sourceware.org
Mon Sep 24 21:37:00 GMT 2018
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a05f27b68934c2ea3efa028a0af2cd968db1bd2d
commit a05f27b68934c2ea3efa028a0af2cd968db1bd2d
Author: Jim Wilson <jimw@sifive.com>
Date: Mon Sep 24 14:36:41 2018 -0700
RISC-V: For PCREL_LO12, fix addend handling in auipc lookup.
bfd/
* elfnn-riscv.c (_bfd_riscv_relax_pc) <R_RISCV_PCREL_LO12_I>: New local
hi_sec_off which is symbol address with addend subtracted. Use in
riscv_find_pcgp_hi_reloc and riscv_record_pcgp_lo_reloc calls.
Diff:
---
bfd/ChangeLog | 4 ++++
bfd/elfnn-riscv.c | 9 +++++++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d14cca0..e8e3195 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,9 @@
2018-09-24 Jim Wilson <jimw@sifive.com>
+ * elfnn-riscv.c (_bfd_riscv_relax_pc) <R_RISCV_PCREL_LO12_I>: New local
+ hi_sec_off which is symbol address with addend subtracted. Use in
+ riscv_find_pcgp_hi_reloc and riscv_record_pcgp_lo_reloc calls.
+
* elfnn-riscv.c (riscv_resolve_pcrel_lo_relocs): Add check for reloc
overflow with addend. Use reloc_dangerous instead of reloc_overflow.
Add strings for the two errors handled here.
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 63ff07e..f3e2cc7 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -3226,11 +3226,16 @@ _bfd_riscv_relax_pc (bfd *abfd,
case R_RISCV_PCREL_LO12_I:
case R_RISCV_PCREL_LO12_S:
{
+ /* If the %lo has an addend, it isn't for the label pointing at the
+ hi part instruction, but rather for the symbol pointed at by the
+ hi part instruction. So we must subtract it here for the lookup.
+ It is still used below in the final symbol address. */
+ bfd_vma hi_sec_off = symval - sec_addr (sym_sec) - rel->r_addend;
riscv_pcgp_hi_reloc *hi = riscv_find_pcgp_hi_reloc (pcgp_relocs,
- symval - sec_addr(sym_sec));
+ hi_sec_off);
if (hi == NULL)
{
- riscv_record_pcgp_lo_reloc (pcgp_relocs, symval - sec_addr(sym_sec));
+ riscv_record_pcgp_lo_reloc (pcgp_relocs, hi_sec_off);
return TRUE;
}
More information about the Binutils-cvs
mailing list