+2021-05-14 Nelson Chu <nelson.chu@sifive.com>
+
+ * 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.
+
2021-05-13 Nelson Chu <nelson.chu@sifive.com>
* elfxx-riscv.c (check_implicit_always): The check_func, always add
riscv_pcrel_hi_reloc search = {r->addr, 0};
riscv_pcrel_hi_reloc *entry = htab_find (p->hi_relocs, &search);
if (entry == NULL
- /* Check for overflow into bit 11 when adding reloc addend. */
- || (!(entry->value & 0x800)
- && ((entry->value + r->reloc->r_addend) & 0x800)))
+ /* Check the overflow when adding reloc addend. */
+ || (RISCV_CONST_HIGH_PART (entry->value)
+ != RISCV_CONST_HIGH_PART (entry->value + r->reloc->r_addend)))
{
- char *string = (entry == NULL
- ? "%pcrel_lo missing matching %pcrel_hi"
- : "%pcrel_lo overflow with an addend");
+ char *string;
+ if (entry == NULL)
+ string = _("%pcrel_lo missing matching %pcrel_hi");
+ else if (asprintf (&string,
+ _("%%pcrel_lo overflow with an addend, the "
+ "value of %%pcrel_hi is 0x%" PRIx64 " without "
+ "any addend, but may be 0x%" PRIx64 " after "
+ "adding the %%pcrel_lo addend"),
+ (int64_t) RISCV_CONST_HIGH_PART (entry->value),
+ (int64_t) RISCV_CONST_HIGH_PART
+ (entry->value + r->reloc->r_addend)) == -1)
+ string = _("%pcrel_lo overflow with an addend");
+
(*r->info->callbacks->reloc_dangerous)
(r->info, string, input_bfd, r->input_section, r->reloc->r_offset);
return true;
+2021-05-14 Nelson Chu <nelson.chu@sifive.com>
+
+ * 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.
+
2021-05-13 Fangrui Song <maskray@google.com>
PR 27834
run_dump_test "c-lui-2"
run_dump_test "disas-jalr"
run_dump_test "pcrel-lo-addend"
- run_dump_test "pcrel-lo-addend-2"
+ run_dump_test "pcrel-lo-addend-2a"
+ run_dump_test "pcrel-lo-addend-2b"
run_dump_test "restart-relax"
run_dump_test "attr-merge-arch-01"
run_dump_test "attr-merge-arch-02"
+++ /dev/null
-#name: %pcrel_lo overflow with an addend
-#source: pcrel-lo-addend-2.s
-#as: -march=rv32ic
-#ld: -m[riscv_choose_ilp32_emul] --no-relax
-#error: .*dangerous relocation: %pcrel_lo overflow with an addend
+++ /dev/null
- .text
- .globl _start
- .align 3
-_start:
- nop
- .LA0: auipc a5,%pcrel_hi(ll)
- lw a0,%pcrel_lo(.LA0)(a5)
- lw a0,%pcrel_lo(.LA0+4)(a5)
- ret
- .globl ll
- .data
- .align 3
- .zero 2024
-ll:
- .word 0
- .word 0
--- /dev/null
+#name: %pcrel_lo overflow with an addend (2a)
+#source: pcrel-lo-addend-2a.s
+#as: -march=rv32ic
+#ld: -m[riscv_choose_ilp32_emul] --no-relax
+#error: .*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
--- /dev/null
+ .text
+ .globl _start
+ .align 3
+_start:
+ nop
+ .LA0: auipc a5,%pcrel_hi(ll)
+ lw a0,%pcrel_lo(.LA0)(a5)
+ lw a0,%pcrel_lo(.LA0+0x4)(a5)
+ ret
+ .globl ll
+ .data
+ .align 3
+ .zero 2024
+ll:
+ .word 0
+ .word 0
--- /dev/null
+#name: %pcrel_lo overflow with an addend (2b)
+#source: pcrel-lo-addend-2b.s
+#as: -march=rv32ic
+#ld: -m[riscv_choose_ilp32_emul] --no-relax
+#error: .*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
--- /dev/null
+ .text
+ .globl _start
+ .align 3
+_start:
+ nop
+ .LA0: auipc a5,%pcrel_hi(ll)
+ lw a0,%pcrel_lo(.LA0)(a5)
+ lw a0,%pcrel_lo(.LA0+0x1000)(a5)
+ ret
+ .globl ll
+ .data
+ .align 3
+ .zero 2024
+ll:
+ .word 0
+ .word 0