From d49008dbc51d6f76c9d413604e2c853439784116 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Apr 02 2021 04:13:37 +0000 Subject: import binutils-2.30-99.el8 --- 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, _("")); -+ fprintf (file, _(" ")); - - 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 . */ - - #include "sysdep.h" -+#include "bfd.h" -+#include "elf-bfd.h" - #include "elfxx-aarch64.h" - #include - #include --#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: "), -- 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 . */ - --#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/ .* : .*: 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]+ +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. : + [ ]*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 +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 +- 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 ++ 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 +- 1014: 91000210 add x16, x16, #0x0 +- 1018: d61f0200 br x16 ++ 100c: 90040010 adrp x16, 8001000 ++ 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 +- 1018: 91001210 add x16, x16, #0x4 +- 101c: d61f0200 br x16 +- 1020: 00000000 udf #0 ++ 1010: 90040010 adrp x16, 8001000 ++ 1014: 91001210 add x16, x16, #0x4 ++ 1018: d61f0200 br x16 ++ 101c: 00000000 udf #0 + + .* <___veneer>: +- 1024: 90040010 adrp x16, 8001000 +- 1028: 91000210 add x16, x16, #0x0 +- 102c: d61f0200 br x16 ++ 1020: 90040010 adrp x16, 8001000 ++ 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 +- 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 ++ 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 +- 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 +- 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 ++ 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 ++ 20..: 91000210 add x16, x16, #0x0 ++ 20..: d61f0200 br x16 + ... + + Disassembly of section .foo: + + 0000000100000000 : + 100000000: d65f03c0 ret +- 100000004: 14000807 b 100002020 <___start_veneer> ++ 100000004: 1400080. b 1000020.. <___start_veneer> + ... + + 0000000100001008 : + 100001008: d65f03c0 ret +- 10000100c: 14000405 b 100002020 <___start_veneer> ++ 10000100c: 1400040. b 1000020.. <___start_veneer> + ... + + 0000000100002010 : + 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 +-[ \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 ++ 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 +- 1014: 91000210 add x16, x16, #0x0 +- 1018: d61f0200 br x16 ++ 100c: 90040010 adrp x16, 8001000 ++ 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 +- 1018: 91001210 add x16, x16, #0x4 +- 101c: d61f0200 br x16 +- 1020: 00000000 udf #0 ++ 1010: 90040010 adrp x16, 8001000 ++ 1014: 91001210 add x16, x16, #0x4 ++ 1018: d61f0200 br x16 ++ 101c: 00000000 udf #0 + + .* <___veneer>: +- 1024: 90040010 adrp x16, 8001000 +- 1028: 91000210 add x16, x16, #0x0 +- 102c: d61f0200 br x16 ++ 1020: 90040010 adrp x16, 8001000 ++ 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 +-[ \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 ++ 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 - 2.30-99 +- Fix bug in previous patch to enable support for ARM v8.6 ISA. (#1875912) + * Wed Mar 24 2021 Nick Clifton - 2.30-98 - Do not strip the static BFD library. (#1924068)