[committed] MIPS/BFD: Correctly handle `bfd_reloc_outofrange' with branches
Maciej W. Rozycki
macro@imgtec.com
Sat May 28 09:58:00 GMT 2016
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.
---
Only the branch relocations actually triggering this error already are
added here, more to come later. I have committed this change.
Maciej
binutils-mips-bfd-b-reloc-err.diff
Index: binutils/bfd/elfxx-mips.c
===================================================================
--- binutils.orig/bfd/elfxx-mips.c 2016-05-27 12:09:28.401037225 +0100
+++ binutils/bfd/elfxx-mips.c 2016-05-27 12:15:28.836309714 +0100
@@ -2216,6 +2216,15 @@ jal_reloc_p (int r_type)
}
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)
{
return (r_type == R_MIPS_PC18_S3
@@ -10265,6 +10274,8 @@ _bfd_mips_elf_relocate_section (bfd *out
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)
Index: binutils/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils.orig/ld/testsuite/ld-mips-elf/mips-elf.exp 2016-05-27 12:09:28.418280974 +0100
+++ binutils/ld/testsuite/ld-mips-elf/mips-elf.exp 2016-05-27 12:15:28.855534051 +0100
@@ -199,6 +199,8 @@ if $has_newabi {
[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)]]
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-branch.d
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-branch.d 2016-05-27 12:15:28.940717613 +0100
@@ -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
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-branch.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-branch.s 2016-05-27 12:15:28.980073343 +0100
@@ -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
Index: binutils/ld/testsuite/ld-mips-elf/unaligned-text.s
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ binutils/ld/testsuite/ld-mips-elf/unaligned-text.s 2016-05-27 12:36:17.554839110 +0100
@@ -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
More information about the Binutils
mailing list