This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] 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.
---
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]