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.
+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>
* elfxx-mips.c (mips_elf_calculate_relocation): <R_MIPS16_26>
|| 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
aligned_pcrel_reloc_p (int r_type)
{
msg = NULL;
if (jal_reloc_p (howto->type))
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))
msg = _("PC-relative load from unaligned address");
if (msg)
+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>
* testsuite/ld-mips-elf/unaligned-syms.s: Rename to...
[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-1" [list [list ld $abi_ldflags(o32)]]
run_dump_test "unaligned-ldpc-0" [list [list ld $abi_ldflags(o32)]]
--- /dev/null
+#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
--- /dev/null
+ .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
--- /dev/null
+ .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