diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aa14169360..cab828b466 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-02-15 Jim Wilson + + * elfnn-riscv.c (riscv_elf_relocate_section): Use bfd_reloc_dangerous + when pcrel_lo reloc has an addend. Use reloc_dangerous callback for + bfd_reloc_dangerous. Use einfo instead of warning callback for errors. + Add %X%P to error messages. + 2018-02-15 Eric Botcazou PR ld/22832 diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index dd9c300b5e..931bd1d89d 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -1993,6 +1993,16 @@ riscv_elf_relocate_section (bfd *output_bfd, case R_RISCV_PCREL_LO12_I: case R_RISCV_PCREL_LO12_S: + /* Addends are not allowed, because then riscv_relax_delete_bytes + would have to search through all relocs to update the addends. + Also, riscv_resolve_pcrel_lo_relocs does not support addends + when searching for a matching hi reloc. */ + if (rel->r_addend) + { + r = bfd_reloc_dangerous; + break; + } + if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info, howto, rel, relocation, name, contents)) @@ -2234,25 +2244,27 @@ riscv_elf_relocate_section (bfd *output_bfd, break; case bfd_reloc_outofrange: - msg = _("internal error: out of range error"); + msg = _("%X%P: internal error: out of range error\n"); break; case bfd_reloc_notsupported: - msg = _("internal error: unsupported relocation error"); + msg = _("%X%P: internal error: unsupported relocation error\n"); break; case bfd_reloc_dangerous: - msg = _("internal error: dangerous relocation"); + info->callbacks->reloc_dangerous + (info, "%pcrel_lo with addend", input_bfd, input_section, + rel->r_offset); break; default: - msg = _("internal error: unknown error"); + msg = _("%X%P: internal error: unknown error\n"); break; } if (msg) - info->callbacks->warning - (info, msg, name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo (msg); + /* We already reported the error via a callback, so don't try to report it again by returning false. That leads to spurious errors. */ ret = TRUE; diff --git a/ld/ChangeLog b/ld/ChangeLog index c8a967ab14..a1d0049414 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2018-02-15 Jim Wilson + + * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run pcrel-lo-addend test. + * testsuite/ld-riscv-elf/pcrel-lo-addend.d: New. + * testsuite/ld-riscv-elf/pcrel-lo-addend.s: New. + 2018-02-14 H.J. Lu PR ld/22842 diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 2b6a1d78fe..cd11680b55 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -22,6 +22,7 @@ if [istarget "riscv*-*-*"] { run_dump_test "c-lui" run_dump_test "disas-jalr" + run_dump_test "pcrel-lo-addend" # The following tests require shared library support. if ![check_shared_lib_support] { diff --git a/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d new file mode 100644 index 0000000000..bd61b4bbff --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d @@ -0,0 +1,5 @@ +#name: %pcrel_lo with an addend +#source: pcrel-lo-addend.s +#as: -march=rv32ic +#ld: -melf32lriscv +#error: .*dangerous relocation: %pcrel_lo with addend diff --git a/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s new file mode 100644 index 0000000000..50cdccceed --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s @@ -0,0 +1,17 @@ + .text + .globl _start +_start: + auipc ra, %pcrel_hi(tdata) + addi ra, ra, %pcrel_lo(.text) + lb t1, 0(ra) +foo: + auipc ra, %pcrel_hi(tdata) + addi ra, ra, %pcrel_lo(.text+12) + lb t2, 1(ra) + + .data +tdata: + .byte 0xff + .byte 0x00 + .byte 0xf0 + .byte 0x0f