diff --git a/SOURCES/binutils-aarch64-armv8.6-support.patch b/SOURCES/binutils-aarch64-armv8.6-support.patch
index f1a9d69..fd070a7 100644
--- a/SOURCES/binutils-aarch64-armv8.6-support.patch
+++ b/SOURCES/binutils-aarch64-armv8.6-support.patch
@@ -171,2799 +171,6 @@ diff -rup binutils-2.30/bfd/cpu-aarch64.c binutils-2.30.new/bfd/cpu-aarch64.c
  
  const bfd_arch_info_type bfd_aarch64_arch =
    N (0, "aarch64", 64, TRUE, &bfd_aarch64_arch_ilp32);
-Only in binutils-2.30.new/bfd: cpu-aarch64.h
-diff -rup binutils-2.30/bfd/elfnn-aarch64.c binutils-2.30.new/bfd/elfnn-aarch64.c
---- binutils-2.30/bfd/elfnn-aarch64.c	2021-03-23 16:21:45.924009761 +0000
-+++ binutils-2.30.new/bfd/elfnn-aarch64.c	2021-03-23 16:20:02.826710644 +0000
-@@ -1,5 +1,5 @@
- /* AArch64-specific support for NN-bit ELF.
--   Copyright (C) 2009-2018 Free Software Foundation, Inc.
-+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
-    Contributed by ARM Ltd.
- 
-    This file is part of BFD, the Binary File Descriptor library.
-@@ -139,12 +139,12 @@
- #include "bfd.h"
- #include "libiberty.h"
- #include "libbfd.h"
--#include "bfd_stdint.h"
- #include "elf-bfd.h"
- #include "bfdlink.h"
- #include "objalloc.h"
- #include "elf/aarch64.h"
- #include "elfxx-aarch64.h"
-+#include "cpu-aarch64.h"
- 
- #define ARCH_SIZE	NN
- 
-@@ -201,6 +201,14 @@
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12	\
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12	\
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12	\
-+   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC	\
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0		\
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC	\
-    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1		\
-@@ -260,6 +268,12 @@
- #define PLT_ENTRY_SIZE			(32)
- #define PLT_SMALL_ENTRY_SIZE		(16)
- #define PLT_TLSDESC_ENTRY_SIZE		(32)
-+/* PLT sizes with BTI insn.  */
-+#define PLT_BTI_SMALL_ENTRY_SIZE	(24)
-+/* PLT sizes with PAC insn.  */
-+#define PLT_PAC_SMALL_ENTRY_SIZE	(24)
-+/* PLT sizes with BTI and PAC insn.  */
-+#define PLT_BTI_PAC_SMALL_ENTRY_SIZE	(24)
- 
- /* Encoding of the nop instruction.  */
- #define INSN_NOP 0xd503201f
-@@ -290,9 +304,26 @@ static const bfd_byte elfNN_aarch64_smal
-   0x1f, 0x20, 0x03, 0xd5,	/* nop */
- };
- 
-+static const bfd_byte elfNN_aarch64_small_plt0_bti_entry[PLT_ENTRY_SIZE] =
-+{
-+  0x5f, 0x24, 0x03, 0xd5,	/* bti c.  */
-+  0xf0, 0x7b, 0xbf, 0xa9,	/* stp x16, x30, [sp, #-16]!  */
-+  0x10, 0x00, 0x00, 0x90,	/* adrp x16, (GOT+16)  */
-+#if ARCH_SIZE == 64
-+  0x11, 0x0A, 0x40, 0xf9,	/* ldr x17, [x16, #PLT_GOT+0x10]  */
-+  0x10, 0x42, 0x00, 0x91,	/* add x16, x16,#PLT_GOT+0x10   */
-+#else
-+  0x11, 0x0A, 0x40, 0xb9,	/* ldr w17, [x16, #PLT_GOT+0x8]  */
-+  0x10, 0x22, 0x00, 0x11,	/* add w16, w16,#PLT_GOT+0x8   */
-+#endif
-+  0x20, 0x02, 0x1f, 0xd6,	/* br x17  */
-+  0x1f, 0x20, 0x03, 0xd5,	/* nop */
-+  0x1f, 0x20, 0x03, 0xd5,	/* nop */
-+};
-+
- /* Per function entry in a procedure linkage table looks like this
-    if the distance between the PLTGOT and the PLT is < 4GB use
--   these PLT entries.  */
-+   these PLT entries.  Use BTI versions of the PLTs when enabled.  */
- static const bfd_byte elfNN_aarch64_small_plt_entry[PLT_SMALL_ENTRY_SIZE] =
- {
-   0x10, 0x00, 0x00, 0x90,	/* adrp x16, PLTGOT + n * 8  */
-@@ -307,6 +338,54 @@ static const bfd_byte elfNN_aarch64_smal
- };
- 
- static const bfd_byte
-+elfNN_aarch64_small_plt_bti_entry[PLT_BTI_SMALL_ENTRY_SIZE] =
-+{
-+  0x5f, 0x24, 0x03, 0xd5,	/* bti c.  */
-+  0x10, 0x00, 0x00, 0x90,	/* adrp x16, PLTGOT + n * 8  */
-+#if ARCH_SIZE == 64
-+  0x11, 0x02, 0x40, 0xf9,	/* ldr x17, [x16, PLTGOT + n * 8] */
-+  0x10, 0x02, 0x00, 0x91,	/* add x16, x16, :lo12:PLTGOT + n * 8  */
-+#else
-+  0x11, 0x02, 0x40, 0xb9,	/* ldr w17, [x16, PLTGOT + n * 4] */
-+  0x10, 0x02, 0x00, 0x11,	/* add w16, w16, :lo12:PLTGOT + n * 4  */
-+#endif
-+  0x20, 0x02, 0x1f, 0xd6,	/* br x17.  */
-+  0x1f, 0x20, 0x03, 0xd5,	/* nop */
-+};
-+
-+static const bfd_byte
-+elfNN_aarch64_small_plt_pac_entry[PLT_PAC_SMALL_ENTRY_SIZE] =
-+{
-+  0x10, 0x00, 0x00, 0x90,	/* adrp x16, PLTGOT + n * 8  */
-+#if ARCH_SIZE == 64
-+  0x11, 0x02, 0x40, 0xf9,	/* ldr x17, [x16, PLTGOT + n * 8] */
-+  0x10, 0x02, 0x00, 0x91,	/* add x16, x16, :lo12:PLTGOT + n * 8  */
-+#else
-+  0x11, 0x02, 0x40, 0xb9,	/* ldr w17, [x16, PLTGOT + n * 4] */
-+  0x10, 0x02, 0x00, 0x11,	/* add w16, w16, :lo12:PLTGOT + n * 4  */
-+#endif
-+  0x9f, 0x21, 0x03, 0xd5,	/* autia1716 */
-+  0x20, 0x02, 0x1f, 0xd6,	/* br x17.  */
-+  0x1f, 0x20, 0x03, 0xd5,	/* nop */
-+};
-+
-+static const bfd_byte
-+elfNN_aarch64_small_plt_bti_pac_entry[PLT_BTI_PAC_SMALL_ENTRY_SIZE] =
-+{
-+  0x5f, 0x24, 0x03, 0xd5,	/* bti c.  */
-+  0x10, 0x00, 0x00, 0x90,	/* adrp x16, PLTGOT + n * 8  */
-+#if ARCH_SIZE == 64
-+  0x11, 0x02, 0x40, 0xf9,	/* ldr x17, [x16, PLTGOT + n * 8] */
-+  0x10, 0x02, 0x00, 0x91,	/* add x16, x16, :lo12:PLTGOT + n * 8  */
-+#else
-+  0x11, 0x02, 0x40, 0xb9,	/* ldr w17, [x16, PLTGOT + n * 4] */
-+  0x10, 0x02, 0x00, 0x11,	/* add w16, w16, :lo12:PLTGOT + n * 4  */
-+#endif
-+  0x9f, 0x21, 0x03, 0xd5,	/* autia1716 */
-+  0x20, 0x02, 0x1f, 0xd6,	/* br x17.  */
-+};
-+
-+static const bfd_byte
- elfNN_aarch64_tlsdesc_small_plt_entry[PLT_TLSDESC_ENTRY_SIZE] =
- {
-   0xe2, 0x0f, 0xbf, 0xa9,	/* stp x2, x3, [sp, #-16]! */
-@@ -324,6 +403,24 @@ elfNN_aarch64_tlsdesc_small_plt_entry[PL
-   0x1f, 0x20, 0x03, 0xd5,	/* nop */
- };
- 
-+static const bfd_byte
-+elfNN_aarch64_tlsdesc_small_plt_bti_entry[PLT_TLSDESC_ENTRY_SIZE] =
-+{
-+  0x5f, 0x24, 0x03, 0xd5,	/* bti c.  */
-+  0xe2, 0x0f, 0xbf, 0xa9,	/* stp x2, x3, [sp, #-16]! */
-+  0x02, 0x00, 0x00, 0x90,	/* adrp x2, 0 */
-+  0x03, 0x00, 0x00, 0x90,	/* adrp x3, 0 */
-+#if ARCH_SIZE == 64
-+  0x42, 0x00, 0x40, 0xf9,	/* ldr x2, [x2, #0] */
-+  0x63, 0x00, 0x00, 0x91,	/* add x3, x3, 0 */
-+#else
-+  0x42, 0x00, 0x40, 0xb9,	/* ldr w2, [x2, #0] */
-+  0x63, 0x00, 0x00, 0x11,	/* add w3, w3, 0 */
-+#endif
-+  0x40, 0x00, 0x1f, 0xd6,	/* br x2 */
-+  0x1f, 0x20, 0x03, 0xd5,	/* nop */
-+};
-+
- #define elf_info_to_howto		elfNN_aarch64_info_to_howto
- #define elf_info_to_howto_rel		elfNN_aarch64_info_to_howto
- 
-@@ -617,6 +714,114 @@ static reloc_howto_type elfNN_aarch64_ho
- 	 0xffff,		/* dst_mask */
- 	 FALSE),		/* pcrel_offset */
- 
-+  /* Group relocations to create a 16, 32, 48 or 64 bit
-+     PC relative address inline.  */
-+
-+  /* MOV[NZ]:   ((S+A-P) >>  0) & 0xffff */
-+  HOWTO (AARCH64_R (MOVW_PREL_G0),	/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 17,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G0),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOVK:   ((S+A-P) >>  0) & 0xffff [no overflow check] */
-+  HOWTO (AARCH64_R (MOVW_PREL_G0_NC),	/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G0_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOV[NZ]:   ((S+A-P) >> 16) & 0xffff */
-+  HOWTO (AARCH64_R (MOVW_PREL_G1),	/* type */
-+	 16,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 17,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G1),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOVK:   ((S+A-P) >> 16) & 0xffff [no overflow check] */
-+  HOWTO64 (AARCH64_R (MOVW_PREL_G1_NC),	/* type */
-+	 16,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G1_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOV[NZ]:   ((S+A-P) >> 32) & 0xffff */
-+  HOWTO64 (AARCH64_R (MOVW_PREL_G2),	/* type */
-+	 32,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 17,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_signed,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G2),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOVK:   ((S+A-P) >> 32) & 0xffff [no overflow check] */
-+  HOWTO64 (AARCH64_R (MOVW_PREL_G2_NC),	/* type */
-+	 32,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G2_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
-+  /* MOV[NZ]:   ((S+A-P) >> 48) & 0xffff */
-+  HOWTO64 (AARCH64_R (MOVW_PREL_G3),	/* type */
-+	 48,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 16,			/* bitsize */
-+	 TRUE,			/* pc_relative */
-+	 0,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (MOVW_PREL_G3),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffff,		/* src_mask */
-+	 0xffff,		/* dst_mask */
-+	 TRUE),		/* pcrel_offset */
-+
- /* Relocations to generate 19, 21 and 33 bit PC-relative load/store
-    addresses: PG(x) is (x & ~0xfff).  */
- 
-@@ -1527,6 +1732,126 @@ static reloc_howto_type elfNN_aarch64_ho
- 	 0xfff,			/* dst_mask */
- 	 FALSE),		/* pcrel_offset */
- 
-+  /* LD/ST16: bit[11:1] of byte offset to module TLS base address.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST16_TPREL_LO12),	/* type */
-+	 1,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 11,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_unsigned,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x1ffc00,		/* src_mask */
-+	 0x1ffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12, but no overflow check.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST16_TPREL_LO12_NC),	/* type */
-+	 1,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 11,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x1ffc00,		/* src_mask */
-+	 0x1ffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* LD/ST32: bit[11:2] of byte offset to module TLS base address.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST32_TPREL_LO12),	/* type */
-+	 2,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 10,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_unsigned,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffc00,		/* src_mask */
-+	 0xffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12, but no overflow check.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST32_TPREL_LO12_NC),	/* type */
-+	 2,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 10,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0xffc00,		/* src_mask */
-+	 0xffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* LD/ST64: bit[11:3] of byte offset to module TLS base address.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST64_TPREL_LO12),	/* type */
-+	 3,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 9,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_unsigned,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x7fc00,		/* src_mask */
-+	 0x7fc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12, but no overflow check.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST64_TPREL_LO12_NC),	/* type */
-+	 3,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 9,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x7fc00,		/* src_mask */
-+	 0x7fc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* LD/ST8: bit[11:0] of byte offset to module TLS base address.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST8_TPREL_LO12),	/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 12,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_unsigned,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x3ffc00,		/* src_mask */
-+	 0x3ffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-+  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12, but no overflow check.  */
-+  HOWTO (AARCH64_R (TLSLE_LDST8_TPREL_LO12_NC),	/* type */
-+	 0,			/* rightshift */
-+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-+	 12,			/* bitsize */
-+	 FALSE,			/* pc_relative */
-+	 10,			/* bitpos */
-+	 complain_overflow_dont,	/* complain_on_overflow */
-+	 bfd_elf_generic_reloc,	/* special_function */
-+	 AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12_NC),	/* name */
-+	 FALSE,			/* partial_inplace */
-+	 0x3ffc00,		/* src_mask */
-+	 0x3ffc00,		/* dst_mask */
-+	 FALSE),		/* pcrel_offset */
-+
-   HOWTO (AARCH64_R (TLSDESC_LD_PREL19),	/* type */
- 	 2,			/* rightshift */
- 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-@@ -1864,7 +2189,7 @@ elfNN_aarch64_bfd_reloc_from_howto (relo
- /* Given R_TYPE, return the bfd internal relocation enumerator.  */
- 
- static bfd_reloc_code_real_type
--elfNN_aarch64_bfd_reloc_from_type (unsigned int r_type)
-+elfNN_aarch64_bfd_reloc_from_type (bfd *abfd, unsigned int r_type)
- {
-   static bfd_boolean initialized_p = FALSE;
-   /* Indexed by R_TYPE, values are offsets in the howto_table.  */
-@@ -1887,7 +2212,8 @@ elfNN_aarch64_bfd_reloc_from_type (unsig
-   /* PR 17512: file: b371e70a.  */
-   if (r_type >= R_AARCH64_end)
-     {
--      _bfd_error_handler (_("Invalid AArch64 reloc number: %d"), r_type);
-+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-+			  abfd, r_type);
-       bfd_set_error (bfd_error_bad_value);
-       return BFD_RELOC_AARCH64_NONE;
-     }
-@@ -1946,7 +2272,7 @@ elfNN_aarch64_howto_from_bfd_reloc (bfd_
- }
- 
- static reloc_howto_type *
--elfNN_aarch64_howto_from_type (unsigned int r_type)
-+elfNN_aarch64_howto_from_type (bfd *abfd, unsigned int r_type)
- {
-   bfd_reloc_code_real_type val;
-   reloc_howto_type *howto;
-@@ -1962,7 +2288,7 @@ elfNN_aarch64_howto_from_type (unsigned
-   if (r_type == R_AARCH64_NONE)
-     return &elfNN_aarch64_howto_none;
- 
--  val = elfNN_aarch64_bfd_reloc_from_type (r_type);
-+  val = elfNN_aarch64_bfd_reloc_from_type (abfd, r_type);
-   howto = elfNN_aarch64_howto_from_bfd_reloc (val);
- 
-   if (howto != NULL)
-@@ -1972,14 +2298,22 @@ elfNN_aarch64_howto_from_type (unsigned
-   return NULL;
- }
- 
--static void
--elfNN_aarch64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
-+static bfd_boolean
-+elfNN_aarch64_info_to_howto (bfd *abfd, arelent *bfd_reloc,
- 			     Elf_Internal_Rela *elf_reloc)
- {
-   unsigned int r_type;
- 
-   r_type = ELFNN_R_TYPE (elf_reloc->r_info);
--  bfd_reloc->howto = elfNN_aarch64_howto_from_type (r_type);
-+  bfd_reloc->howto = elfNN_aarch64_howto_from_type (abfd, r_type);
-+
-+  if (bfd_reloc->howto == NULL)
-+    {
-+      /* xgettext:c-format */
-+      _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type);
-+      return FALSE;
-+    }
-+  return TRUE;
- }
- 
- static reloc_howto_type *
-@@ -2194,6 +2528,13 @@ struct elf_aarch64_obj_tdata
- 
-   /* All GNU_PROPERTY_AARCH64_FEATURE_1_AND properties.  */
-   uint32_t gnu_and_prop;
-+
-+  /* Zero to warn when linking objects with incompatible
-+     GNU_PROPERTY_AARCH64_FEATURE_1_BTI.  */
-+  int no_bti_warn;
-+
-+  /* PLT type based on security.  */
-+  aarch64_plt_type plt_type;
- };
- 
- #define elf_aarch64_tdata(bfd)				\
-@@ -2299,9 +2640,15 @@ struct elf_aarch64_link_hash_table
-   /* The number of bytes in the initial entry in the PLT.  */
-   bfd_size_type plt_header_size;
- 
--  /* The number of bytes in the subsequent PLT etries.  */
-+  /* The bytes of the initial PLT entry.  */
-+  const bfd_byte *plt0_entry;
-+
-+  /* The number of bytes in the subsequent PLT entries.  */
-   bfd_size_type plt_entry_size;
- 
-+  /* The bytes of the subsequent PLT entry.  */
-+  const bfd_byte *plt_entry;
-+
-   /* Small local sym cache.  */
-   struct sym_cache sym_cache;
- 
-@@ -2347,6 +2694,9 @@ struct elf_aarch64_link_hash_table
-      yet.  */
-   bfd_vma tlsdesc_plt;
- 
-+  /* The number of bytes in the PLT enty for the TLS descriptor.  */
-+  bfd_size_type tlsdesc_plt_entry_size;
-+
-   /* The GOT offset for the lazy trampoline.  Communicated to the
-      loader via DT_TLSDESC_GOT.  The magic value (bfd_vma) -1
-      indicates an offset is not allocated.  */
-@@ -2560,8 +2910,8 @@ elfNN_aarch64_merge_symbol_attribute (st
- 				      bfd_boolean definition ATTRIBUTE_UNUSED,
- 				      bfd_boolean dynamic ATTRIBUTE_UNUSED)
- {
--  unsigned int isym_sto = isym->st_other & ~ELF_ST_VISIBILITY (-1);
--  unsigned int h_sto = h->other & ~ELF_ST_VISIBILITY (-1);
-+  unsigned int isym_sto = (isym->st_other & ~ELF_ST_VISIBILITY (-1)) & 0xFF;
-+  unsigned int h_sto = (h->other & ~ELF_ST_VISIBILITY (-1)) & 0xFF;
- 
-   if (isym_sto == h_sto)
-     return;
-@@ -2600,7 +2950,7 @@ static struct bfd_link_hash_table *
- elfNN_aarch64_link_hash_table_create (bfd *abfd)
- {
-   struct elf_aarch64_link_hash_table *ret;
--  bfd_size_type amt = sizeof (struct elf_aarch64_link_hash_table);
-+  size_t amt = sizeof (struct elf_aarch64_link_hash_table);
- 
-   ret = bfd_zmalloc (amt);
-   if (ret == NULL)
-@@ -2615,7 +2965,10 @@ elfNN_aarch64_link_hash_table_create (bf
-     }
- 
-   ret->plt_header_size = PLT_ENTRY_SIZE;
-+  ret->plt0_entry = elfNN_aarch64_small_plt0_entry;
-   ret->plt_entry_size = PLT_SMALL_ENTRY_SIZE;
-+  ret->plt_entry = elfNN_aarch64_small_plt_entry;
-+  ret->tlsdesc_plt_entry_size = PLT_TLSDESC_ENTRY_SIZE;
-   ret->obfd = abfd;
-   ret->dt_tlsdesc_got = (bfd_vma) - 1;
- 
-@@ -2650,12 +3003,13 @@ aarch64_relocate (unsigned int r_type, b
-   reloc_howto_type *howto;
-   bfd_vma place;
- 
--  howto = elfNN_aarch64_howto_from_type (r_type);
-+  howto = elfNN_aarch64_howto_from_type (input_bfd, r_type);
-   place = (input_section->output_section->vma + input_section->output_offset
- 	   + offset);
- 
--  r_type = elfNN_aarch64_bfd_reloc_from_type (r_type);
--  value = _bfd_aarch64_elf_resolve_relocation (r_type, place, value, 0, FALSE);
-+  r_type = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
-+  value = _bfd_aarch64_elf_resolve_relocation (input_bfd, r_type, place,
-+					       value, 0, FALSE);
-   return _bfd_aarch64_elf_put_addend (input_bfd,
- 				      input_section->contents + offset, r_type,
- 				      howto, value) == bfd_reloc_ok;
-@@ -2882,7 +3236,7 @@ _bfd_aarch64_add_stub_entry_in_group (co
-   if (stub_entry == NULL)
-     {
-       /* xgettext:c-format */
--      _bfd_error_handler (_("%B: cannot create stub entry %s"),
-+      _bfd_error_handler (_("%pB: cannot create stub entry %s"),
- 			  section->owner, stub_name);
-       return NULL;
-     }
-@@ -2905,6 +3259,8 @@ _bfd_aarch64_add_stub_entry_after (const
-   asection *stub_sec;
-   struct elf_aarch64_stub_hash_entry *stub_entry;
- 
-+  stub_sec = NULL;
-+  /* Only create the actual stub if we will end up needing it.  */
-   stub_sec = _bfd_aarch64_get_stub_for_link_section (link_section, htab);
-   stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table, stub_name,
- 					 TRUE, FALSE);
-@@ -3097,7 +3453,7 @@ elfNN_aarch64_setup_section_lists (bfd *
-   unsigned int top_id, top_index;
-   asection *section;
-   asection **input_list, **list;
--  bfd_size_type amt;
-+  size_t amt;
-   struct elf_aarch64_link_hash_table *htab =
-     elf_aarch64_hash_table (info);
- 
-@@ -3175,7 +3531,7 @@ elfNN_aarch64_next_input_section (struct
-     {
-       asection **list = htab->input_list + isec->output_section->index;
- 
--      if (*list != bfd_abs_section_ptr)
-+      if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0)
- 	{
- 	  /* Steal the link_sec pointer for our list.  */
- 	  /* This happens to make the list in reverse order,
-@@ -3196,68 +3552,97 @@ elfNN_aarch64_next_input_section (struct
- static void
- group_sections (struct elf_aarch64_link_hash_table *htab,
- 		bfd_size_type stub_group_size,
--		bfd_boolean stubs_always_before_branch)
-+		bfd_boolean stubs_always_after_branch)
- {
--  asection **list = htab->input_list + htab->top_index;
-+  asection **list = htab->input_list;
- 
-   do
-     {
-       asection *tail = *list;
-+      asection *head;
- 
-       if (tail == bfd_abs_section_ptr)
- 	continue;
- 
-+      /* Reverse the list: we must avoid placing stubs at the
-+	 beginning of the section because the beginning of the text
-+	 section may be required for an interrupt vector in bare metal
-+	 code.  */
-+#define NEXT_SEC PREV_SEC
-+      head = NULL;
-       while (tail != NULL)
- 	{
--	  asection *curr;
--	  asection *prev;
--	  bfd_size_type total;
-+	  /* Pop from tail.  */
-+	  asection *item = tail;
-+	  tail = PREV_SEC (item);
- 
--	  curr = tail;
--	  total = tail->size;
--	  while ((prev = PREV_SEC (curr)) != NULL
--		 && ((total += curr->output_offset - prev->output_offset)
--		     < stub_group_size))
--	    curr = prev;
-+	  /* Push on head.  */
-+	  NEXT_SEC (item) = head;
-+	  head = item;
-+	}
- 
--	  /* OK, the size from the start of CURR to the end is less
-+      while (head != NULL)
-+	{
-+	  asection *curr;
-+	  asection *next;
-+	  bfd_vma stub_group_start = head->output_offset;
-+	  bfd_vma end_of_next;
-+
-+	  curr = head;
-+	  while (NEXT_SEC (curr) != NULL)
-+	    {
-+	      next = NEXT_SEC (curr);
-+	      end_of_next = next->output_offset + next->size;
-+	      if (end_of_next - stub_group_start >= stub_group_size)
-+		/* End of NEXT is too far from start, so stop.  */
-+		break;
-+	      /* Add NEXT to the group.  */
-+	      curr = next;
-+	    }
-+
-+	  /* OK, the size from the start to the start of CURR is less
- 	     than stub_group_size and thus can be handled by one stub
--	     section.  (Or the tail section is itself larger than
-+	     section.  (Or the head section is itself larger than
- 	     stub_group_size, in which case we may be toast.)
- 	     We should really be keeping track of the total size of
- 	     stubs added here, as stubs contribute to the final output
- 	     section size.  */
- 	  do
- 	    {
--	      prev = PREV_SEC (tail);
-+	      next = NEXT_SEC (head);
- 	      /* Set up this stub group.  */
--	      htab->stub_group[tail->id].link_sec = curr;
-+	      htab->stub_group[head->id].link_sec = curr;
- 	    }
--	  while (tail != curr && (tail = prev) != NULL);
-+	  while (head != curr && (head = next) != NULL);
- 
- 	  /* But wait, there's more!  Input sections up to stub_group_size
--	     bytes before the stub section can be handled by it too.  */
--	  if (!stubs_always_before_branch)
-+	     bytes after the stub section can be handled by it too.  */
-+	  if (!stubs_always_after_branch)
- 	    {
--	      total = 0;
--	      while (prev != NULL
--		     && ((total += tail->output_offset - prev->output_offset)
--			 < stub_group_size))
-+	      stub_group_start = curr->output_offset + curr->size;
-+
-+	      while (next != NULL)
- 		{
--		  tail = prev;
--		  prev = PREV_SEC (tail);
--		  htab->stub_group[tail->id].link_sec = curr;
-+		  end_of_next = next->output_offset + next->size;
-+		  if (end_of_next - stub_group_start >= stub_group_size)
-+		    /* End of NEXT is too far from stubs, so stop.  */
-+		    break;
-+		  /* Add NEXT to the stub group.  */
-+		  head = next;
-+		  next = NEXT_SEC (head);
-+		  htab->stub_group[head->id].link_sec = curr;
- 		}
- 	    }
--	  tail = prev;
-+	  head = next;
- 	}
-     }
--  while (list-- != htab->input_list);
-+  while (list++ != htab->input_list + htab->top_index);
- 
-   free (htab->input_list);
- }
- 
- #undef PREV_SEC
-+#undef PREV_SEC
- 
- #define AARCH64_BITS(x, pos, n) (((x) >> (pos)) & ((1 << (n)) - 1))
- 
-@@ -3531,7 +3916,8 @@ _bfd_aarch64_erratum_835769_stub_name (u
- {
-   char *stub_name = (char *) bfd_malloc
-     (strlen ("__erratum_835769_veneer_") + 16);
--  sprintf (stub_name,"__erratum_835769_veneer_%d", num_fixes);
-+  if (stub_name != NULL)
-+    sprintf (stub_name,"__erratum_835769_veneer_%d", num_fixes);
-   return stub_name;
- }
- 
-@@ -3573,8 +3959,9 @@ _bfd_aarch64_erratum_835769_scan (bfd *i
- 
-       sec_data = elf_aarch64_section_data (section);
- 
--      qsort (sec_data->map, sec_data->mapcount,
--	     sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
-+      if (sec_data->mapcount)
-+	qsort (sec_data->map, sec_data->mapcount,
-+	       sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
- 
-       for (span = 0; span < sec_data->mapcount; span++)
- 	{
-@@ -3630,7 +4017,7 @@ _bfd_aarch64_erratum_835769_scan (bfd *i
- static bfd_boolean
- _bfd_aarch64_adrp_p (uint32_t insn)
- {
--  return ((insn & 0x9f000000) == 0x90000000);
-+  return ((insn & AARCH64_ADRP_OP_MASK) == AARCH64_ADRP_OP);
- }
- 
- 
-@@ -3727,22 +4114,24 @@ _bfd_aarch64_resize_stubs (struct elf_aa
-       if (!strstr (section->name, STUB_SUFFIX))
- 	continue;
- 
-+      /* Add space for a branch.  Add 8 bytes to keep section 8 byte aligned,
-+	 as long branch stubs contain a 64-bit address.  */
-       if (section->size)
--	section->size += 4;
-+	section->size += 8;
- 
-       /* Ensure all stub sections have a size which is a multiple of
- 	 4096.  This is important in order to ensure that the insertion
- 	 of stub sections does not in itself move existing code around
--	 in such a way that new errata sequences are created.  */
-+	 in such a way that new errata sequences are created.  We only do this
-+	 when the ADRP workaround is enabled.  If only the ADR workaround is
-+	 enabled then the stubs workaround won't ever be used.  */
-       if (htab->fix_erratum_843419)
- 	if (section->size)
- 	  section->size = BFD_ALIGN (section->size, 0x1000);
-     }
- }
- 
--
--/* Construct an erratum 843419 workaround stub name.
-- */
-+/* Construct an erratum 843419 workaround stub name.  */
- 
- static char *
- _bfd_aarch64_erratum_843419_stub_name (asection *input_section,
-@@ -3778,6 +4167,8 @@ _bfd_aarch64_erratum_843419_fixup (uint3
-   struct elf_aarch64_stub_hash_entry *stub_entry;
- 
-   stub_name = _bfd_aarch64_erratum_843419_stub_name (section, ldst_offset);
-+  if (stub_name == NULL)
-+    return FALSE;
-   stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table, stub_name,
- 					 FALSE, FALSE);
-   if (stub_entry)
-@@ -3795,8 +4186,7 @@ _bfd_aarch64_erratum_843419_fixup (uint3
-      If we placed workaround veneers in any other stub section then we
-      could not assume that all relocations have been processed on the
-      corresponding input section at the point we output the stub
--     section.
--   */
-+     section.  */
- 
-   stub_entry = _bfd_aarch64_add_stub_entry_after (stub_name, section, htab);
-   if (stub_entry == NULL)
-@@ -3854,8 +4244,9 @@ _bfd_aarch64_erratum_843419_scan (bfd *i
- 
-       sec_data = elf_aarch64_section_data (section);
- 
--      qsort (sec_data->map, sec_data->mapcount,
--	     sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
-+      if (sec_data->mapcount)
-+	qsort (sec_data->map, sec_data->mapcount,
-+	       sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
- 
-       for (span = 0; span < sec_data->mapcount; span++)
- 	{
-@@ -3950,9 +4341,15 @@ elfNN_aarch64_size_stubs (bfd *output_bf
- 
-       for (input_bfd = info->input_bfds;
- 	   input_bfd != NULL; input_bfd = input_bfd->link.next)
--	if (!_bfd_aarch64_erratum_835769_scan (input_bfd, info,
--					       &num_erratum_835769_fixes))
--	  return FALSE;
-+	{
-+	  if (!is_aarch64_elf (input_bfd)
-+	      || (input_bfd->flags & BFD_LINKER_CREATED) != 0)
-+	    continue;
-+
-+	  if (!_bfd_aarch64_erratum_835769_scan (input_bfd, info,
-+						 &num_erratum_835769_fixes))
-+	    return FALSE;
-+	}
- 
-       _bfd_aarch64_resize_stubs (htab);
-       (*htab->layout_sections_again) ();
-@@ -3968,6 +4365,10 @@ elfNN_aarch64_size_stubs (bfd *output_bf
- 	{
- 	  asection *section;
- 
-+	  if (!is_aarch64_elf (input_bfd)
-+	      || (input_bfd->flags & BFD_LINKER_CREATED) != 0)
-+	    continue;
-+
- 	  for (section = input_bfd->sections;
- 	       section != NULL;
- 	       section = section->next)
-@@ -3990,6 +4391,10 @@ elfNN_aarch64_size_stubs (bfd *output_bf
- 	  asection *section;
- 	  Elf_Internal_Sym *local_syms = NULL;
- 
-+	  if (!is_aarch64_elf (input_bfd)
-+	      || (input_bfd->flags & BFD_LINKER_CREATED) != 0)
-+	    continue;
-+
- 	  /* We'll need the symbol table in a second.  */
- 	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
- 	  if (symtab_hdr->sh_info == 0)
-@@ -4198,6 +4603,9 @@ elfNN_aarch64_size_stubs (bfd *output_bf
- 		    {
- 		      /* The proper stub has already been created.  */
- 		      free (stub_name);
-+		      /* Always update this stub's target since it may have
-+			 changed after layout.  */
-+		      stub_entry->target_value = sym_value + irela->r_addend;
- 		      continue;
- 		    }
- 
-@@ -4249,7 +4657,7 @@ elfNN_aarch64_size_stubs (bfd *output_bf
- 
-   return TRUE;
- 
--error_ret_free_local:
-+ error_ret_free_local:
-   return FALSE;
- }
- 
-@@ -4284,8 +4692,11 @@ elfNN_aarch64_build_stubs (struct bfd_li
- 	return FALSE;
-       stub_sec->size = 0;
- 
-+      /* Add a branch around the stub section, and a nop, to keep it 8 byte
-+	 aligned, as long branch stubs contain a 64-bit address.  */
-       bfd_putl32 (0x14000000 | (size >> 2), stub_sec->contents);
--      stub_sec->size += 4;
-+      bfd_putl32 (INSN_NOP, stub_sec->contents + 4);
-+      stub_sec->size += 8;
-     }
- 
-   /* Build the stubs as directed by the stub hash table.  */
-@@ -4375,21 +4786,67 @@ bfd_elfNN_aarch64_init_maps (bfd *abfd)
-     }
- }
- 
-+static void
-+setup_plt_values (struct bfd_link_info *link_info,
-+		  aarch64_plt_type plt_type)
-+{
-+  struct elf_aarch64_link_hash_table *globals;
-+  globals = elf_aarch64_hash_table (link_info);
-+
-+  if (plt_type == PLT_BTI_PAC)
-+    {
-+      globals->plt0_entry = elfNN_aarch64_small_plt0_bti_entry;
-+
-+      /* Only in ET_EXEC we need PLTn with BTI.  */
-+      if (bfd_link_pde (link_info))
-+	{
-+	  globals->plt_entry_size = PLT_BTI_PAC_SMALL_ENTRY_SIZE;
-+	  globals->plt_entry = elfNN_aarch64_small_plt_bti_pac_entry;
-+	}
-+      else
-+	{
-+	  globals->plt_entry_size = PLT_PAC_SMALL_ENTRY_SIZE;
-+	  globals->plt_entry = elfNN_aarch64_small_plt_pac_entry;
-+	}
-+    }
-+  else if (plt_type == PLT_BTI)
-+    {
-+      globals->plt0_entry = elfNN_aarch64_small_plt0_bti_entry;
-+
-+      /* Only in ET_EXEC we need PLTn with BTI.  */
-+      if (bfd_link_pde (link_info))
-+	{
-+	  globals->plt_entry_size = PLT_BTI_SMALL_ENTRY_SIZE;
-+	  globals->plt_entry = elfNN_aarch64_small_plt_bti_entry;
-+	}
-+    }
-+  else if (plt_type == PLT_PAC)
-+    {
-+      globals->plt_entry_size = PLT_PAC_SMALL_ENTRY_SIZE;
-+      globals->plt_entry = elfNN_aarch64_small_plt_pac_entry;
-+    }
-+}
-+
- /* Set option values needed during linking.  */
- void
- bfd_elfNN_aarch64_set_options (struct bfd *output_bfd,
- 			       struct bfd_link_info *link_info,
- 			       int no_enum_warn,
--			       int no_wchar_warn, int pic_veneer,
-+			       int no_wchar_warn,
-+			       int pic_veneer,
- 			       int fix_erratum_835769,
- 			       int fix_erratum_843419,
--			       int no_apply_dynamic_relocs)
-+			       int no_apply_dynamic_relocs,
-+			       aarch64_bti_pac_info bp_info)
- {
-   struct elf_aarch64_link_hash_table *globals;
- 
-   globals = elf_aarch64_hash_table (link_info);
-   globals->pic_veneer = pic_veneer;
-   globals->fix_erratum_835769 = fix_erratum_835769;
-+  /* If the default options are used, then ERRAT_ADR will be set by default
-+     which will enable the ADRP->ADR workaround for the erratum 843419
-+     workaround.  */
-   globals->fix_erratum_843419 = fix_erratum_843419;
-   globals->fix_erratum_843419_adr = TRUE;
-   globals->no_apply_dynamic_relocs = no_apply_dynamic_relocs;
-@@ -4397,6 +4854,20 @@ bfd_elfNN_aarch64_set_options (struct bf
-   BFD_ASSERT (is_aarch64_elf (output_bfd));
-   elf_aarch64_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
-   elf_aarch64_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
-+
-+  switch (bp_info.bti_type)
-+    {
-+    case BTI_WARN:
-+      elf_aarch64_tdata (output_bfd)->no_bti_warn = 0;
-+      elf_aarch64_tdata (output_bfd)->gnu_and_prop
-+	|= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
-+      break;
-+
-+    default:
-+      break;
-+    }
-+  elf_aarch64_tdata (output_bfd)->plt_type = bp_info.plt_type;
-+  setup_plt_values (link_info, bp_info.plt_type);
- }
- 
- static bfd_vma
-@@ -4631,7 +5102,7 @@ aarch64_tls_transition (bfd *input_bfd,
- 			unsigned long r_symndx)
- {
-   bfd_reloc_code_real_type bfd_r_type
--    = elfNN_aarch64_bfd_reloc_from_type (r_type);
-+    = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
- 
-   if (! aarch64_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx))
-     return bfd_r_type;
-@@ -4807,7 +5278,7 @@ make_branch_to_erratum_835769_stub (stru
-   abfd = stub_entry->target_section->owner;
-   if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc))
-     _bfd_error_handler
--      (_("%B: error: Erratum 835769 stub out "
-+      (_("%pB: error: erratum 835769 stub out "
- 	 "of range (input file too large)"), abfd);
- 
-   target = stub_entry->target_value;
-@@ -4847,15 +5318,21 @@ _bfd_aarch64_erratum_843419_branch_to_st
-       || stub_entry->stub_type != aarch64_stub_erratum_843419_veneer)
-     return TRUE;
- 
--  insn = bfd_getl32 (contents + stub_entry->target_value);
--  bfd_putl32 (insn,
--	      stub_entry->stub_sec->contents + stub_entry->stub_offset);
-+  /* Only update the stub section if we have one.  We should always have one if
-+     we're allowed to use the ADRP errata workaround, otherwise it is not
-+     required.  */
-+  if (stub_entry->stub_sec)
-+    {
-+      insn = bfd_getl32 (contents + stub_entry->target_value);
-+      bfd_putl32 (insn,
-+		  stub_entry->stub_sec->contents + stub_entry->stub_offset);
-+    }
- 
-   place = (section->output_section->vma + section->output_offset
- 	   + stub_entry->adrp_offset);
-   insn = bfd_getl32 (contents + stub_entry->adrp_offset);
- 
--  if ((insn & AARCH64_ADRP_OP_MASK) !=  AARCH64_ADRP_OP)
-+  if (!_bfd_aarch64_adrp_p (insn))
-     abort ();
- 
-   bfd_signed_vma imm =
-@@ -4869,6 +5346,8 @@ _bfd_aarch64_erratum_843419_branch_to_st
-       insn = (_bfd_aarch64_reencode_adr_imm (AARCH64_ADR_OP, imm)
- 	      | AARCH64_RT (insn));
-       bfd_putl32 (insn, contents + stub_entry->adrp_offset);
-+      /* Stub is not needed, don't map it out.  */
-+      stub_entry->stub_type = aarch64_stub_none;
-     }
-   else
-     {
-@@ -4888,7 +5367,7 @@ _bfd_aarch64_erratum_843419_branch_to_st
-       abfd = stub_entry->target_section->owner;
-       if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc))
- 	_bfd_error_handler
--	  (_("%B: error: Erratum 843419 stub out "
-+	  (_("%pB: error: erratum 843419 stub out "
- 	     "of range (input file too large)"), abfd);
- 
-       branch_insn = 0x14000000;
-@@ -4952,6 +5431,17 @@ aarch64_relocation_aginst_gp_p (bfd_relo
- 	  || reloc == BFD_RELOC_AARCH64_MOVW_GOTOFF_G1);
- }
- 
-+/* Extracted from linker.c.  */
-+/* Return TRUE if the symbol described by a linker hash entry H
-+   is going to be absolute.  Linker-script defined symbols can be
-+   converted from absolute to section-relative ones late in the
-+   link.  Use this macro to correctly determine whether the symbol
-+   will actually end up absolute in output.  */
-+#define bfd_is_abs_symbol(H) \
-+  (((H)->type == bfd_link_hash_defined \
-+    || (H)->type == bfd_link_hash_defweak) \
-+   && bfd_is_abs_section ((H)->u.def.section))
-+
- /* Perform a relocation as part of a final link.  The input relocation type
-    should be TLS relaxed.  */
- 
-@@ -4985,6 +5475,7 @@ elfNN_aarch64_final_link_relocate (reloc
-   asection *base_got;
-   bfd_vma orig_value = value;
-   bfd_boolean resolved_to_zero;
-+  bfd_boolean abs_symbol_p;
- 
-   globals = elf_aarch64_hash_table (info);
- 
-@@ -5004,12 +5495,13 @@ elfNN_aarch64_final_link_relocate (reloc
- 
-   weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
- 		  : bfd_is_und_section (sym_sec));
-+  abs_symbol_p = h != NULL && bfd_is_abs_symbol (&h->root);
-+
- 
-   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
-      it here if it is defined in a non-shared object.  */
-   if (h != NULL
-       && h->type == STT_GNU_IFUNC
--      && (input_section->flags & SEC_ALLOC)
-       && h->def_regular)
-     {
-       asection *plt;
-@@ -5037,6 +5529,7 @@ elfNN_aarch64_final_link_relocate (reloc
- 	    /* xgettext:c-format */
- 	    (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
- 	     input_bfd, input_section, rel->r_offset, howto->name, name);
-+
- 	  bfd_set_error (bfd_error_bad_value);
- 	  return bfd_reloc_notsupported;
- 	}
-@@ -5050,7 +5543,7 @@ elfNN_aarch64_final_link_relocate (reloc
-       switch (bfd_r_type)
- 	{
- 	default:
--bad_ifunc_reloc:
-+	bad_ifunc_reloc:
- 	  if (h->root.root.string)
- 	    name = h->root.root.string;
- 	  else
-@@ -5058,7 +5551,7 @@ bad_ifunc_reloc:
- 				     NULL);
- 	  _bfd_error_handler
- 	    /* xgettext:c-format */
--	    (_("%B: relocation %s against STT_GNU_IFUNC "
-+	    (_("%pB: relocation %s against STT_GNU_IFUNC "
- 	       "symbol `%s' isn't handled by %s"), input_bfd,
- 	     howto->name, name, __FUNCTION__);
- 	  bfd_set_error (bfd_error_bad_value);
-@@ -5074,9 +5567,9 @@ bad_ifunc_reloc:
- 					 sym, NULL);
- 	      _bfd_error_handler
- 		/* xgettext:c-format */
--		(_("%B: relocation %s against STT_GNU_IFUNC "
--		   "symbol `%s' has non-zero addend: %Ld"),
--		 input_bfd, howto->name, name, rel->r_addend);
-+		(_("%pB: relocation %s against STT_GNU_IFUNC "
-+		   "symbol `%s' has non-zero addend: %ld"),
-+		 input_bfd, howto->name, name, (int64_t) rel->r_addend);
- 	      bfd_set_error (bfd_error_bad_value);
- 	      return bfd_reloc_notsupported;
- 	    }
-@@ -5130,7 +5623,8 @@ bad_ifunc_reloc:
- 	  /* FALLTHROUGH */
- 	case BFD_RELOC_AARCH64_CALL26:
- 	case BFD_RELOC_AARCH64_JUMP26:
--	  value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+	  value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						       place, value,
- 						       signed_addend,
- 						       weak_undef_p);
- 	  return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type,
-@@ -5207,7 +5701,8 @@ bad_ifunc_reloc:
- 	    addend = (globals->root.sgot->output_section->vma
- 		      + globals->root.sgot->output_offset);
- 
--	  value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+	  value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						       place, value,
- 						       addend, weak_undef_p);
- 	  return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type, howto, value);
- 	case BFD_RELOC_AARCH64_ADD_LO12:
-@@ -5276,6 +5771,12 @@ bad_ifunc_reloc:
- 	      skip = TRUE;
- 	      relocate = TRUE;
- 	    }
-+	  else if (abs_symbol_p)
-+	    {
-+	      /* Local absolute symbol.  */
-+	      skip = (h->forced_local || (h->dynindx == -1));
-+	      relocate = skip;
-+	    }
- 
- 	  outrel.r_offset += (input_section->output_section->vma
- 			      + input_section->output_offset);
-@@ -5285,8 +5786,7 @@ bad_ifunc_reloc:
- 	  else if (h != NULL
- 		   && h->dynindx != -1
- 		   && (!bfd_link_pic (info)
--		       || !(bfd_link_pie (info)
--			    || SYMBOLIC_BIND (info, h))
-+		       || !(bfd_link_pie (info) || SYMBOLIC_BIND (info, h))
- 		       || !h->def_regular))
- 	    outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
- 	  else
-@@ -5380,7 +5880,8 @@ bad_ifunc_reloc:
- 	    signed_addend = 0;
- 	  }
-       }
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   signed_addend, weak_undef_p);
-       *unresolved_reloc_p = FALSE;
-       break;
-@@ -5392,6 +5893,13 @@ bad_ifunc_reloc:
-     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
-     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
-     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G3:
-       if (bfd_link_pic (info)
- 	  && (input_section->flags & SEC_ALLOC) != 0
- 	  && (input_section->flags & SEC_READONLY) != 0
-@@ -5401,7 +5909,7 @@ bad_ifunc_reloc:
- 
- 	  _bfd_error_handler
- 	    /* xgettext:c-format */
--	    (_("%B: relocation %s against symbol `%s' which may bind "
-+	    (_("%pB: relocation %s against symbol `%s' which may bind "
- 	       "externally can not be used when making a shared object; "
- 	       "recompile with -fPIC"),
- 	     input_bfd, elfNN_aarch64_howto_table[howto_index].name,
-@@ -5409,6 +5917,23 @@ bad_ifunc_reloc:
- 	  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:
-@@ -5416,7 +5941,6 @@ bad_ifunc_reloc:
-     case BFD_RELOC_AARCH64_32:
- #endif
-     case BFD_RELOC_AARCH64_ADD_LO12:
--    case BFD_RELOC_AARCH64_BRANCH19:
-     case BFD_RELOC_AARCH64_LDST128_LO12:
-     case BFD_RELOC_AARCH64_LDST16_LO12:
-     case BFD_RELOC_AARCH64_LDST32_LO12:
-@@ -5432,8 +5956,8 @@ bad_ifunc_reloc:
-     case BFD_RELOC_AARCH64_MOVW_G2_NC:
-     case BFD_RELOC_AARCH64_MOVW_G2_S:
-     case BFD_RELOC_AARCH64_MOVW_G3:
--    case BFD_RELOC_AARCH64_TSTBR14:
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   signed_addend, weak_undef_p);
-       break;
- 
-@@ -5478,7 +6002,8 @@ bad_ifunc_reloc:
- 	  if (aarch64_relocation_aginst_gp_p (bfd_r_type))
- 	    addend = (globals->root.sgot->output_section->vma
- 		      + globals->root.sgot->output_offset);
--	  value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+	  value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						       place, value,
- 						       addend, weak_undef_p);
- 	}
-       else
-@@ -5492,7 +6017,7 @@ bad_ifunc_reloc:
- 	    int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
- 	    _bfd_error_handler
- 	      /* xgettext:c-format */
--	      (_("%B: Local symbol descriptor table be NULL when applying "
-+	      (_("%pB: local symbol descriptor table be NULL when applying "
- 		 "relocation %s against local symbol"),
- 	       input_bfd, elfNN_aarch64_howto_table[howto_index].name);
- 	    abort ();
-@@ -5525,7 +6050,8 @@ bad_ifunc_reloc:
- 	if (aarch64_relocation_aginst_gp_p (bfd_r_type))
- 	  addend = base_got->output_section->vma + base_got->output_offset;
- 
--	value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+	value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						     place, value,
- 						     addend, weak_undef_p);
-       }
- 
-@@ -5562,7 +6088,8 @@ bad_ifunc_reloc:
- 	       + globals->root.sgot->output_section->vma
- 	       + globals->root.sgot->output_offset);
- 
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   0, weak_undef_p);
-       *unresolved_reloc_p = FALSE;
-       break;
-@@ -5575,7 +6102,8 @@ bad_ifunc_reloc:
- 	return bfd_reloc_notsupported;
- 
-       value = symbol_got_offset (input_bfd, h, r_symndx);
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   0, weak_undef_p);
-       *unresolved_reloc_p = FALSE;
-       break;
-@@ -5596,24 +6124,64 @@ bad_ifunc_reloc:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
--						   signed_addend - dtpoff_base (info),
--						   weak_undef_p);
--      break;
-+      {
-+	if (!(weak_undef_p || elf_hash_table (info)->tls_sec))
-+	  {
-+	    int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
-+	    _bfd_error_handler
-+	      /* xgettext:c-format */
-+	      (_("%pB: TLS relocation %s against undefined symbol `%s'"),
-+		 input_bfd, elfNN_aarch64_howto_table[howto_index].name,
-+		 h->root.root.string);
-+	    bfd_set_error (bfd_error_bad_value);
-+	    return bfd_reloc_notsupported;
-+	  }
-+
-+	bfd_vma def_value
-+	  = weak_undef_p ? 0 : signed_addend - dtpoff_base (info);
-+	value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						     place, value,
-+						     def_value, weak_undef_p);
-+	break;
-+      }
- 
-     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
-     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
-     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
-     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
-     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
-     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
-     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
--						   signed_addend - tpoff_base (info),
--						   weak_undef_p);
--      *unresolved_reloc_p = FALSE;
--      break;
-+      {
-+	if (!(weak_undef_p || elf_hash_table (info)->tls_sec))
-+	  {
-+	    int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
-+	    _bfd_error_handler
-+	      /* xgettext:c-format */
-+	      (_("%pB: TLS relocation %s against undefined symbol `%s'"),
-+		 input_bfd, elfNN_aarch64_howto_table[howto_index].name,
-+		 h->root.root.string);
-+	    bfd_set_error (bfd_error_bad_value);
-+	    return bfd_reloc_notsupported;
-+	  }
-+
-+	bfd_vma def_value
-+	  = weak_undef_p ? 0 : signed_addend - tpoff_base (info);
-+	value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						     place, value,
-+						     def_value, weak_undef_p);
-+        *unresolved_reloc_p = FALSE;
-+	break;
-+      }
- 
-     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
-     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
-@@ -5628,7 +6196,8 @@ bad_ifunc_reloc:
- 	       + globals->root.sgotplt->output_offset
- 	       + globals->sgotplt_jump_table_size);
- 
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   0, weak_undef_p);
-       *unresolved_reloc_p = FALSE;
-       break;
-@@ -5646,7 +6215,8 @@ bad_ifunc_reloc:
-       value -= (globals->root.sgot->output_section->vma
- 		+ globals->root.sgot->output_offset);
- 
--      value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
-+      value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type,
-+						   place, value,
- 						   0, weak_undef_p);
-       *unresolved_reloc_p = FALSE;
-       break;
-@@ -5695,6 +6265,64 @@ bad_ifunc_reloc:
- # define movz_hw_R0	(0x52c00000)
- #endif
- 
-+/* Structure to hold payload for _bfd_aarch64_erratum_843419_clear_stub,
-+   it is used to identify the stub information to reset.  */
-+
-+struct erratum_843419_branch_to_stub_clear_data
-+{
-+  bfd_vma adrp_offset;
-+  asection *output_section;
-+};
-+
-+/* Clear the erratum information for GEN_ENTRY if the ADRP_OFFSET and
-+   section inside IN_ARG matches.  The clearing is done by setting the
-+   stub_type to none.  */
-+
-+static bfd_boolean
-+_bfd_aarch64_erratum_843419_clear_stub (struct bfd_hash_entry *gen_entry,
-+					void *in_arg)
-+{
-+  struct elf_aarch64_stub_hash_entry *stub_entry
-+    = (struct elf_aarch64_stub_hash_entry *) gen_entry;
-+  struct erratum_843419_branch_to_stub_clear_data *data
-+    = (struct erratum_843419_branch_to_stub_clear_data *) in_arg;
-+
-+  if (stub_entry->target_section != data->output_section
-+      || stub_entry->stub_type != aarch64_stub_erratum_843419_veneer
-+      || stub_entry->adrp_offset != data->adrp_offset)
-+    return TRUE;
-+
-+  /* Change the stub type instead of removing the entry, removing from the hash
-+     table would be slower and we have already reserved the memory for the entry
-+     so there wouldn't be much gain.  Changing the stub also keeps around a
-+     record of what was there before.  */
-+  stub_entry->stub_type = aarch64_stub_none;
-+
-+  /* We're done and there could have been only one matching stub at that
-+     particular offset, so abort further traversal.  */
-+  return FALSE;
-+}
-+
-+/* TLS Relaxations may relax an adrp sequence that matches the erratum 843419
-+   sequence.  In this case the erratum no longer applies and we need to remove
-+   the entry from the pending stub generation.  This clears matching adrp insn
-+   at ADRP_OFFSET in INPUT_SECTION in the stub table defined in GLOBALS.  */
-+
-+static void
-+clear_erratum_843419_entry (struct elf_aarch64_link_hash_table *globals,
-+			    bfd_vma adrp_offset, asection *input_section)
-+{
-+  if (globals->fix_erratum_843419)
-+    {
-+      struct erratum_843419_branch_to_stub_clear_data data;
-+      data.adrp_offset = adrp_offset;
-+      data.output_section = input_section;
-+
-+      bfd_hash_traverse (&globals->stub_hash_table,
-+			 _bfd_aarch64_erratum_843419_clear_stub, &data);
-+    }
-+}
-+
- /* Handle TLS relaxations.  Relaxing is possible for symbols that use
-    R_AARCH64_TLSDESC_ADR_{PAGE, LD64_LO12_NC, ADD_LO12_NC} during a static
-    link.
-@@ -5705,8 +6333,9 @@ bad_ifunc_reloc:
- 
- static bfd_reloc_status_type
- elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
--			 bfd *input_bfd, bfd_byte *contents,
--			 Elf_Internal_Rela *rel, struct elf_link_hash_entry *h)
-+			 bfd *input_bfd, asection *input_section,
-+			 bfd_byte *contents, Elf_Internal_Rela *rel,
-+			 struct elf_link_hash_entry *h)
- {
-   bfd_boolean is_local = h == NULL;
-   unsigned int r_type = ELFNN_R_TYPE (rel->r_info);
-@@ -5714,7 +6343,7 @@ elfNN_aarch64_tls_relax (struct elf_aarc
- 
-   BFD_ASSERT (globals && input_bfd && contents && rel);
- 
--  switch (elfNN_aarch64_bfd_reloc_from_type (r_type))
-+  switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
-     {
-     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
-     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
-@@ -5727,6 +6356,9 @@ elfNN_aarch64_tls_relax (struct elf_aarc
- 
- 	     Where R is x for LP64, and w for ILP32.  */
- 	  bfd_putl32 (movz_R0, contents + rel->r_offset);
-+	  /* We have relaxed the adrp into a mov, we may have to clear any
-+	     pending erratum fixes.  */
-+	  clear_erratum_843419_entry (globals, rel->r_offset, input_section);
- 	  return bfd_reloc_continue;
- 	}
-       else
-@@ -6017,6 +6649,9 @@ elfNN_aarch64_tls_relax (struct elf_aarc
- 	{
- 	  insn = bfd_getl32 (contents + rel->r_offset);
- 	  bfd_putl32 (movz_R0 | (insn & 0x1f), contents + rel->r_offset);
-+	  /* We have relaxed the adrp into a mov, we may have to clear any
-+	     pending erratum fixes.  */
-+	  clear_erratum_843419_entry (globals, rel->r_offset, input_section);
- 	}
-       return bfd_reloc_continue;
- 
-@@ -6136,7 +6771,8 @@ elfNN_aarch64_relocate_section (bfd *out
-       r_symndx = ELFNN_R_SYM (rel->r_info);
-       r_type = ELFNN_R_TYPE (rel->r_info);
- 
--      howto = bfd_reloc.howto = elfNN_aarch64_howto_from_type (r_type);
-+      bfd_reloc.howto = elfNN_aarch64_howto_from_type (input_bfd, r_type);
-+      howto = bfd_reloc.howto;
- 
-       if (howto == NULL)
- 	return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
-@@ -6206,7 +6842,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 	  name = (bfd_elf_string_from_elf_section
- 		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
- 	  if (name == NULL || *name == '\0')
--	    name = bfd_section_name (input_bfd, sec);
-+	    name = bfd_section_name (NULL, sec);
- 	}
- 
-       if (r_symndx != 0
-@@ -6220,11 +6856,11 @@ elfNN_aarch64_relocate_section (bfd *out
- 	  _bfd_error_handler
- 	    ((sym_type == STT_TLS
- 	      /* xgettext:c-format */
--	      ? _("%B(%A+%#Lx): %s used with TLS symbol %s")
-+	      ? _("%pB(%pA+%#lx): %s used with TLS symbol %s")
- 	      /* xgettext:c-format */
--	      : _("%B(%A+%#Lx): %s used with non-TLS symbol %s")),
-+	      : _("%pB(%pA+%#lx): %s used with non-TLS symbol %s")),
- 	     input_bfd,
--	     input_section, rel->r_offset, howto->name, name);
-+	     input_section, (uint64_t) rel->r_offset, howto->name, name);
- 	}
- 
-       /* We relax only if we can see that there can be a valid transition
-@@ -6240,7 +6876,8 @@ elfNN_aarch64_relocate_section (bfd *out
- 	  howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type);
- 	  BFD_ASSERT (howto != NULL);
- 	  r_type = howto->type;
--	  r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h);
-+	  r = elfNN_aarch64_tls_relax (globals, input_bfd, input_section,
-+				       contents, rel, h);
- 	  unresolved_reloc = 0;
- 	}
-       else
-@@ -6264,7 +6901,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 					       h, &unresolved_reloc,
- 					       save_addend, &addend, sym);
- 
--      switch (elfNN_aarch64_bfd_reloc_from_type (r_type))
-+      switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
- 	{
- 	case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
- 	case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
-@@ -6307,7 +6944,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 		  bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
- 
- 		  bfd_reloc_code_real_type real_type =
--		    elfNN_aarch64_bfd_reloc_from_type (r_type);
-+		    elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
- 
- 		  if (real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21
- 		      || real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21
-@@ -6492,8 +7129,9 @@ elfNN_aarch64_relocate_section (bfd *out
- 	{
- 	  _bfd_error_handler
- 	    /* xgettext:c-format */
--	    (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
--	     input_bfd, input_section, rel->r_offset, howto->name,
-+	    (_("%pB(%pA+%#lx): "
-+	       "unresolvable %s relocation against symbol `%s'"),
-+	     input_bfd, input_section, (uint64_t) rel->r_offset, howto->name,
- 	     h->root.root.string);
- 	  return FALSE;
- 	}
-@@ -6501,7 +7139,7 @@ elfNN_aarch64_relocate_section (bfd *out
-       if (r != bfd_reloc_ok && r != bfd_reloc_continue)
- 	{
- 	  bfd_reloc_code_real_type real_r_type
--	    = elfNN_aarch64_bfd_reloc_from_type (r_type);
-+	    = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
- 
- 	  switch (r)
- 	    {
-@@ -6514,7 +7152,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 		{
- 		  (*info->callbacks->warning)
- 		    (info,
--		     _("Too many GOT entries for -fpic, "
-+		     _("too many GOT entries for -fpic, "
- 		       "please recompile with -fPIC"),
- 		     name, input_bfd, input_section, rel->r_offset);
- 		  return FALSE;
-@@ -6532,7 +7170,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 
- 		 Try to catch this situation here and provide a more helpful
- 		 error message to the user.  */
--	      if (addend & ((1 << howto->rightshift) - 1)
-+	      if (addend & (((bfd_vma) 1 << howto->rightshift) - 1)
- 		  /* FIXME: Are we testing all of the appropriate reloc
- 		     types here ?  */
- 		  && (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL
-@@ -6544,7 +7182,7 @@ elfNN_aarch64_relocate_section (bfd *out
- 		  info->callbacks->warning
- 		    (info, _("One possible cause of this error is that the \
- symbol is being referenced in the indicated code as if it had a larger \
--alignment than was declared where it was defined."),
-+alignment than was declared where it was defined"),
- 		     name, input_bfd, input_section, rel->r_offset);
- 		}
- 	      break;
-@@ -6687,7 +7325,7 @@ elfNN_aarch64_merge_private_bfd_data (bf
- 
-       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
- 	{
--	  if ((bfd_get_section_flags (ibfd, sec)
-+	  if ((bfd_get_section_flags (NULL, sec)
- 	       & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
- 	      == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
- 	    only_data_sections = FALSE;
-@@ -6721,33 +7359,16 @@ elfNN_aarch64_print_private_bfd_data (bf
-      containing valid data.  */
- 
-   /* xgettext:c-format */
--  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
-+  fprintf (file, _("private flags = 0x%lx:"), elf_elfheader (abfd)->e_flags);
- 
-   if (flags)
--    fprintf (file, _("<Unrecognised flag bits set>"));
-+    fprintf (file, _(" <Unrecognised flag bits set>"));
- 
-   fputc ('\n', file);
- 
-   return TRUE;
- }
- 
--/* Find dynamic relocs for H that apply to read-only sections.  */
--
--static asection *
--readonly_dynrelocs (struct elf_link_hash_entry *h)
--{
--  struct elf_dyn_relocs *p;
--
--  for (p = elf_aarch64_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
--    {
--      asection *s = p->sec->output_section;
--
--      if (s != NULL && (s->flags & SEC_READONLY) != 0)
--	return p->sec;
--    }
--  return NULL;
--}
--
- /* Return true if we need copy relocation against EH.  */
- 
- static bfd_boolean
-@@ -6933,7 +7554,7 @@ aarch64_elf_create_got_section (bfd *abf
- 					  (bed->dynamic_sec_flags
- 					   | SEC_READONLY));
-   if (s == NULL
--      || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
-+      || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
-     return FALSE;
-   htab->srelgot = s;
- 
-@@ -6961,8 +7582,7 @@ aarch64_elf_create_got_section (bfd *abf
-     {
-       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
-       if (s == NULL
--	  || !bfd_set_section_alignment (abfd, s,
--					 bed->s->log_file_align))
-+	  || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
- 	return FALSE;
-       htab->sgotplt = s;
-     }
-@@ -7013,7 +7633,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
-       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
- 	{
- 	  /* xgettext:c-format */
--	  _bfd_error_handler (_("%B: bad symbol index: %d"), abfd, r_symndx);
-+	  _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
- 	  return FALSE;
- 	}
- 
-@@ -7117,8 +7737,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
- 	      if (h != NULL
- 		  /* This is an absolute symbol.  It represents a value instead
- 		     of an address.  */
--		  && ((h->root.type == bfd_link_hash_defined
--		       && bfd_is_abs_section (h->root.u.def.section))
-+		  && (bfd_is_abs_symbol (&h->root)
- 		      /* This is an undefined symbol.  */
- 		      || h->root.type == bfd_link_hash_undefined))
- 		break;
-@@ -7128,7 +7747,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
- 	      int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
- 	      _bfd_error_handler
- 		/* xgettext:c-format */
--		(_("%B: relocation %s against `%s' can not be used when making "
-+		(_("%pB: relocation %s against `%s' can not be used when making "
- 		   "a shared object"),
- 		 abfd, elfNN_aarch64_howto_table[howto_index].name,
- 		 (h) ? h->root.root.string : "a local symbol");
-@@ -7147,7 +7766,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
- 	      int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
- 	      _bfd_error_handler
- 		/* xgettext:c-format */
--		(_("%B: relocation %s against `%s' can not be used when making "
-+		(_("%pB: relocation %s against `%s' can not be used when making "
- 		   "a shared object; recompile with -fPIC"),
- 		 abfd, elfNN_aarch64_howto_table[howto_index].name,
- 		 (h) ? h->root.root.string : "a local symbol");
-@@ -7268,7 +7887,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
- 	    p = *head;
- 	    if (p == NULL || p->sec != sec)
- 	      {
--		bfd_size_type amt = sizeof *p;
-+		size_t amt = sizeof *p;
- 		p = ((struct elf_dyn_relocs *)
- 		     bfd_zalloc (htab->root.dynobj, amt));
- 		if (p == NULL)
-@@ -7318,9 +7937,6 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
- 	case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
- 	case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
- 	case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
--	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
--	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
--	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
- 	  {
- 	    unsigned got_type;
- 	    unsigned old_got_type;
-@@ -7417,116 +8033,43 @@ elfNN_aarch64_is_target_special_symbol (
- 					     BFD_AARCH64_SPECIAL_SYM_TYPE_ANY);
- }
- 
--/* This is a copy of elf_find_function () from elf.c except that
--   AArch64 mapping symbols are ignored when looking for function names.  */
--
--static bfd_boolean
--aarch64_elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
--			   asymbol **symbols,
--			   asection *section,
--			   bfd_vma offset,
--			   const char **filename_ptr,
--			   const char **functionname_ptr)
--{
--  const char *filename = NULL;
--  asymbol *func = NULL;
--  bfd_vma low_func = 0;
--  asymbol **p;
--
--  for (p = symbols; *p != NULL; p++)
--    {
--      elf_symbol_type *q;
--
--      q = (elf_symbol_type *) * p;
-+/* If the ELF symbol SYM might be a function in SEC, return the
-+   function size and set *CODE_OFF to the function's entry point,
-+   otherwise return zero.  */
-+
-+static bfd_size_type
-+elfNN_aarch64_maybe_function_sym (const asymbol *sym, asection *sec,
-+				  bfd_vma *code_off)
-+{
-+  bfd_size_type size;
-+
-+  if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
-+		     | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
-+      || sym->section != sec)
-+    return 0;
- 
--      switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
--	{
--	default:
--	  break;
--	case STT_FILE:
--	  filename = bfd_asymbol_name (&q->symbol);
--	  break;
-+  if (!(sym->flags & BSF_SYNTHETIC))
-+    switch (ELF_ST_TYPE (((elf_symbol_type *) sym)->internal_elf_sym.st_info))
-+      {
- 	case STT_FUNC:
- 	case STT_NOTYPE:
--	  /* Skip mapping symbols.  */
--	  if ((q->symbol.flags & BSF_LOCAL)
--	      && (bfd_is_aarch64_special_symbol_name
--		  (q->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY)))
--	    continue;
--	  /* Fall through.  */
--	  if (bfd_get_section (&q->symbol) == section
--	      && q->symbol.value >= low_func && q->symbol.value <= offset)
--	    {
--	      func = (asymbol *) q;
--	      low_func = q->symbol.value;
--	    }
- 	  break;
--	}
--    }
--
--  if (func == NULL)
--    return FALSE;
--
--  if (filename_ptr)
--    *filename_ptr = filename;
--  if (functionname_ptr)
--    *functionname_ptr = bfd_asymbol_name (func);
--
--  return TRUE;
--}
--
--
--/* Find the nearest line to a particular section and offset, for error
--   reporting.   This code is a duplicate of the code in elf.c, except
--   that it uses aarch64_elf_find_function.  */
--
--static bfd_boolean
--elfNN_aarch64_find_nearest_line (bfd *abfd,
--				 asymbol **symbols,
--				 asection *section,
--				 bfd_vma offset,
--				 const char **filename_ptr,
--				 const char **functionname_ptr,
--				 unsigned int *line_ptr,
--				 unsigned int *discriminator_ptr)
--{
--  bfd_boolean found = FALSE;
--
--  if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
--				     filename_ptr, functionname_ptr,
--				     line_ptr, discriminator_ptr,
--				     dwarf_debug_sections, 0,
--				     &elf_tdata (abfd)->dwarf2_find_line_info))
--    {
--      if (!*functionname_ptr)
--	aarch64_elf_find_function (abfd, symbols, section, offset,
--				   *filename_ptr ? NULL : filename_ptr,
--				   functionname_ptr);
--
--      return TRUE;
--    }
--
--  /* Skip _bfd_dwarf1_find_nearest_line since no known AArch64
--     toolchain uses DWARF1.  */
--
--  if (!_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
--					    &found, filename_ptr,
--					    functionname_ptr, line_ptr,
--					    &elf_tdata (abfd)->line_info))
--    return FALSE;
--
--  if (found && (*functionname_ptr || *line_ptr))
--    return TRUE;
--
--  if (symbols == NULL)
--    return FALSE;
-+	default:
-+	  return 0;
-+      }
- 
--  if (!aarch64_elf_find_function (abfd, symbols, section, offset,
--				  filename_ptr, functionname_ptr))
--    return FALSE;
-+  if ((sym->flags & BSF_LOCAL)
-+      && bfd_is_aarch64_special_symbol_name (sym->name,
-+					     BFD_AARCH64_SPECIAL_SYM_TYPE_ANY))
-+    return 0;
- 
--  *line_ptr = 0;
--  return TRUE;
-+  *code_off = sym->value;
-+  size = 0;
-+  if (!(sym->flags & BSF_SYNTHETIC))
-+    size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
-+  if (size == 0)
-+    size = 1;
-+  return size;
- }
- 
- static bfd_boolean
-@@ -7542,19 +8085,6 @@ elfNN_aarch64_find_inliner_info (bfd *ab
-   return found;
- }
- 
--
--static void
--elfNN_aarch64_post_process_headers (bfd *abfd,
--				    struct bfd_link_info *link_info)
--{
--  Elf_Internal_Ehdr *i_ehdrp;	/* ELF file header, internal form.  */
--
--  i_ehdrp = elf_elfheader (abfd);
--  i_ehdrp->e_ident[EI_ABIVERSION] = AARCH64_ELF_ABI_VERSION;
--
--  _bfd_elf_post_process_headers (abfd, link_info);
--}
--
- static enum elf_reloc_type_class
- elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
- 				const asection *rel_sec ATTRIBUTE_UNUSED,
-@@ -7579,7 +8109,7 @@ elfNN_aarch64_reloc_type_class (const st
- 				       0, &sym))
- 	    {
- 	      /* xgettext:c-format */
--	      _bfd_error_handler (_("%B symbol number %lu references"
-+	      _bfd_error_handler (_("%pB symbol number %lu references"
- 				    " nonexistent SHT_SYMTAB_SHNDX section"),
- 				    abfd, r_symndx);
- 	      /* Ideally an error class should be returned here.  */
-@@ -7830,6 +8360,8 @@ aarch64_map_one_stub (struct bfd_hash_en
-       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
- 	return FALSE;
-       break;
-+    case aarch64_stub_none:
-+      break;
- 
-     default:
-       abort ();
-@@ -7907,7 +8439,7 @@ elfNN_aarch64_new_section_hook (bfd *abf
-   if (!sec->used_by_bfd)
-     {
-       _aarch64_elf_section_data *sdata;
--      bfd_size_type amt = sizeof (*sdata);
-+      size_t amt = sizeof (*sdata);
- 
-       sdata = bfd_zalloc (abfd, amt);
-       if (sdata == NULL)
-@@ -8035,7 +8567,7 @@ elfNN_aarch64_allocate_dynrelocs (struct
- 	  /* Make room for this entry. For now we only create the
- 	     small model PLT entries. We later need to find a way
- 	     of relaxing into these from the large model PLT entries.  */
--	  s->size += PLT_SMALL_ENTRY_SIZE;
-+	  s->size += htab->plt_entry_size;
- 
- 	  /* We also need to make an entry in the .got.plt section, which
- 	     will be placed in the .got section by the linker script.  */
-@@ -8063,7 +8595,6 @@ elfNN_aarch64_allocate_dynrelocs (struct
- 	     variant PCS symbols are present.  */
- 	  if (h->other & STO_AARCH64_VARIANT_PCS)
- 	    htab->variant_pcs = 1;
--
- 	}
-       else
- 	{
-@@ -8296,7 +8827,6 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (
- 
-   info = (struct bfd_link_info *) inf;
-   htab = elf_aarch64_hash_table (info);
--
-   eh = (struct elf_aarch64_link_hash_entry *) h;
- 
-   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
-@@ -8304,7 +8834,7 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (
-   if (h->type == STT_GNU_IFUNC
-       && h->def_regular)
-     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
--					       &eh->dyn_relocs,
-+					       & eh->dyn_relocs,
- 					       NULL,
- 					       htab->plt_entry_size,
- 					       htab->plt_header_size,
-@@ -8314,10 +8844,10 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (
- }
- 
- /* Allocate space in .plt, .got and associated reloc sections for
--   local dynamic relocs.  */
-+   local ifunc dynamic relocs.  */
- 
- static bfd_boolean
--elfNN_aarch64_allocate_local_dynrelocs (void **slot, void *inf)
-+elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf)
- {
-   struct elf_link_hash_entry *h
-     = (struct elf_link_hash_entry *) *slot;
-@@ -8329,26 +8859,24 @@ elfNN_aarch64_allocate_local_dynrelocs (
-       || h->root.type != bfd_link_hash_defined)
-     abort ();
- 
--  return elfNN_aarch64_allocate_dynrelocs (h, inf);
-+  return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf);
- }
- 
--/* Allocate space in .plt, .got and associated reloc sections for
--   local ifunc dynamic relocs.  */
-+/* Find dynamic relocs for H that apply to read-only sections.  */
- 
--static bfd_boolean
--elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf)
-+static asection *
-+readonly_dynrelocs (struct elf_link_hash_entry *h)
- {
--  struct elf_link_hash_entry *h
--    = (struct elf_link_hash_entry *) *slot;
-+  struct elf_dyn_relocs *p;
- 
--  if (h->type != STT_GNU_IFUNC
--      || !h->def_regular
--      || !h->ref_regular
--      || !h->forced_local
--      || h->root.type != bfd_link_hash_defined)
--    abort ();
-+  for (p = elf_aarch64_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
-+    {
-+      asection *s = p->sec->output_section;
- 
--  return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf);
-+      if (s != NULL && (s->flags & SEC_READONLY) != 0)
-+	return p->sec;
-+    }
-+  return NULL;
- }
- 
- /* Set DF_TEXTREL if we find any dynamic relocs that apply to
-@@ -8378,6 +8906,12 @@ maybe_set_textrel (struct elf_link_hash_
-   return TRUE;
- }
- 
-+static inline bfd_boolean
-+startswith (const char *str, const char *prefix)
-+{
-+  return strncmp (str, prefix, strlen (prefix)) == 0;
-+}
-+
- /* This is the most important function of all . Innocuosly named
-    though !  */
- 
-@@ -8519,11 +9053,6 @@ elfNN_aarch64_size_dynamic_sections (bfd
-   elf_link_hash_traverse (&htab->root, elfNN_aarch64_allocate_ifunc_dynrelocs,
- 			  info);
- 
--  /* Allocate .plt and .got entries, and space for local symbols.  */
--  htab_traverse (htab->loc_hash_table,
--		 elfNN_aarch64_allocate_local_dynrelocs,
--		 info);
--
-   /* Allocate .plt and .got entries, and space for local ifunc symbols.  */
-   htab_traverse (htab->loc_hash_table,
- 		 elfNN_aarch64_allocate_local_ifunc_dynrelocs,
-@@ -8541,15 +9070,17 @@ elfNN_aarch64_size_dynamic_sections (bfd
-   if (htab->tlsdesc_plt)
-     {
-       if (htab->root.splt->size == 0)
--	htab->root.splt->size += PLT_ENTRY_SIZE;
--
--      htab->tlsdesc_plt = htab->root.splt->size;
--      htab->root.splt->size += PLT_TLSDESC_ENTRY_SIZE;
-+	htab->root.splt->size += htab->plt_header_size;
- 
-       /* If we're not using lazy TLS relocations, don't generate the
--	 GOT entry required.  */
--      if (!(info->flags & DF_BIND_NOW))
-+	 GOT and PLT entry required.  */
-+      if ((info->flags & DF_BIND_NOW))
-+	htab->tlsdesc_plt = 0;
-+      else
- 	{
-+	  htab->tlsdesc_plt = htab->root.splt->size;
-+	  htab->root.splt->size += htab->tlsdesc_plt_entry_size;
-+
- 	  htab->dt_tlsdesc_got = htab->root.sgot->size;
- 	  htab->root.sgot->size += GOT_ENTRY_SIZE;
- 	}
-@@ -8584,7 +9115,7 @@ elfNN_aarch64_size_dynamic_sections (bfd
- 	  /* Strip this section if we don't need it; see the
- 	     comment below.  */
- 	}
--      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
-+      else if (startswith (bfd_section_name (NULL, s), ".rela"))
- 	{
- 	  if (s->size != 0 && s != htab->root.srelplt)
- 	    relocs = TRUE;
-@@ -8646,19 +9177,21 @@ elfNN_aarch64_size_dynamic_sections (bfd
- 
-       if (htab->root.splt->size != 0)
- 	{
--	  if (!add_dynamic_entry (DT_PLTGOT, 0)
--	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
--	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
--	      || !add_dynamic_entry (DT_JMPREL, 0))
--	    return FALSE;
--
- 	  if (htab->variant_pcs
- 	      && !add_dynamic_entry (DT_AARCH64_VARIANT_PCS, 0))
- 	    return FALSE;
- 
--	  if (htab->tlsdesc_plt
--	      && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
--		  || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
-+	  if ((elf_aarch64_tdata (output_bfd)->plt_type == PLT_BTI_PAC)
-+	      && (!add_dynamic_entry (DT_AARCH64_BTI_PLT, 0)
-+		  || !add_dynamic_entry (DT_AARCH64_PAC_PLT, 0)))
-+	    return FALSE;
-+
-+	  else if ((elf_aarch64_tdata (output_bfd)->plt_type == PLT_BTI)
-+		   && !add_dynamic_entry (DT_AARCH64_BTI_PLT, 0))
-+	    return FALSE;
-+
-+	  else if ((elf_aarch64_tdata (output_bfd)->plt_type == PLT_PAC)
-+		   && !add_dynamic_entry (DT_AARCH64_PAC_PLT, 0))
- 	    return FALSE;
- 	}
- 
-@@ -8756,7 +9289,13 @@ elfNN_aarch64_create_small_pltn_entry (s
-     gotplt->output_offset + got_offset;
- 
-   /* Copy in the boiler-plate for the PLTn entry.  */
--  memcpy (plt_entry, elfNN_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
-+  memcpy (plt_entry, htab->plt_entry, htab->plt_entry_size);
-+
-+  /* First instruction in BTI enabled PLT stub is a BTI
-+     instruction so skip it.  */
-+  if (elf_aarch64_tdata (output_bfd)->plt_type & PLT_BTI
-+      && elf_elfheader (output_bfd)->e_type == ET_EXEC)
-+    plt_entry = plt_entry + 4;
- 
-   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
-      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
-@@ -8974,7 +9513,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd
- 	}
-       else
- 	{
--do_glob_dat:
-+	do_glob_dat:
- 	  BFD_ASSERT ((h->got.offset & 1) == 0);
- 	  bfd_put_NN (output_bfd, (bfd_vma) 0,
- 		      htab->root.sgot->contents + h->got.offset);
-@@ -9061,10 +9600,13 @@ elfNN_aarch64_init_small_plt0_entry (bfd
-   bfd_vma plt_base;
- 
- 
--  memcpy (htab->root.splt->contents, elfNN_aarch64_small_plt0_entry,
--	  PLT_ENTRY_SIZE);
--  elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize =
--    PLT_ENTRY_SIZE;
-+  memcpy (htab->root.splt->contents, htab->plt0_entry,
-+	  htab->plt_header_size);
-+
-+  /* PR 26312: Explicitly set the sh_entsize to 0 so that
-+     consumers do not think that the section contains fixed
-+     sized objects.  */
-+  elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize = 0;
- 
-   plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma
- 		  + htab->root.sgotplt->output_offset
-@@ -9073,18 +9615,24 @@ elfNN_aarch64_init_small_plt0_entry (bfd
-   plt_base = htab->root.splt->output_section->vma +
-     htab->root.splt->output_offset;
- 
-+  /* First instruction in BTI enabled PLT stub is a BTI
-+     instruction so skip it.  */
-+  bfd_byte *plt0_entry = htab->root.splt->contents;
-+  if (elf_aarch64_tdata (output_bfd)->plt_type & PLT_BTI)
-+    plt0_entry = plt0_entry + 4;
-+
-   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
-      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
-   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADR_HI21_PCREL,
--				htab->root.splt->contents + 4,
-+				plt0_entry + 4,
- 				PG (plt_got_2nd_ent) - PG (plt_base + 4));
- 
-   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12,
--				htab->root.splt->contents + 8,
-+				plt0_entry + 8,
- 				PG_OFFSET (plt_got_2nd_ent));
- 
-   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12,
--				htab->root.splt->contents + 12,
-+				plt0_entry + 12,
- 				PG_OFFSET (plt_got_2nd_ent));
- }
- 
-@@ -9144,6 +9692,7 @@ elfNN_aarch64_finish_dynamic_sections (b
- 
- 	    case DT_TLSDESC_GOT:
- 	      s = htab->root.sgot;
-+	      BFD_ASSERT (htab->dt_tlsdesc_got != (bfd_vma)-1);
- 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
- 		+ htab->dt_tlsdesc_got;
- 	      break;
-@@ -9159,23 +9708,29 @@ elfNN_aarch64_finish_dynamic_sections (b
-     {
-       elfNN_aarch64_init_small_plt0_entry (output_bfd, htab);
- 
--      elf_section_data (htab->root.splt->output_section)->
--	this_hdr.sh_entsize = htab->plt_entry_size;
--
--
--      if (htab->tlsdesc_plt)
-+      if (htab->tlsdesc_plt && !(info->flags & DF_BIND_NOW))
- 	{
-+	  BFD_ASSERT (htab->dt_tlsdesc_got != (bfd_vma)-1);
- 	  bfd_put_NN (output_bfd, (bfd_vma) 0,
- 		      htab->root.sgot->contents + htab->dt_tlsdesc_got);
- 
-+	  const bfd_byte *entry = elfNN_aarch64_tlsdesc_small_plt_entry;
-+	  htab->tlsdesc_plt_entry_size = PLT_TLSDESC_ENTRY_SIZE;
-+
-+	  aarch64_plt_type type = elf_aarch64_tdata (output_bfd)->plt_type;
-+	  if (type == PLT_BTI || type == PLT_BTI_PAC)
-+	    {
-+	      entry = elfNN_aarch64_tlsdesc_small_plt_bti_entry;
-+	    }
-+
- 	  memcpy (htab->root.splt->contents + htab->tlsdesc_plt,
--		  elfNN_aarch64_tlsdesc_small_plt_entry,
--		  sizeof (elfNN_aarch64_tlsdesc_small_plt_entry));
-+		  entry, htab->tlsdesc_plt_entry_size);
- 
- 	  {
- 	    bfd_vma adrp1_addr =
- 	      htab->root.splt->output_section->vma
--	      + htab->root.splt->output_offset + htab->tlsdesc_plt + 4;
-+	      + htab->root.splt->output_offset
-+	      + htab->tlsdesc_plt + 4;
- 
- 	    bfd_vma adrp2_addr = adrp1_addr + 4;
- 
-@@ -9192,6 +9747,15 @@ elfNN_aarch64_finish_dynamic_sections (b
- 	    bfd_byte *plt_entry =
- 	      htab->root.splt->contents + htab->tlsdesc_plt;
- 
-+	   /* First instruction in BTI enabled PLT stub is a BTI
-+	      instruction so skip it.  */
-+	    if (type & PLT_BTI)
-+	      {
-+		plt_entry = plt_entry + 4;
-+		adrp1_addr = adrp1_addr + 4;
-+		adrp2_addr = adrp2_addr + 4;
-+	      }
-+
- 	    /* adrp x2, DT_TLSDESC_GOT */
- 	    elf_aarch64_update_plt_entry (output_bfd,
- 					  BFD_RELOC_AARCH64_ADR_HI21_PCREL,
-@@ -9226,7 +9790,7 @@ elfNN_aarch64_finish_dynamic_sections (b
-       if (bfd_is_abs_section (htab->root.sgotplt->output_section))
- 	{
- 	  _bfd_error_handler
--	    (_("discarded output section: `%A'"), htab->root.sgotplt);
-+	    (_("discarded output section: `%pA'"), htab->root.sgotplt);
- 	  return FALSE;
- 	}
- 
-@@ -9270,6 +9834,57 @@ elfNN_aarch64_finish_dynamic_sections (b
-   return TRUE;
- }
- 
-+/* Check if BTI enabled PLTs are needed.  Returns the type needed.  */
-+static aarch64_plt_type
-+get_plt_type (bfd *abfd)
-+{
-+  aarch64_plt_type ret = PLT_NORMAL;
-+  bfd_byte *contents, *extdyn, *extdynend;
-+  asection *sec = bfd_get_section_by_name (abfd, ".dynamic");
-+  if (!sec || !bfd_malloc_and_get_section (abfd, sec, &contents))
-+    return ret;
-+  extdyn = contents;
-+  extdynend = contents + sec->size;
-+  for (; extdyn < extdynend; extdyn += sizeof (ElfNN_External_Dyn))
-+    {
-+      Elf_Internal_Dyn dyn;
-+      bfd_elfNN_swap_dyn_in (abfd, extdyn, &dyn);
-+
-+      /* Let's check the processor specific dynamic array tags.  */
-+      bfd_vma tag = dyn.d_tag;
-+      if (tag < DT_LOPROC || tag > DT_HIPROC)
-+	continue;
-+
-+      switch (tag)
-+	{
-+	case DT_AARCH64_BTI_PLT:
-+	  ret |= PLT_BTI;
-+	  break;
-+
-+	case DT_AARCH64_PAC_PLT:
-+	  ret |= PLT_PAC;
-+	  break;
-+
-+	default: break;
-+	}
-+    }
-+  free (contents);
-+  return ret;
-+}
-+
-+static long
-+elfNN_aarch64_get_synthetic_symtab (bfd *abfd,
-+				    long symcount,
-+				    asymbol **syms,
-+				    long dynsymcount,
-+				    asymbol **dynsyms,
-+				    asymbol **ret)
-+{
-+  elf_aarch64_tdata (abfd)->plt_type = get_plt_type (abfd);
-+  return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
-+					dynsymcount, dynsyms, ret);
-+}
-+
- /* Return address for Ith PLT stub in section PLT, for relocation REL
-    or (bfd_vma) -1 if it should not be included.  */
- 
-@@ -9277,7 +9892,27 @@ static bfd_vma
- elfNN_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
- 			   const arelent *rel ATTRIBUTE_UNUSED)
- {
--  return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
-+  size_t plt0_size = PLT_ENTRY_SIZE;
-+  size_t pltn_size = PLT_SMALL_ENTRY_SIZE;
-+
-+  if (elf_aarch64_tdata (plt->owner)->plt_type == PLT_BTI_PAC)
-+    {
-+      if (elf_elfheader (plt->owner)->e_type == ET_EXEC)
-+	pltn_size = PLT_BTI_PAC_SMALL_ENTRY_SIZE;
-+      else
-+	pltn_size = PLT_PAC_SMALL_ENTRY_SIZE;
-+    }
-+  else if (elf_aarch64_tdata (plt->owner)->plt_type == PLT_BTI)
-+    {
-+      if (elf_elfheader (plt->owner)->e_type == ET_EXEC)
-+	pltn_size = PLT_BTI_SMALL_ENTRY_SIZE;
-+    }
-+  else if (elf_aarch64_tdata (plt->owner)->plt_type == PLT_PAC)
-+    {
-+      pltn_size = PLT_PAC_SMALL_ENTRY_SIZE;
-+    }
-+
-+  return plt->vma + plt0_size + i * pltn_size;
- }
- 
- /* Returns TRUE if NAME is an AArch64 mapping symbol.
-@@ -9323,6 +9958,9 @@ elfNN_aarch64_link_setup_gnu_properties
-   uint32_t prop = elf_aarch64_tdata (info->output_bfd)->gnu_and_prop;
-   bfd *pbfd = _bfd_aarch64_elf_link_setup_gnu_properties (info, &prop);
-   elf_aarch64_tdata (info->output_bfd)->gnu_and_prop = prop;
-+  elf_aarch64_tdata (info->output_bfd)->plt_type
-+    |= (prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) ? PLT_BTI : 0;
-+  setup_plt_values (info, elf_aarch64_tdata (info->output_bfd)->plt_type);
-   return pbfd;
- }
- 
-@@ -9331,14 +9969,38 @@ elfNN_aarch64_link_setup_gnu_properties
-    for the effect of GNU properties of the output_bfd.  */
- static bfd_boolean
- elfNN_aarch64_merge_gnu_properties (struct bfd_link_info *info,
--				    bfd *abfd,
--				    bfd *bbfd ATTRIBUTE_UNUSED,
--				    elf_property *aprop,
--				    elf_property *bprop)
-+				       bfd *abfd, bfd *bbfd,
-+				       elf_property *aprop,
-+				       elf_property *bprop)
- {
-   uint32_t prop
-     = elf_aarch64_tdata (info->output_bfd)->gnu_and_prop;
- 
-+  /* If output has been marked with BTI using command line argument, give out
-+     warning if necessary.  */
-+  /* Properties are merged per type, hence only check for warnings when merging
-+     GNU_PROPERTY_AARCH64_FEATURE_1_AND.  */
-+  if (((aprop && aprop->pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
-+	|| (bprop && bprop->pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND))
-+      && (prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)
-+      && (!elf_aarch64_tdata (info->output_bfd)->no_bti_warn))
-+    {
-+      if ((aprop && !(aprop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI))
-+	   || !aprop)
-+	{
-+	  _bfd_error_handler (_("%pB: warning: BTI turned on by -z force-bti when "
-+				"all inputs do not have BTI in NOTE section."),
-+			      abfd);
-+	}
-+      if ((bprop && !(bprop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI))
-+	   || !bprop)
-+	{
-+	  _bfd_error_handler (_("%pB: warning: BTI turned on by -z force-bti when "
-+				"all inputs do not have BTI in NOTE section."),
-+			      bbfd);
-+	}
-+    }
-+
-   return  _bfd_aarch64_elf_merge_gnu_properties (info, abfd, aprop,
- 						 bprop, prop);
- }
-@@ -9413,8 +10075,8 @@ const struct elf_size_info elfNN_aarch64
- #define bfd_elfNN_find_inliner_info		\
-   elfNN_aarch64_find_inliner_info
- 
--#define bfd_elfNN_find_nearest_line		\
--  elfNN_aarch64_find_nearest_line
-+#define bfd_elfNN_get_synthetic_symtab		\
-+  elfNN_aarch64_get_synthetic_symtab
- 
- #define bfd_elfNN_mkobject			\
-   elfNN_aarch64_mkobject
-@@ -9457,12 +10119,12 @@ const struct elf_size_info elfNN_aarch64
- #define elf_backend_output_arch_local_syms	\
-   elfNN_aarch64_output_arch_local_syms
- 
-+#define elf_backend_maybe_function_sym		\
-+  elfNN_aarch64_maybe_function_sym
-+
- #define elf_backend_plt_sym_val			\
-   elfNN_aarch64_plt_sym_val
- 
--#define elf_backend_post_process_headers	\
--  elfNN_aarch64_post_process_headers
--
- #define elf_backend_relocate_section		\
-   elfNN_aarch64_relocate_section
- 
-diff -rup binutils-2.30/bfd/elfxx-aarch64.c binutils-2.30.new/bfd/elfxx-aarch64.c
---- binutils-2.30/bfd/elfxx-aarch64.c	2021-03-23 16:21:45.925009754 +0000
-+++ binutils-2.30.new/bfd/elfxx-aarch64.c	2021-03-23 16:20:02.829710624 +0000
-@@ -1,5 +1,5 @@
- /* AArch64-specific support for ELF.
--   Copyright (C) 2009-2018 Free Software Foundation, Inc.
-+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
-    Contributed by ARM Ltd.
- 
-    This file is part of BFD, the Binary File Descriptor library.
-@@ -19,10 +19,11 @@
-    see <http://www.gnu.org/licenses/>.  */
- 
- #include "sysdep.h"
-+#include "bfd.h"
-+#include "elf-bfd.h"
- #include "elfxx-aarch64.h"
- #include <stdarg.h>
- #include <string.h>
--#include "libbfd.h"
- 
- #define MASK(n) ((1u << (n)) - 1)
- 
-@@ -286,11 +287,18 @@ _bfd_aarch64_elf_put_addend (bfd *abfd,
-     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
-     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
-       if (old_addend & ((1 << howto->rightshift) - 1))
- 	return bfd_reloc_overflow;
-       /* Used for ldr*|str* rt, [rn, #uimm12] to provide the low order
--	 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL
--	 which computes the (pc-relative) page base.  */
-+	 12 bits address offset.  */
-       contents = reencode_ldst_pos_imm (contents, addend);
-       break;
- 
-@@ -302,6 +310,10 @@ _bfd_aarch64_elf_put_addend (bfd *abfd,
-     case BFD_RELOC_AARCH64_MOVW_G0_S:
-     case BFD_RELOC_AARCH64_MOVW_G1_S:
-     case BFD_RELOC_AARCH64_MOVW_G2_S:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G3:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
-@@ -334,6 +346,9 @@ _bfd_aarch64_elf_put_addend (bfd *abfd,
-     case BFD_RELOC_AARCH64_MOVW_G3:
-     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
-     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
-     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
-     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
-     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
-@@ -380,10 +395,12 @@ _bfd_aarch64_elf_put_addend (bfd *abfd,
- }
- 
- bfd_vma
--_bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type r_type,
-+_bfd_aarch64_elf_resolve_relocation (bfd *input_bfd,
-+				     bfd_reloc_code_real_type r_type,
- 				     bfd_vma place, bfd_vma value,
- 				     bfd_vma addend, bfd_boolean weak_undef_p)
- {
-+  bfd_boolean tls_reloc = TRUE;
-   switch (r_type)
-     {
-     case BFD_RELOC_AARCH64_NONE:
-@@ -396,6 +413,13 @@ _bfd_aarch64_elf_resolve_relocation (bfd
-     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
-     case BFD_RELOC_AARCH64_BRANCH19:
-     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
-+    case BFD_RELOC_AARCH64_MOVW_PREL_G3:
-     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
-     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
-     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
-@@ -424,6 +448,8 @@ _bfd_aarch64_elf_resolve_relocation (bfd
-     case BFD_RELOC_AARCH64_MOVW_G2_NC:
-     case BFD_RELOC_AARCH64_MOVW_G2_S:
-     case BFD_RELOC_AARCH64_MOVW_G3:
-+      tls_reloc = FALSE;
-+      /* fall-through.  */
-     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
-     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
-     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
-@@ -432,18 +458,27 @@ _bfd_aarch64_elf_resolve_relocation (bfd
-     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
-     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
--    case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
--    case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
--    case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
--    case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
-     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
-+      /* Weak Symbols and TLS relocations are implementation defined.  For this
-+	 case we choose to emit 0.  */
-+      if (weak_undef_p && tls_reloc)
-+	{
-+	  _bfd_error_handler (_("%pB: warning: Weak TLS is implementation "
-+				"defined and may not work as expected"),
-+				input_bfd);
-+	  value = place;
-+	}
-       value = value + addend;
-       break;
- 
-@@ -493,7 +528,15 @@ _bfd_aarch64_elf_resolve_relocation (bfd
-     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
-     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
-+    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
-       value = PG_OFFSET (value + addend);
-       break;
- 
-@@ -530,25 +573,6 @@ _bfd_aarch64_elf_resolve_relocation (bfd
-   return value;
- }
- 
--/* Hook called by the linker routine which adds symbols from an object
--   file.  */
--
--bfd_boolean
--_bfd_aarch64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
--				  Elf_Internal_Sym *sym,
--				  const char **namep ATTRIBUTE_UNUSED,
--				  flagword *flagsp ATTRIBUTE_UNUSED,
--				  asection **secp ATTRIBUTE_UNUSED,
--				  bfd_vma *valp ATTRIBUTE_UNUSED)
--{
--  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
--      && (abfd->flags & DYNAMIC) == 0
--      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
--    elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
--
--  return TRUE;
--}
--
- /* Support for core dump NOTE sections.  */
- 
- bfd_boolean
-@@ -631,7 +655,18 @@ _bfd_aarch64_elf_write_core_note (bfd *a
- 	va_start (ap, note_type);
- 	memset (data, 0, sizeof (data));
- 	strncpy (data + 40, va_arg (ap, const char *), 16);
-+#if GCC_VERSION == 8000 || GCC_VERSION == 8001
-+	DIAGNOSTIC_PUSH;
-+	/* GCC 8.0 and 8.1 warn about 80 equals destination size with
-+	   -Wstringop-truncation:
-+	   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
-+	 */
-+	DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
-+#endif
- 	strncpy (data + 56, va_arg (ap, const char *), 80);
-+#if GCC_VERSION == 8000 || GCC_VERSION == 8001
-+	DIAGNOSTIC_POP;
-+#endif
- 	va_end (ap);
- 
- 	return elfcore_write_note (abfd, buf, bufsiz, "CORE",
-@@ -673,6 +708,7 @@ _bfd_aarch64_elf_link_setup_gnu_properti
-   bfd *pbfd;
-   bfd *ebfd = NULL;
-   elf_property *prop;
-+  unsigned align;
- 
-   uint32_t gnu_prop = *gprop;
- 
-@@ -697,6 +733,11 @@ _bfd_aarch64_elf_link_setup_gnu_properti
-       prop = _bfd_elf_get_property (ebfd,
- 				    GNU_PROPERTY_AARCH64_FEATURE_1_AND,
- 				    4);
-+      if (gnu_prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI
-+	  && !(prop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI))
-+	    _bfd_error_handler (_("%pB: warning: BTI turned on by -z force-bti "
-+				  "when all inputs do not have BTI in NOTE "
-+				  "section."), ebfd);
-       prop->u.number |= gnu_prop;
-       prop->pr_kind = property_number;
- 
-@@ -716,6 +757,11 @@ _bfd_aarch64_elf_link_setup_gnu_properti
- 	    info->callbacks->einfo (
- 	      _("%F%P: failed to create GNU property section\n"));
- 
-+          align = (bfd_get_mach (ebfd) & bfd_mach_aarch64_ilp32) ? 2 : 3;
-+	  if (!bfd_set_section_alignment (ebfd, sec, align))
-+	    info->callbacks->einfo (_("%F%pA: failed to align section\n"),
-+				    sec);
-+
- 	  elf_section_type (sec) = SHT_NOTE;
- 	}
-     }
-@@ -836,11 +882,43 @@ _bfd_aarch64_elf_merge_gnu_properties (s
-       break;
- 
-     default:
--      _bfd_error_handler
--	( _("error: %pB: <corrupt AArch64 property note: 0x%x>"),
--	  abfd, pr_type);
--      return FALSE;
-+      abort ();
-     }
- 
-   return updated;
- }
-+
-+/* Fix up AArch64 GNU properties.  */
-+void
-+_bfd_aarch64_elf_link_fixup_gnu_properties
-+  (struct bfd_link_info *info ATTRIBUTE_UNUSED,
-+   elf_property_list **listp)
-+{
-+  elf_property_list *p, *prev;
-+
-+  for (p = *listp, prev = *listp; p; p = p->next)
-+    {
-+      unsigned int type = p->property.pr_type;
-+      if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
-+	{
-+	  if (p->property.pr_kind == property_remove)
-+	    {
-+	      /* Remove empty property.  */
-+	      if (prev == p)
-+		{
-+		  *listp = p->next;
-+		  prev = *listp;
-+		}
-+	      else
-+		  prev->next = p->next;
-+	      continue;
-+	    }
-+	  prev = p;
-+	}
-+      else if (type > GNU_PROPERTY_HIPROC)
-+	{
-+	  /* The property list is sorted in order of type.  */
-+	  break;
-+	}
-+    }
-+}
-diff -rup binutils-2.30/bfd/elfxx-aarch64.h binutils-2.30.new/bfd/elfxx-aarch64.h
---- binutils-2.30/bfd/elfxx-aarch64.h	2021-03-23 16:21:45.652011610 +0000
-+++ binutils-2.30.new/bfd/elfxx-aarch64.h	2021-03-23 16:20:02.830710617 +0000
-@@ -1,5 +1,5 @@
- /* AArch64-specific backend routines.
--   Copyright (C) 2009-2018 Free Software Foundation, Inc.
-+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
-    Contributed by ARM Ltd.
- 
-    This file is part of BFD, the Binary File Descriptor library.
-@@ -18,9 +18,77 @@
-    along with this program; see the file COPYING3. If not,
-    see <http://www.gnu.org/licenses/>.  */
- 
--#include "bfd.h"
--#include "elf-bfd.h"
--#include "stdint.h"
-+#define uint32_t unsigned int
-+#define uint64_t unsigned long
-+
-+extern void bfd_elf64_aarch64_init_maps
-+  (bfd *);
-+
-+extern void bfd_elf32_aarch64_init_maps
-+  (bfd *);
-+
-+/* Types of PLTs based on the level of security.  This would be a
-+   bit-mask to denote which of the combinations of security features
-+   are enabled:
-+   - No security feature PLTs
-+   - PLTs with BTI instruction
-+   - PLTs with PAC instruction
-+*/
-+typedef enum
-+{
-+  PLT_NORMAL	= 0x0,  /* Normal plts.  */
-+  PLT_BTI	= 0x1,  /* plts with bti.  */
-+  PLT_PAC	= 0x2,  /* plts with pointer authentication.  */
-+  PLT_BTI_PAC	= PLT_BTI | PLT_PAC
-+} aarch64_plt_type;
-+
-+/* To indicate if BTI is enabled with/without warning.  */
-+typedef enum
-+{
-+  BTI_NONE	= 0,  /* BTI is not enabled.  */
-+  BTI_WARN	= 1,  /* BTI is enabled with -z force-bti.  */
-+} aarch64_enable_bti_type;
-+
-+/* A structure to encompass all information coming from BTI or PAC
-+   related command line options.  This involves the "PLT_TYPE" to determine
-+   which version of PLTs to pick and "BTI_TYPE" to determine if
-+   BTI should be turned on with any warnings.   */
-+typedef struct
-+{
-+  aarch64_plt_type plt_type;
-+  aarch64_enable_bti_type bti_type;
-+} aarch64_bti_pac_info;
-+
-+extern void bfd_elf64_aarch64_set_options
-+  (bfd *, struct bfd_link_info *, int, int, int, int, int, int,
-+   aarch64_bti_pac_info);
-+
-+extern void bfd_elf32_aarch64_set_options
-+  (bfd *, struct bfd_link_info *, int, int, int, int, int, int,
-+   aarch64_bti_pac_info);
-+
-+/* AArch64 stub generation support for ELF64.  Called from the linker.  */
-+extern int elf64_aarch64_setup_section_lists
-+  (bfd *, struct bfd_link_info *);
-+extern void elf64_aarch64_next_input_section
-+  (struct bfd_link_info *, struct bfd_section *);
-+extern bfd_boolean elf64_aarch64_size_stubs
-+  (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
-+   struct bfd_section * (*) (const char *, struct bfd_section *),
-+   void (*) (void));
-+extern bfd_boolean elf64_aarch64_build_stubs
-+  (struct bfd_link_info *);
-+/* AArch64 stub generation support for ELF32.  Called from the linker.  */
-+extern int elf32_aarch64_setup_section_lists
-+  (bfd *, struct bfd_link_info *);
-+extern void elf32_aarch64_next_input_section
-+  (struct bfd_link_info *, struct bfd_section *);
-+extern bfd_boolean elf32_aarch64_size_stubs
-+  (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
-+   struct bfd_section * (*) (const char *, struct bfd_section *),
-+   void (*) (void));
-+extern bfd_boolean elf32_aarch64_build_stubs
-+  (struct bfd_link_info *);
- 
- /* Take the PAGE component of an address or offset.  */
- #define PG(x)	     ((x) & ~ (bfd_vma) 0xfff)
-@@ -44,13 +112,8 @@ _bfd_aarch64_elf_put_addend (bfd *, bfd_
- 			     reloc_howto_type *, bfd_signed_vma);
- 
- extern bfd_vma
--_bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type, bfd_vma, bfd_vma,
--				     bfd_vma, bfd_boolean);
--
--extern bfd_boolean
--_bfd_aarch64_elf_add_symbol_hook (bfd *, struct bfd_link_info *,
--				  Elf_Internal_Sym *, const char **,
--				  flagword *, asection **, bfd_vma *);
-+_bfd_aarch64_elf_resolve_relocation (bfd *, bfd_reloc_code_real_type, bfd_vma,
-+				     bfd_vma, bfd_vma, bfd_boolean);
- 
- extern bfd_boolean
- _bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *);
-@@ -61,7 +124,6 @@ _bfd_aarch64_elf_grok_psinfo (bfd *, Elf
- extern char *
- _bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...);
- 
--#define elf_backend_add_symbol_hook	_bfd_aarch64_elf_add_symbol_hook
- #define elf_backend_grok_prstatus	_bfd_aarch64_elf_grok_prstatus
- #define elf_backend_grok_psinfo		_bfd_aarch64_elf_grok_psinfo
- #define elf_backend_write_core_note	_bfd_aarch64_elf_write_core_note
-@@ -79,5 +141,12 @@ _bfd_aarch64_elf_merge_gnu_properties (s
- 				       elf_property *, elf_property *,
- 				       uint32_t);
- 
-+extern void
-+_bfd_aarch64_elf_link_fixup_gnu_properties (struct bfd_link_info *,
-+					    elf_property_list **);
-+
- #define elf_backend_parse_gnu_properties	\
-   _bfd_aarch64_elf_parse_gnu_properties
-+
-+#define elf_backend_fixup_gnu_properties	\
-+  _bfd_aarch64_elf_link_fixup_gnu_properties
 diff -rup binutils-2.30/bfd/reloc.c binutils-2.30.new/bfd/reloc.c
 --- binutils-2.30/bfd/reloc.c	2018-01-13 13:31:15.000000000 +0000
 +++ binutils-2.30.new/bfd/reloc.c	2021-03-23 16:20:02.829710624 +0000
@@ -112894,7 +110101,7 @@ diff -rup binutils-2.30/ld/testsuite/ld-aarch64/ifunc-21.d binutils-2.30.new/ld/
  .* <bar>:
   .*:	90000080 	adrp	x0, 10000 <.*>
 - .*:	.* 	ldr	x0, \[x0, #(960|1040)\]
-+ .*:	.* 	ldr	x0, \[x0, #(960|976|1040)\]
++ .*:	.* 	ldr	x0, \[x0, #(896|960|976|1040)\]
   .*:	d65f03c0 	ret
  
 -#pass
@@ -148199,3 +145406,734 @@ diff -rup binutils-2.30/opcodes/aarch64-tbl.h binutils-2.30.new/opcodes/aarch64-
 +
 +movprfx z17, z0
 +fmmla	z17.d,  z21.d,  z27.d
+--- binutils.nickc/bfd/elfnn-aarch64.c	2021-03-25 09:16:15.547456289 +0000
++++ binutils-2.30/bfd/elfnn-aarch64.c	2021-03-25 10:26:47.910494843 +0000
+@@ -201,6 +201,14 @@
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12	\
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12	\
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12	\
++   || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC	\
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0		\
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC	\
+    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1		\
+@@ -617,6 +625,114 @@ static reloc_howto_type elfNN_aarch64_ho
+ 	 0xffff,		/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
+ 
++  /* Group relocations to create a 16, 32, 48 or 64 bit
++     PC relative address inline.  */
++
++  /* MOV[NZ]:   ((S+A-P) >>  0) & 0xffff */
++  HOWTO (AARCH64_R (MOVW_PREL_G0),	/* type */
++	 0,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 17,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_signed,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G0),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOVK:   ((S+A-P) >>  0) & 0xffff [no overflow check] */
++  HOWTO (AARCH64_R (MOVW_PREL_G0_NC),	/* type */
++	 0,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 16,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G0_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOV[NZ]:   ((S+A-P) >> 16) & 0xffff */
++  HOWTO (AARCH64_R (MOVW_PREL_G1),	/* type */
++	 16,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 17,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_signed,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G1),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOVK:   ((S+A-P) >> 16) & 0xffff [no overflow check] */
++  HOWTO64 (AARCH64_R (MOVW_PREL_G1_NC),	/* type */
++	 16,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 16,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G1_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOV[NZ]:   ((S+A-P) >> 32) & 0xffff */
++  HOWTO64 (AARCH64_R (MOVW_PREL_G2),	/* type */
++	 32,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 17,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_signed,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G2),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOVK:   ((S+A-P) >> 32) & 0xffff [no overflow check] */
++  HOWTO64 (AARCH64_R (MOVW_PREL_G2_NC),	/* type */
++	 32,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 16,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G2_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
++  /* MOV[NZ]:   ((S+A-P) >> 48) & 0xffff */
++  HOWTO64 (AARCH64_R (MOVW_PREL_G3),	/* type */
++	 48,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 16,			/* bitsize */
++	 TRUE,			/* pc_relative */
++	 0,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (MOVW_PREL_G3),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffff,		/* src_mask */
++	 0xffff,		/* dst_mask */
++	 TRUE),		/* pcrel_offset */
++
+ /* Relocations to generate 19, 21 and 33 bit PC-relative load/store
+    addresses: PG(x) is (x & ~0xfff).  */
+ 
+@@ -1527,6 +1643,126 @@ static reloc_howto_type elfNN_aarch64_ho
+ 	 0xfff,			/* dst_mask */
+ 	 FALSE),		/* pcrel_offset */
+ 
++  /* LD/ST16: bit[11:1] of byte offset to module TLS base address.  */
++  HOWTO (AARCH64_R (TLSLE_LDST16_TPREL_LO12),	/* type */
++	 1,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 11,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_unsigned,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x1ffc00,		/* src_mask */
++	 0x1ffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12, but no overflow check.  */
++  HOWTO (AARCH64_R (TLSLE_LDST16_TPREL_LO12_NC),	/* type */
++	 1,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 11,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x1ffc00,		/* src_mask */
++	 0x1ffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* LD/ST32: bit[11:2] of byte offset to module TLS base address.  */
++  HOWTO (AARCH64_R (TLSLE_LDST32_TPREL_LO12),	/* type */
++	 2,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 10,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_unsigned,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffc00,		/* src_mask */
++	 0xffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12, but no overflow check.  */
++  HOWTO (AARCH64_R (TLSLE_LDST32_TPREL_LO12_NC),	/* type */
++	 2,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 10,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0xffc00,		/* src_mask */
++	 0xffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* LD/ST64: bit[11:3] of byte offset to module TLS base address.  */
++  HOWTO (AARCH64_R (TLSLE_LDST64_TPREL_LO12),	/* type */
++	 3,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 9,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_unsigned,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x7fc00,		/* src_mask */
++	 0x7fc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12, but no overflow check.  */
++  HOWTO (AARCH64_R (TLSLE_LDST64_TPREL_LO12_NC),	/* type */
++	 3,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 9,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x7fc00,		/* src_mask */
++	 0x7fc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* LD/ST8: bit[11:0] of byte offset to module TLS base address.  */
++  HOWTO (AARCH64_R (TLSLE_LDST8_TPREL_LO12),	/* type */
++	 0,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 12,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_unsigned,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x3ffc00,		/* src_mask */
++	 0x3ffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
++  /* Same as BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12, but no overflow check.  */
++  HOWTO (AARCH64_R (TLSLE_LDST8_TPREL_LO12_NC),	/* type */
++	 0,			/* rightshift */
++	 2,			/* size (0 = byte, 1 = short, 2 = long) */
++	 12,			/* bitsize */
++	 FALSE,			/* pc_relative */
++	 10,			/* bitpos */
++	 complain_overflow_dont,	/* complain_on_overflow */
++	 bfd_elf_generic_reloc,	/* special_function */
++	 AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12_NC),	/* name */
++	 FALSE,			/* partial_inplace */
++	 0x3ffc00,		/* src_mask */
++	 0x3ffc00,		/* dst_mask */
++	 FALSE),		/* pcrel_offset */
++
+   HOWTO (AARCH64_R (TLSDESC_LD_PREL19),	/* type */
+ 	 2,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+@@ -5392,6 +5628,13 @@ bad_ifunc_reloc:
+     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
+     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
+     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G0:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G1:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G2:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
++    case BFD_RELOC_AARCH64_MOVW_PREL_G3:
+       if (bfd_link_pic (info)
+ 	  && (input_section->flags & SEC_ALLOC) != 0
+ 	  && (input_section->flags & SEC_READONLY) != 0
+@@ -5409,6 +5652,23 @@ bad_ifunc_reloc:
+ 	  bfd_set_error (bfd_error_bad_value);
+ 	  return bfd_reloc_notsupported;
+ 	}
++      value = _bfd_aarch64_elf_resolve_relocation (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:
+@@ -5416,7 +5676,6 @@ bad_ifunc_reloc:
+     case BFD_RELOC_AARCH64_32:
+ #endif
+     case BFD_RELOC_AARCH64_ADD_LO12:
+-    case BFD_RELOC_AARCH64_BRANCH19:
+     case BFD_RELOC_AARCH64_LDST128_LO12:
+     case BFD_RELOC_AARCH64_LDST16_LO12:
+     case BFD_RELOC_AARCH64_LDST32_LO12:
+@@ -5432,7 +5691,6 @@ bad_ifunc_reloc:
+     case BFD_RELOC_AARCH64_MOVW_G2_NC:
+     case BFD_RELOC_AARCH64_MOVW_G2_S:
+     case BFD_RELOC_AARCH64_MOVW_G3:
+-    case BFD_RELOC_AARCH64_TSTBR14:
+       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
+ 						   signed_addend, weak_undef_p);
+       break;
+@@ -5604,6 +5862,14 @@ bad_ifunc_reloc:
+     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
+     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
+     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
++    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
++    case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
++    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
++    case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
++    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
++    case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
++    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
++    case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
+     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
+     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
+     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+@@ -7318,9 +7584,6 @@ elfNN_aarch64_check_relocs (bfd *abfd, s
+ 	case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
+ 	case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
+ 	case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
+-	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
+-	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
+-	case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
+ 	  {
+ 	    unsigned got_type;
+ 	    unsigned old_got_type;
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/emit-relocs-534.d binutils-2.30/ld/testsuite/ld-aarch64/emit-relocs-534.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/emit-relocs-534.d	2021-03-25 09:15:07.899968264 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/emit-relocs-534.d	2021-03-25 10:42:15.528430527 +0000
+@@ -5,5 +5,5 @@
+ 0000000000010000 <.text>:
+    10000:	798009d6 	ldrsh	x22, \[x14, #4\]
+ 			10000: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC	v2
+-   10004:	79871a28 	ldrsh	x8, \[x17, #908\]
++   10004:	79.71a28 	ldrsh	x8, \[x17, #.*\]
+ 			10004: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC	v3
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/erratum835769.d binutils-2.30/ld/testsuite/ld-aarch64/erratum835769.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/erratum835769.d	2021-03-25 09:15:09.604955360 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/erratum835769.d	2021-03-25 10:37:37.516539044 +0000
+@@ -33,8 +33,7 @@ Disassembly of section .text:
+ [ \t0-9a-f]+:[ \t]+aa0503e0[ \t]+mov[ \t]+x0, x5
+ [ \t0-9a-f]+:[ \t]+d65f03c0[ \t]+ret
+ 
+-[ \t0-9a-f]+:[ \t]+14000008[ \t]+b[ \t]+[0-9a-f]+ <__erratum_835769_veneer_0\+0x8>
+-[ \t0-9a-f]+:[ \t]+d503201f[ \t]+nop
++[ \t0-9a-f]+:[ \t]+1400000.[ \t]+b[ \t]+[0-9a-f]+ <__erratum_835769_veneer_0\+0x8>
+ [0-9a-f]+ <__erratum_835769_veneer_2>:
+ [ \t0-9a-f]+:[ \t]+9b031885[ \t]+madd[ \t]+x5, x4, x3, x6
+ [ \t0-9a-f]+:[ \t0-9a-z]+[ \t]+b[ \t]+[0-9a-f]+ <a7str\+0x[0-9a-f]+>
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/erratum843419.d binutils-2.30/ld/testsuite/ld-aarch64/erratum843419.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/erratum843419.d	2021-03-25 09:15:09.109959106 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/erratum843419.d	2021-03-25 10:39:46.650559662 +0000
+@@ -25,7 +25,6 @@ Disassembly of section .e843419:
+ [ ]*20001018:	1400000. 	b	200010.. <__e835769_veneer>
+ [ ]*2000101c:	d65f03c0 	ret
+ [ ]*20001020:	14000400 	b	200020.. <__e835769_veneer\+0xff.>
+-[ \t0-9a-f]+:[ \t]+d503201f[ \t]+nop
+ 
+ 0*2000102. <e843419@0002_00000013_1004>:
+ [ ]*2000102.:	f9000008 	str	x8, \[x0\]
+@@ -47,7 +46,6 @@ Disassembly of section .e835769:
+ [ ]*3000010:	aa0503e0 	mov	x0, x5
+ [ ]*3000014:	d65f03c0 	ret
+ [ ]*3000018:	14000400 	b	3001018 <__erratum_835769_veneer_0\+0xff.>
+-[ \t0-9a-f]+:[ \t]+d503201f[ \t]+nop
+ 
+ 0*30000.. <__erratum_835769_veneer_0>:
+ [ ]*30000..:	9b031845 	madd	x5, x2, x3, x6
+@@ -63,7 +61,6 @@ Disassembly of section .text:
+ [ ]*40000c:	1400000. 	b	40001. <__e843419_veneer>
+ [ ]*400010:	d65f03c0 	ret
+ [ ]*400014:	14000400 	b	401014 <__e843419_veneer\+0xff.>
+-[ \t0-9a-f]+:[ \t]+d503201f[ \t]+nop
+ 
+ 0*4000.. <__e843419_veneer>:
+ [ ]*4000..:	900fe010 	adrp	x16, 20000000 <e843419>
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-defsym.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-defsym.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-defsym.d	2021-03-25 09:15:09.151958788 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-defsym.d	2021-03-25 10:48:41.319504608 +0000
+@@ -8,12 +8,11 @@
+ Disassembly of section .text:
+ 
+ 0+1000 <_start>:
+- +1000:	14000004 	b	1010 <__bar_veneer>
++ +1000:	14000003 	b	100c <__bar_veneer>
+  +1004:	d65f03c0 	ret
+-[ \t]+1008:[ \t]+14000008[ \t]+b[ \t]+1028 <__bar_veneer\+0x18>
+-[ \t]+100c:[ \t]+d503201f[ \t]+nop
+-0+1010 <__bar_veneer>:
+-    1010:	90040010 	adrp	x16, 8001000 <bar>
+-    1014:	91000210 	add	x16, x16, #0x0
+-    1018:	d61f0200 	br	x16
++[ \t]+1008:[ \t]+14000007[ \t]+b[ \t]+1024 <__bar_veneer\+0x18>
++0+100c <__bar_veneer>:
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-none-function.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-none-function.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-none-function.d	2021-03-25 09:15:09.386957010 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-none-function.d	2021-03-25 10:49:16.060220092 +0000
+@@ -8,15 +8,14 @@
+ Disassembly of section .text:
+ 
+ .* <_start>:
+-    1000:	14000004 	b	1010 <__bar_veneer>
++    1000:	14000003 	b	100c <__bar_veneer>
+     1004:	d65f03c0 	ret
+-    1008:	14000008 	b	1028 <__bar_veneer\+0x18>
+-    100c:	d503201f 	nop
++    1008:	14000007 	b	1024 <__bar_veneer\+0x18>
+ 
+ .* <__bar_veneer>:
+-    1010:	90040010 	adrp	x16, 8001000 <bar>
+-    1014:	91000210 	add	x16, x16, #0x0
+-    1018:	d61f0200 	br	x16
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-section.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-section.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-b-section.d	2021-03-25 09:15:07.885968370 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-b-section.d	2021-03-25 10:52:05.924566309 +0000
+@@ -8,22 +8,21 @@
+ Disassembly of section .text:
+ 
+ .* <_start>:
+-    1000:	14000009 	b	1024 <___veneer>
+-    1004:	14000004 	b	1014 <___veneer>
++    1000:	14000008 	b	1020 <___veneer>
++    1004:	14000003 	b	1010 <___veneer>
+     1008:	d65f03c0 	ret
+-    100c:	1400000e 	b	1044 <___veneer\+0x20>
+-    1010:	d503201f 	nop
++    100c:	1400000d 	b	1040 <___veneer\+0x20>
+ 
+ .* <___veneer>:
+-    1014:	90040010 	adrp	x16, 8001000 <bar>
+-    1018:	91001210 	add	x16, x16, #0x4
+-    101c:	d61f0200 	br	x16
+-    1020:	00000000 	udf	#0
++    1010:	90040010 	adrp	x16, 8001000 <bar>
++    1014:	91001210 	add	x16, x16, #0x4
++    1018:	d61f0200 	br	x16
++    101c:	00000000 	udf	#0
+ 
+ .* <___veneer>:
+-    1024:	90040010 	adrp	x16, 8001000 <bar>
+-    1028:	91000210 	add	x16, x16, #0x0
+-    102c:	d61f0200 	br	x16
++    1020:	90040010 	adrp	x16, 8001000 <bar>
++    1024:	91000210 	add	x16, x16, #0x0
++    1028:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-b.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-b.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-b.d	2021-03-25 09:15:09.112959083 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-b.d	2021-03-25 10:49:09.608282913 +0000
+@@ -8,14 +8,13 @@
+ Disassembly of section .text:
+ 
+ 0+1000 <_start>:
+- +1000:	14000004 	b	1010 <__bar_veneer>
++ +1000:	14000003 	b	100c <__bar_veneer>
+  +1004:	d65f03c0 	ret
+-[ \t]+1008:[ \t]+14000008[ \t]+b[ \t]+1028 <__bar_veneer\+0x18>
+-[ \t]+100c:[ \t]+d503201f[ \t]+nop
+-0+1010 <__bar_veneer>:
+-    1010:	90040010 	adrp	x16, 8001000 <bar>
+-    1014:	91000210 	add	x16, x16, #0x0
+-    1018:	d61f0200 	br	x16
++[ \t]+1008:[ \t]+14000007[ \t]+b[ \t]+1024 <__bar_veneer\+0x18>
++0+100c <__bar_veneer>:
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-back.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-back.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-back.d	2021-03-25 09:15:09.187958516 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-back.d	2021-03-25 10:47:37.574988061 +0000
+@@ -9,68 +9,66 @@
+ Disassembly of section .text:
+ 
+ 0000000000001000 <_start>:
+-    1000:	14000414 	b	2050 <__bar1_veneer>
+-    1004:	94000413 	bl	2050 <__bar1_veneer>
+-    1008:	14000408 	b	2028 <__bar2_veneer>
+-    100c:	94000407 	bl	2028 <__bar2_veneer>
+-    1010:	1400040a 	b	2038 <__bar3_veneer>
+-    1014:	94000409 	bl	2038 <__bar3_veneer>
+-    1018:	d65f03c0 	ret
++    1000:	1400041. 	b	20.. <__bar1_veneer>
++    1004:	9400041. 	bl	20.. <__bar1_veneer>
++    1008:	1400040. 	b	20.. <__bar2_veneer>
++    100c:	9400040. 	bl	20.. <__bar2_veneer>
++    1010:	1400040. 	b	20.. <__bar3_veneer>
++    1014:	9400040. 	bl	20.. <__bar3_veneer>
++    1018:	d65f03c. 	ret
+ 	...
+ 
+ 000000000000201c <_back>:
+     201c:	d65f03c0 	ret
+ 
+-[ \t]+2020:[ \t]+14000014[ \t]+b[ \t]+2070 <__bar1_veneer\+0x20>
+-[ \t]+2024:[ \t]+d503201f[ \t]+nop
+-0000000000002028 <__bar2_veneer>:
+-    2028:	f07ffff0 	adrp	x16, 100001000 <bar1\+0x1000>
+-    202c:	91002210 	add	x16, x16, #0x8
+-    2030:	d61f0200 	br	x16
+-    2034:	00000000 	udf	#0
+-
+-0000000000002038 <__bar3_veneer>:
+-    2038:	58000090 	ldr	x16, 2048 <__bar3_veneer\+0x10>
+-    203c:	10000011 	adr	x17, 203c <__bar3_veneer\+0x4>
+-    2040:	8b110210 	add	x16, x16, x17
+-    2044:	d61f0200 	br	x16
+-    2048:	ffffffd4 	.word	0xffffffd4
+-    204c:	00000000 	.word	0x00000000
+-
+-0000000000002050 <__bar1_veneer>:
+-    2050:	d07ffff0 	adrp	x16, 100000000 <bar1>
+-    2054:	91000210 	add	x16, x16, #0x0
+-    2058:	d61f0200 	br	x16
++[ \t]+2020:[ \t]+1400001.[ \t]+b[ \t]+20.. <__bar1_veneer\+0x20>
++00000000000020.. <__bar2_veneer>:
++    20..:	f07ffff0 	adrp	x16, 100001000 <bar1\+0x1000>
++    20..:	91002210 	add	x16, x16, #0x8
++    20..:	d61f0200 	br	x16
++    20..:	00000000 	udf	#0
++
++00000000000020.. <__bar3_veneer>:
++    20..:	58000090 	ldr	x16, 20.. <__bar3_veneer\+0x10>
++    20..:	10000011 	adr	x17, 20.. <__bar3_veneer\+0x4>
++    20..:	8b110210 	add	x16, x16, x17
++    20..:	d61f0200 	br	x16
++    20..:	ffffffd. 	.word	0xffffffd.
++    20..:	00000000 	.word	0x00000000
++
++00000000000020.. <__bar1_veneer>:
++    20..:	d07ffff0 	adrp	x16, 100000000 <bar1>
++    20..:	91000210 	add	x16, x16, #0x0
++    20..:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+ 
+ 0000000100000000 <bar1>:
+    100000000:	d65f03c0 	ret
+-   100000004:	14000807 	b	100002020 <___start_veneer>
++   100000004:	1400080. 	b	1000020.. <___start_veneer>
+ 	...
+ 
+ 0000000100001008 <bar2>:
+    100001008:	d65f03c0 	ret
+-   10000100c:	14000405 	b	100002020 <___start_veneer>
++   10000100c:	1400040. 	b	1000020.. <___start_veneer>
+ 	...
+ 
+ 0000000100002010 <bar3>:
+    100002010:	d65f03c0 	ret
+-   100002014:	14000009 	b	100002038 <___back_veneer>
++   100002014:	1400000. 	b	1000020.. <___back_veneer>
+ 
+-[ \t]+100002018:[ \t]+1400000e[ \t]+b[ \t]+100002050 <___back_veneer\+0x18>
+-[ \t]+10000201c:[ \t]+d503201f[ \t]+nop
+-0000000100002020 <___start_veneer>:
+-   100002020:	58000090 	ldr	x16, 100002030 <___start_veneer\+0x10>
+-   100002024:	10000011 	adr	x17, 100002024 <___start_veneer\+0x4>
+-   100002028:	8b110210 	add	x16, x16, x17
+-   10000202c:	d61f0200 	br	x16
+-   100002030:	ffffefdc 	.word	0xffffefdc
+-   100002034:	fffffffe 	.word	0xfffffffe
+-
+-0000000100002038 <___back_veneer>:
+-   100002038:	90800010 	adrp	x16, 2000 <_start\+0x1000>
+-   10000203c:	91007210 	add	x16, x16, #0x1c
+-   100002040:	d61f0200 	br	x16
++[ \t]+100002018:[ \t]+1400000.[ \t]+b[ \t]+1000020.. <___back_veneer\+0x18>
++00000001000020.. <___start_veneer>:
++   1000020..:	580000.. 	ldr	x16, 1000020.. <___start_veneer\+0x10>
++   1000020..:	100000.. 	adr	x17, 1000020.. <___start_veneer\+0x4>
++   1000020..:	8b110210 	add	x16, x16, x17
++   1000020..:	d61f0200 	br	x16
++   1000020..:	ffffef.. 	.word	0xffffef..
++   1000020..:	fffffffe 	.word	0xfffffffe
++
++00000001000020.. <___back_veneer>:
++   1000020..:	90800010 	adrp	x16, 2000 <_start\+0x1000>
++   1000020..:	91007210 	add	x16, x16, #0x1c
++   1000020..:	d61f0200 	br	x16
+ 	...
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-defsym.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-defsym.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-defsym.d	2021-03-25 09:15:09.159958728 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-defsym.d	2021-03-25 10:48:58.873371476 +0000
+@@ -8,12 +8,11 @@
+ Disassembly of section .text:
+ 
+ 0+1000 <_start>:
+-[ \t]+1000:[ \t]+94000004[ \t]+bl[ \t]+1010 <__bar_veneer>
+-[ \t]+1004:[ \t]+d65f03c0[ \t]+ret
+-[ \t]+1008:[ \t]+14000008[ \t]+b[ \t]+1028 <__bar_veneer\+0x18>
+-[ \t]+100c:[ \t]+d503201f[ \t]+nop
+-0+1010 <__bar_veneer>:
+-[ \t]+1010:[ \t]+90040010[ \t]+adrp[ \t]+x16, 8001000 <bar>
+-[ \t]+1014:[ \t]+91000210[ \t]+add[ \t]+x16, x16, #0x0
+-[ \t]+1018:[ \t]+d61f0200[ \t]+br[ \t]+x16
++ +1000:	94000003 	bl	100c <__bar_veneer>
++ +1004:	d65f03c0 	ret
++[ \t]+1008:[ \t]+14000007[ \t]+b[ \t]+1024 <__bar_veneer\+0x18>
++0+100c <__bar_veneer>:
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-none-function.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-none-function.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-none-function.d	2021-03-25 09:15:09.135958909 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-none-function.d	2021-03-25 10:49:21.128170754 +0000
+@@ -8,15 +8,14 @@
+ Disassembly of section .text:
+ 
+ .* <_start>:
+-    1000:	94000004 	bl	1010 <__bar_veneer>
++    1000:	94000003 	bl	100c <__bar_veneer>
+     1004:	d65f03c0 	ret
+-    1008:	14000008 	b	1028 <__bar_veneer\+0x18>
+-    100c:	d503201f 	nop
++    1008:	14000007 	b	1024 <__bar_veneer\+0x18>
+ 
+ .* <__bar_veneer>:
+-    1010:	90040010 	adrp	x16, 8001000 <bar>
+-    1014:	91000210 	add	x16, x16, #0x0
+-    1018:	d61f0200 	br	x16
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-section.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-section.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl-section.d	2021-03-25 09:15:09.339957365 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl-section.d	2021-03-25 10:52:27.892352440 +0000
+@@ -8,22 +8,21 @@
+ Disassembly of section .text:
+ 
+ .* <_start>:
+-    1000:	94000009 	bl	1024 <___veneer>
+-    1004:	94000004 	bl	1014 <___veneer>
++    1000:	94000008 	bl	1020 <___veneer>
++    1004:	94000003 	bl	1010 <___veneer>
+     1008:	d65f03c0 	ret
+-    100c:	1400000e 	b	1044 <___veneer\+0x20>
+-    1010:	d503201f 	nop
++    100c:	1400000d 	b	1040 <___veneer\+0x20>
+ 
+ .* <___veneer>:
+-    1014:	90040010 	adrp	x16, 8001000 <bar>
+-    1018:	91001210 	add	x16, x16, #0x4
+-    101c:	d61f0200 	br	x16
+-    1020:	00000000 	udf	#0
++    1010:	90040010 	adrp	x16, 8001000 <bar>
++    1014:	91001210 	add	x16, x16, #0x4
++    1018:	d61f0200 	br	x16
++    101c:	00000000 	udf	#0
+ 
+ .* <___veneer>:
+-    1024:	90040010 	adrp	x16, 8001000 <bar>
+-    1028:	91000210 	add	x16, x16, #0x0
+-    102c:	d61f0200 	br	x16
++    1020:	90040010 	adrp	x16, 8001000 <bar>
++    1024:	91000210 	add	x16, x16, #0x0
++    1028:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+diff -rup binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl.d binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl.d
+--- binutils.nickc/ld/testsuite/ld-aarch64/farcall-bl.d	2021-03-25 09:15:09.404956874 +0000
++++ binutils-2.30/ld/testsuite/ld-aarch64/farcall-bl.d	2021-03-25 10:49:05.522321050 +0000
+@@ -8,14 +8,13 @@
+ Disassembly of section .text:
+ 
+ 0+1000 <_start>:
+-[ \t]+1000:[ \t]+94000004[ \t]+	bl[ \t]+1010 <__bar_veneer>
+-[ \t]+1004:[ \t]+d65f03c0[ \t]+ret
+-[ \t]+1008:[ \t]+14000008[ \t]+b[ \t]+1028 <__bar_veneer\+0x18>
+-[ \t]+100c:[ \t]+d503201f[ \t]+nop
+-0+1010 <__bar_veneer>:
+-[ \t]+1010:[ \t]+90040010[ \t]+adrp[ \t]+x16, 8001000 <bar>
+-[ \t]+1014:[ \t]+91000210[ \t]+add[ \t]+x16, x16, #0x0
+-[ \t]+1018:[ \t]+d61f0200[ \t]+br[ \t]+x16
++ +1000:	94000003 	bl	100c <__bar_veneer>
++ +1004:	d65f03c0 	ret
++[ \t]+1008:[ \t]+14000007[ \t]+b[ \t]+1024 <__bar_veneer\+0x18>
++0+100c <__bar_veneer>:
++    100c:	90040010 	adrp	x16, 8001000 <bar>
++    1010:	91000210 	add	x16, x16, #0x0
++    1014:	d61f0200 	br	x16
+ 	...
+ 
+ Disassembly of section .foo:
+--- binutils.nickc/ld/testsuite/ld-elf/shared.exp	2021-03-25 09:15:15.881907854 +0000
++++ binutils-2.30/ld/testsuite/ld-elf/shared.exp	2021-03-25 11:56:11.928122725 +0000
+@@ -849,12 +849,6 @@ set build_cxx_tests {
+ #     "tmpdir/libdl3b.so" ""
+ #     {dl3main.cc} "dl3b" "dl3b.out" "" "c++"}
+ set run_cxx_tests {
+-    {"Run with libdl3a.so"
+-     "-Wl,--no-as-needed tmpdir/libdl3a.so" ""
+-     {dl3main.cc} "dl3a" "dl3a.out" "" "c++"}
+-    {"Run with libdl3c.so"
+-     "-Wl,--no-as-needed tmpdir/libdl3c.so" ""
+-     {dl3main.cc} "dl3c" "dl3a.out" "" "c++"}
+     {"Run with libnew1a.so"
+      "-Wl,--no-as-needed tmpdir/libnew1a.so" ""
+      {dl5.cc} "dl5a" "dl5.out" "-ansi" "c++"}
diff --git a/SPECS/binutils.spec b/SPECS/binutils.spec
index 0f7f4c6..cdf7155 100644
--- a/SPECS/binutils.spec
+++ b/SPECS/binutils.spec
@@ -43,7 +43,7 @@
 Summary: A GNU collection of binary utilities
 Name: binutils%{?name_cross}%{?_with_debug:-debug}
 Version: 2.30
-Release: 98%{?dist}
+Release: 99%{?dist}
 License: GPLv3+
 URL: https://sourceware.org/binutils
 
@@ -1240,6 +1240,9 @@ exit 0
 
 #----------------------------------------------------------------------------
 %changelog
+* Thu Mar 25 2021 Nick Clifton  <nickc@redhat.com> - 2.30-99
+- Fix bug in previous patch to enable support for ARM v8.6 ISA.  (#1875912)
+
 * Wed Mar 24 2021 Nick Clifton  <nickc@redhat.com> - 2.30-98
 - Do not strip the static BFD library.  (#1924068)