mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
* [ptxdist] [PATCH OSELAS.Toolchain] cross-binutils: fix handling of relocations in conditional branches on aarch64
@ 2021-04-28 19:59 Lucas Stach
  0 siblings, 0 replies; only message in thread
From: Lucas Stach @ 2021-04-28 19:59 UTC (permalink / raw)
  To: ptxdist

Patch cherry-picked from the 2.36 release. Fixes:
"relocation truncated to fit: R_AARCH64_CONDBR19 against symbol 'SYM' defined in .text section"

This issue is a spurious link failure, which is sometimes triggered on very
large binaries, depending on the section ordering.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 ...n-error-on-conditional-branch-to-an-.patch | 127 ++++++++++++++++++
 patches/binutils-2.35/series                  |   4 +
 2 files changed, 131 insertions(+)
 create mode 100644 patches/binutils-2.35/0001-aarch64-Return-an-error-on-conditional-branch-to-an-.patch
 create mode 100644 patches/binutils-2.35/series

diff --git a/patches/binutils-2.35/0001-aarch64-Return-an-error-on-conditional-branch-to-an-.patch b/patches/binutils-2.35/0001-aarch64-Return-an-error-on-conditional-branch-to-an-.patch
new file mode 100644
index 000000000000..e4ec825ada65
--- /dev/null
+++ b/patches/binutils-2.35/0001-aarch64-Return-an-error-on-conditional-branch-to-an-.patch
@@ -0,0 +1,127 @@
+From: Siddhesh Poyarekar <siddesh.poyarekar@arm.com>
+Date: Tue, 1 Sep 2020 14:25:52 +0530
+Subject: [PATCH] aarch64: Return an error on conditional branch to an
+ undefined symbol
+
+The fix in 7e05773767820b441b23a16628b55c98cb1aef46 introduced a PLT
+for conditional jumps when the target symbol is undefined.  This is
+incorrect because conditional branch relocations are not allowed to
+clobber IP0/IP1 and hence, should not result in a dynamic relocation.
+
+Revert that change and in its place, issue an error when the target
+symbol is undefined.
+
+bfd/
+
+	2020-09-10  Siddhesh Poyarekar  <siddesh.poyarekar@arm.com>
+
+	* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Revert
+	changes in 7e05773767820b441b23a16628b55c98cb1aef46.  Set
+	error for undefined symbol in BFD_RELOC_AARCH64_BRANCH19 and
+	BFD_RELOC_AARCH64_TSTBR14 relocations.
+
+ld/
+
+	2020-09-10  Siddhesh Poyarekar  <siddesh.poyarekar@arm.com>
+
+	* testsuite/ld-aarch64/emit-relocs-560.d: Expect error instead
+	of valid output.
+---
+ bfd/elfnn-aarch64.c                       | 37 ++++++++++++++++---------------
+ ld/testsuite/ld-aarch64/emit-relocs-560.d |  7 +-----
+ 2 files changed, 20 insertions(+), 24 deletions(-)
+
+diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
+index 8f1e5e1e456a..44c7c3f888d1 100644
+--- a/bfd/elfnn-aarch64.c
++++ b/bfd/elfnn-aarch64.c
+@@ -5448,7 +5448,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
+   bfd_vma orig_value = value;
+   bfd_boolean resolved_to_zero;
+   bfd_boolean abs_symbol_p;
+-  bfd_boolean via_plt_p;
+ 
+   globals = elf_aarch64_hash_table (info);
+ 
+@@ -5470,8 +5469,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
+ 		  : bfd_is_und_section (sym_sec));
+   abs_symbol_p = h != NULL && bfd_is_abs_symbol (&h->root);
+ 
+-  via_plt_p = (globals->root.splt != NULL && h != NULL
+-	       && h->plt.offset != (bfd_vma) - 1);
+ 
+   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
+      it here if it is defined in a non-shared object.  */
+@@ -5807,23 +5804,12 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
+ 	value += signed_addend;
+       break;
+ 
+-    case BFD_RELOC_AARCH64_BRANCH19:
+-    case BFD_RELOC_AARCH64_TSTBR14:
+-      /* A conditional branch to an undefined weak symbol is converted to a
+-	 branch to itself.  */
+-      if (weak_undef_p && !via_plt_p)
+-	{
+-	  value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
+-						       place, value,
+-						       signed_addend,
+-						       weak_undef_p);
+-	  break;
+-	}
+-      /* Fall through.  */
+     case BFD_RELOC_AARCH64_CALL26:
+     case BFD_RELOC_AARCH64_JUMP26:
+       {
+ 	asection *splt = globals->root.splt;
++	bfd_boolean via_plt_p =
++	  splt != NULL && h != NULL && h->plt.offset != (bfd_vma) - 1;
+ 
+ 	/* A call to an undefined weak symbol is converted to a jump to
+ 	   the next instruction unless a PLT entry will be created.
+@@ -5904,6 +5890,23 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
+ 	  bfd_set_error (bfd_error_bad_value);
+ 	  return bfd_reloc_notsupported;
+ 	}
++      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
++						   place, value,
++						   signed_addend,
++						   weak_undef_p);
++      break;
++
++    case BFD_RELOC_AARCH64_BRANCH19:
++    case BFD_RELOC_AARCH64_TSTBR14:
++      if (h && h->root.type == bfd_link_hash_undefined)
++	{
++	  _bfd_error_handler
++	    /* xgettext:c-format */
++	    (_("%pB: conditional branch to undefined symbol `%s' "
++	       "not allowed"), input_bfd, h->root.root.string);
++	  bfd_set_error (bfd_error_bad_value);
++	  return bfd_reloc_notsupported;
++	}
+       /* Fall through.  */
+ 
+     case BFD_RELOC_AARCH64_16:
+@@ -7969,8 +7972,6 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ 	    break;
+ 	  }
+ 
+-	case BFD_RELOC_AARCH64_BRANCH19:
+-	case BFD_RELOC_AARCH64_TSTBR14:
+ 	case BFD_RELOC_AARCH64_CALL26:
+ 	case BFD_RELOC_AARCH64_JUMP26:
+ 	  /* If this is a local symbol then we resolve it
+diff --git a/ld/testsuite/ld-aarch64/emit-relocs-560.d b/ld/testsuite/ld-aarch64/emit-relocs-560.d
+index 153532457b4e..8751b743bd47 100644
+--- a/ld/testsuite/ld-aarch64/emit-relocs-560.d
++++ b/ld/testsuite/ld-aarch64/emit-relocs-560.d
+@@ -1,8 +1,3 @@
+ #source: emit-relocs-560.s
+ #ld: -shared
+-#readelf: -r
+-
+-Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 2 entries:
+-  Offset          Info           Type           Sym. Value    Sym. Name \+ Addend
+-[0-9a-f]+  000100000402 R_AARCH64_JUMP_SL 0000000000000000 baz \+ 0
+-[0-9a-f]+  000200000402 R_AARCH64_JUMP_SL 0000000000000000 bar \+ 0
++#error: .*: conditional branch to undefined symbol `bar' not allowed
diff --git a/patches/binutils-2.35/series b/patches/binutils-2.35/series
new file mode 100644
index 000000000000..1801c88d8702
--- /dev/null
+++ b/patches/binutils-2.35/series
@@ -0,0 +1,4 @@
+# generated by git-ptx-patches
+#tag:base --start-number 1
+0001-aarch64-Return-an-error-on-conditional-branch-to-an-.patch
+# 5659eac4238ed54433b24df64ce3eed6  - git-ptx-patches magic
-- 
2.30.2


_______________________________________________
ptxdist mailing list
ptxdist@pengutronix.de
To unsubscribe, send a mail with subject "unsubscribe" to ptxdist-request@pengutronix.de


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-04-28 20:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-28 19:59 [ptxdist] [PATCH OSELAS.Toolchain] cross-binutils: fix handling of relocations in conditional branches on aarch64 Lucas Stach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox