mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
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.
This commit is contained in:
parent
551703cfd4
commit
a05f27b689
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user