RISC-V: Check the overflow for %pcrel_lo addend more strictly.
authorNelson Chu <nelson.chu@sifive.com>
Fri, 14 May 2021 05:30:02 +0000 (13:30 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Fri, 14 May 2021 08:14:00 +0000 (16:14 +0800)
commit75f03fa77434ad49f1e7d333e0c93048639806e3
tree255bbdb4f7134576323f89dd232753eb22fb6048
parentecf25064e87a3d2d59871b3ea7126fa0dee0001d
RISC-V: Check the overflow for %pcrel_lo addend more strictly.

The %pcrel_lo addend may causes the overflow, and need more than one
%pcrel_hi values.  But there may be only one auipc, shared by those
%pcrel_lo with addends.  However, the existing check method in the
riscv_resolve_pcrel_lo_relocs, may not be able to work for some
special/corner cases.

Consider the testcases pcrel-lo-addend-2b.  Before applying this patch,
I can compile it successfully.  But in fact the addend cause the value
of %pcrel_hi to be different.  This patch try to check the value of
%pcrel_hi directly, to make sure it won't be changed.  Otherwise, linker
will report the following errors,

(.text+0xa): dangerous relocation: %pcrel_lo overflow with an addend,
the value of %pcrel_hi is 0x1000 without any addend, but may be 0x2000
after adding the %pcrel_lo addend

The toolchain regressions, rv64gc-linux/rv64gc-elf/rv32gc-linux/rv32i-elf,
pass expectedly and looks fine.

bfd/
    * elfnn-riscv.c (riscv_resolve_pcrel_lo_relocs): Check the values
    of %pcrel_hi, before and after adding the addend.  Make sure the
    value won't be changed, otherwise, report dangerous error.
ld/
    * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated.
    * testsuite/ld-riscv-elf/pcrel-lo-addend-2a.d: Renamed from
    pcrel-lo-addend-2.
    * testsuite/ld-riscv-elf/pcrel-lo-addend-2a.s: Likewise.
    * testsuite/ld-riscv-elf/pcrel-lo-addend-2b.d: New testcase.
    * testsuite/ld-riscv-elf/pcrel-lo-addend-2b.s: Likewise.
bfd/ChangeLog
bfd/elfnn-riscv.c
ld/ChangeLog
ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2.d [deleted file]
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2.s [deleted file]
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2a.d [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2a.s [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2b.d [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2b.s [new file with mode: 0644]