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 <[email protected]>
---
 ...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 <[email protected]>
+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  <[email protected]>
+
+       * 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  <[email protected]>
+
+       * 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
[email protected]
To unsubscribe, send a mail with subject "unsubscribe" to 
[email protected]

Reply via email to