RISC-V: Give error for ignored pcrel_lo addend.

bfd/
	* 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.

	ld/
	* 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.
This commit is contained in:
Jim Wilson 2018-02-15 10:53:46 -08:00
parent 49ded53def
commit 2a0d985349
6 changed files with 54 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2018-02-15 Jim Wilson <jimw@sifive.com>
* 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 <ebotcazou@adacore.com>
PR ld/22832

View File

@ -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;

View File

@ -1,3 +1,9 @@
2018-02-15 Jim Wilson <jimw@sifive.com>
* 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 <hongjiu.lu@intel.com>
PR ld/22842

View File

@ -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] {

View File

@ -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

View File

@ -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