MIPS/BFD: Correctly handle `bfd_reloc_outofrange' with branches

Fix internal errors like:

ld: BFD (GNU Binutils) 2.26.51.20160526 internal error, aborting at .../bfd/elfxx-mips.c:10278 in _bfd_mips_elf_relocate_section

ld: Please report this bug.

triggered by the `bfd_reloc_outofrange' condition on branch relocations.

	bfd/
	* elfxx-mips.c (b_reloc_p): New function.
	(_bfd_mips_elf_relocate_section) <bfd_reloc_outofrange>: Handle
	branch relocations.

	ld/
	* testsuite/ld-mips-elf/unaligned-branch.d: New test.
	* testsuite/ld-mips-elf/unaligned-branch.s: New test source.
	* testsuite/ld-mips-elf/unaligned-text.s: New test source.
	* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
This commit is contained in:
Maciej W. Rozycki 2016-05-28 10:57:58 +01:00
parent 3b4412a041
commit 99aefae681
7 changed files with 85 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
* elfxx-mips.c (b_reloc_p): New function.
(_bfd_mips_elf_relocate_section) <bfd_reloc_outofrange>: Handle
branch relocations.
2016-05-28 Maciej W. Rozycki <macro@imgtec.com> 2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
* elfxx-mips.c (mips_elf_calculate_relocation): <R_MIPS16_26> * elfxx-mips.c (mips_elf_calculate_relocation): <R_MIPS16_26>

View File

@ -2215,6 +2215,15 @@ jal_reloc_p (int r_type)
|| r_type == R_MICROMIPS_26_S1); || r_type == R_MICROMIPS_26_S1);
} }
static inline bfd_boolean
b_reloc_p (int r_type)
{
return (r_type == R_MIPS_PC26_S2
|| r_type == R_MIPS_PC21_S2
|| r_type == R_MIPS_PC16
|| r_type == R_MIPS_GNU_REL16_S2);
}
static inline bfd_boolean static inline bfd_boolean
aligned_pcrel_reloc_p (int r_type) aligned_pcrel_reloc_p (int r_type)
{ {
@ -10261,6 +10270,8 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
msg = NULL; msg = NULL;
if (jal_reloc_p (howto->type)) if (jal_reloc_p (howto->type))
msg = _("JALX to a non-word-aligned address"); msg = _("JALX to a non-word-aligned address");
else if (b_reloc_p (howto->type))
msg = _("Branch to a non-instruction-aligned address");
else if (aligned_pcrel_reloc_p (howto->type)) else if (aligned_pcrel_reloc_p (howto->type))
msg = _("PC-relative load from unaligned address"); msg = _("PC-relative load from unaligned address");
if (msg) if (msg)

View File

@ -1,3 +1,10 @@
2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
* testsuite/ld-mips-elf/unaligned-branch.d: New test.
* testsuite/ld-mips-elf/unaligned-branch.s: New test source.
* testsuite/ld-mips-elf/unaligned-text.s: New test source.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
2016-05-28 Maciej W. Rozycki <macro@imgtec.com> 2016-05-28 Maciej W. Rozycki <macro@imgtec.com>
* testsuite/ld-mips-elf/unaligned-syms.s: Rename to... * testsuite/ld-mips-elf/unaligned-syms.s: Rename to...

View File

@ -199,6 +199,8 @@ if $has_newabi {
[list [list ld $abi_ldflags(n32)]] [list [list ld $abi_ldflags(n32)]]
} }
run_dump_test "unaligned-branch" [list [list ld $abi_ldflags(o32)]]
run_dump_test "unaligned-lwpc-0" [list [list ld $abi_ldflags(o32)]] run_dump_test "unaligned-lwpc-0" [list [list ld $abi_ldflags(o32)]]
run_dump_test "unaligned-lwpc-1" [list [list ld $abi_ldflags(o32)]] run_dump_test "unaligned-lwpc-1" [list [list ld $abi_ldflags(o32)]]
run_dump_test "unaligned-ldpc-0" [list [list ld $abi_ldflags(o32)]] run_dump_test "unaligned-ldpc-0" [list [list ld $abi_ldflags(o32)]]

View File

@ -0,0 +1,23 @@
#name: MIPS branch to unaligned symbol
#source: unaligned-branch.s
#source: unaligned-text.s
#as: -EB -32 -mips32r6
#ld: -EB -Ttext 0x10000000 -e 0x10000000
#error: \A[^\n]*: In function `foo':\n
#error: \(\.text\+0x14\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x1c\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x24\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x28\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x30\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x38\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x3c\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x44\): Branch to a non-instruction-aligned address\n
#error: [^\n]*: In function `foo':\n
#error: \(\.text\+0x4c\): Branch to a non-instruction-aligned address\Z

View File

@ -0,0 +1,21 @@
.text
.align 4
.globl foo
.ent foo
foo:
b bar0
beqzc $2, bar0
bc bar0
b bar1
beqzc $2, bar1
bc bar1
b bar2
beqzc $2, bar2
bc bar2
b bar3
beqzc $2, bar3
bc bar3
b bar4
beqzc $2, bar4
bc bar4
.end foo

View File

@ -0,0 +1,15 @@
.macro sym n:req
.if \n
.globl bar\@
.type bar\@, @object
bar\@ :
.byte 0
.size bar\@, . - bar\@
sym \n - 1
.endif
.endm
.text
.align 4
.space 32
sym 16