From dcafd8d09e8ac65ffc712fd7f367c21036b93198 Mon Sep 17 00:00:00 2001 From: Packit Service Date: Apr 02 2021 04:34:59 +0000 Subject: Source-git repo for imports/c8s/binutils-2.30-99.el8 --- diff --git a/SPECS/binutils-aarch64-armv8.6-support.patch b/SPECS/binutils-aarch64-armv8.6-support.patch index f1a9d69..fd070a7 100644 --- a/SPECS/binutils-aarch64-armv8.6-support.patch +++ b/SPECS/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) diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 536feaf..afbccaf 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -1090,8 +1090,8 @@ DISTCLEANFILES = $(BUILD_CFILES) $(BUILD_HFILES) libtool-soversion bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in @echo "creating $@" @bfd_version=`echo "$(VERSION)" | $(SED) -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\ - bfd_version_string="\"$(VERSION)-98.el8\"" ;\ - bfd_soversion="$(VERSION)-98.el8" ;\ + bfd_version_string="\"$(VERSION)-99.el8\"" ;\ + bfd_soversion="$(VERSION)-99.el8" ;\ bfd_version_package="\"$(PKGVERSION)\"" ;\ report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ . $(srcdir)/development.sh ;\ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 2e8a011..7b876e5 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -2210,8 +2210,8 @@ stmp-lcoff-h: $(LIBCOFF_H_FILES) bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in @echo "creating $@" @bfd_version=`echo "$(VERSION)" | $(SED) -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\ - bfd_version_string="\"$(VERSION)-98.el8\"" ;\ - bfd_soversion="$(VERSION)-98.el8" ;\ + bfd_version_string="\"$(VERSION)-99.el8\"" ;\ + bfd_soversion="$(VERSION)-99.el8" ;\ bfd_version_package="\"$(PKGVERSION)\"" ;\ report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ . $(srcdir)/development.sh ;\ diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 596d11e..9db46ee 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -1,5 +1,5 @@ /* AArch64-specific support for NN-bit ELF. - Copyright (C) 2009-2021 Free Software Foundation, Inc. + Copyright (C) 2009-2018 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 @@ -268,12 +268,6 @@ #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 @@ -304,26 +298,9 @@ static const bfd_byte elfNN_aarch64_small_plt0_entry[PLT_ENTRY_SIZE] = 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. Use BTI versions of the PLTs when enabled. */ + these PLT entries. */ static const bfd_byte elfNN_aarch64_small_plt_entry[PLT_SMALL_ENTRY_SIZE] = { 0x10, 0x00, 0x00, 0x90, /* adrp x16, PLTGOT + n * 8 */ @@ -338,54 +315,6 @@ static const bfd_byte elfNN_aarch64_small_plt_entry[PLT_SMALL_ENTRY_SIZE] = }; 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]! */ @@ -403,24 +332,6 @@ elfNN_aarch64_tlsdesc_small_plt_entry[PLT_TLSDESC_ENTRY_SIZE] = 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 @@ -2189,7 +2100,7 @@ elfNN_aarch64_bfd_reloc_from_howto (reloc_howto_type *howto) /* Given R_TYPE, return the bfd internal relocation enumerator. */ static bfd_reloc_code_real_type -elfNN_aarch64_bfd_reloc_from_type (bfd *abfd, unsigned int r_type) +elfNN_aarch64_bfd_reloc_from_type (unsigned int r_type) { static bfd_boolean initialized_p = FALSE; /* Indexed by R_TYPE, values are offsets in the howto_table. */ @@ -2212,8 +2123,7 @@ elfNN_aarch64_bfd_reloc_from_type (bfd *abfd, unsigned int r_type) /* PR 17512: file: b371e70a. */ if (r_type >= R_AARCH64_end) { - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), - abfd, r_type); + _bfd_error_handler (_("Invalid AArch64 reloc number: %d"), r_type); bfd_set_error (bfd_error_bad_value); return BFD_RELOC_AARCH64_NONE; } @@ -2272,7 +2182,7 @@ elfNN_aarch64_howto_from_bfd_reloc (bfd_reloc_code_real_type code) } static reloc_howto_type * -elfNN_aarch64_howto_from_type (bfd *abfd, unsigned int r_type) +elfNN_aarch64_howto_from_type (unsigned int r_type) { bfd_reloc_code_real_type val; reloc_howto_type *howto; @@ -2288,7 +2198,7 @@ elfNN_aarch64_howto_from_type (bfd *abfd, unsigned int r_type) if (r_type == R_AARCH64_NONE) return &elfNN_aarch64_howto_none; - val = elfNN_aarch64_bfd_reloc_from_type (abfd, r_type); + val = elfNN_aarch64_bfd_reloc_from_type (r_type); howto = elfNN_aarch64_howto_from_bfd_reloc (val); if (howto != NULL) @@ -2298,22 +2208,14 @@ elfNN_aarch64_howto_from_type (bfd *abfd, unsigned int r_type) return NULL; } -static bfd_boolean -elfNN_aarch64_info_to_howto (bfd *abfd, arelent *bfd_reloc, +static void +elfNN_aarch64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, 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 (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; + bfd_reloc->howto = elfNN_aarch64_howto_from_type (r_type); } static reloc_howto_type * @@ -2528,13 +2430,6 @@ 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) \ @@ -2640,15 +2535,9 @@ struct elf_aarch64_link_hash_table /* The number of bytes in the initial entry in the PLT. */ bfd_size_type plt_header_size; - /* The bytes of the initial PLT entry. */ - const bfd_byte *plt0_entry; - - /* The number of bytes in the subsequent PLT entries. */ + /* The number of bytes in the subsequent PLT etries. */ 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; @@ -2694,9 +2583,6 @@ 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. */ @@ -2910,8 +2796,8 @@ elfNN_aarch64_merge_symbol_attribute (struct elf_link_hash_entry *h, bfd_boolean definition ATTRIBUTE_UNUSED, bfd_boolean dynamic ATTRIBUTE_UNUSED) { - unsigned int isym_sto = (isym->st_other & ~ELF_ST_VISIBILITY (-1)) & 0xFF; - unsigned int h_sto = (h->other & ~ELF_ST_VISIBILITY (-1)) & 0xFF; + unsigned int isym_sto = isym->st_other & ~ELF_ST_VISIBILITY (-1); + unsigned int h_sto = h->other & ~ELF_ST_VISIBILITY (-1); if (isym_sto == h_sto) return; @@ -2950,7 +2836,7 @@ static struct bfd_link_hash_table * elfNN_aarch64_link_hash_table_create (bfd *abfd) { struct elf_aarch64_link_hash_table *ret; - size_t amt = sizeof (struct elf_aarch64_link_hash_table); + bfd_size_type amt = sizeof (struct elf_aarch64_link_hash_table); ret = bfd_zmalloc (amt); if (ret == NULL) @@ -2965,10 +2851,7 @@ elfNN_aarch64_link_hash_table_create (bfd *abfd) } 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; @@ -3003,13 +2886,12 @@ aarch64_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section, reloc_howto_type *howto; bfd_vma place; - howto = elfNN_aarch64_howto_from_type (input_bfd, r_type); + howto = elfNN_aarch64_howto_from_type (r_type); place = (input_section->output_section->vma + input_section->output_offset + offset); - 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); + r_type = elfNN_aarch64_bfd_reloc_from_type (r_type); + value = _bfd_aarch64_elf_resolve_relocation (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; @@ -3236,7 +3118,7 @@ _bfd_aarch64_add_stub_entry_in_group (const char *stub_name, if (stub_entry == NULL) { /* xgettext:c-format */ - _bfd_error_handler (_("%pB: cannot create stub entry %s"), + _bfd_error_handler (_("%B: cannot create stub entry %s"), section->owner, stub_name); return NULL; } @@ -3259,8 +3141,6 @@ _bfd_aarch64_add_stub_entry_after (const char *stub_name, 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); @@ -3453,7 +3333,7 @@ elfNN_aarch64_setup_section_lists (bfd *output_bfd, unsigned int top_id, top_index; asection *section; asection **input_list, **list; - size_t amt; + bfd_size_type amt; struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info); @@ -3531,7 +3411,7 @@ elfNN_aarch64_next_input_section (struct bfd_link_info *info, asection *isec) { asection **list = htab->input_list + isec->output_section->index; - if (*list != bfd_abs_section_ptr && (isec->flags & SEC_CODE) != 0) + if (*list != bfd_abs_section_ptr) { /* Steal the link_sec pointer for our list. */ /* This happens to make the list in reverse order, @@ -3552,97 +3432,68 @@ elfNN_aarch64_next_input_section (struct bfd_link_info *info, asection *isec) static void group_sections (struct elf_aarch64_link_hash_table *htab, bfd_size_type stub_group_size, - bfd_boolean stubs_always_after_branch) + bfd_boolean stubs_always_before_branch) { - asection **list = htab->input_list; + asection **list = htab->input_list + htab->top_index; 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) { - /* Pop from tail. */ - asection *item = tail; - tail = PREV_SEC (item); - - /* Push on head. */ - NEXT_SEC (item) = head; - head = item; - } - - while (head != NULL) - { asection *curr; - asection *next; - bfd_vma stub_group_start = head->output_offset; - bfd_vma end_of_next; + asection *prev; + bfd_size_type total; - 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; - } + curr = tail; + total = tail->size; + while ((prev = PREV_SEC (curr)) != NULL + && ((total += curr->output_offset - prev->output_offset) + < stub_group_size)) + curr = prev; - /* OK, the size from the start to the start of CURR is less + /* OK, the size from the start of CURR to the end is less than stub_group_size and thus can be handled by one stub - section. (Or the head section is itself larger than + section. (Or the tail 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 { - next = NEXT_SEC (head); + prev = PREV_SEC (tail); /* Set up this stub group. */ - htab->stub_group[head->id].link_sec = curr; + htab->stub_group[tail->id].link_sec = curr; } - while (head != curr && (head = next) != NULL); + while (tail != curr && (tail = prev) != NULL); /* But wait, there's more! Input sections up to stub_group_size - bytes after the stub section can be handled by it too. */ - if (!stubs_always_after_branch) + bytes before the stub section can be handled by it too. */ + if (!stubs_always_before_branch) { - stub_group_start = curr->output_offset + curr->size; - - while (next != NULL) + total = 0; + while (prev != NULL + && ((total += tail->output_offset - prev->output_offset) + < stub_group_size)) { - 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; + prev = PREV_SEC (tail); + htab->stub_group[tail->id].link_sec = curr; } } - head = next; + tail = prev; } } - while (list++ != htab->input_list + htab->top_index); + while (list-- != htab->input_list); free (htab->input_list); } #undef PREV_SEC -#undef PREV_SEC #define AARCH64_BITS(x, pos, n) (((x) >> (pos)) & ((1 << (n)) - 1)) @@ -3916,8 +3767,7 @@ _bfd_aarch64_erratum_835769_stub_name (unsigned num_fixes) { char *stub_name = (char *) bfd_malloc (strlen ("__erratum_835769_veneer_") + 16); - if (stub_name != NULL) - sprintf (stub_name,"__erratum_835769_veneer_%d", num_fixes); + sprintf (stub_name,"__erratum_835769_veneer_%d", num_fixes); return stub_name; } @@ -3959,9 +3809,8 @@ _bfd_aarch64_erratum_835769_scan (bfd *input_bfd, sec_data = elf_aarch64_section_data (section); - if (sec_data->mapcount) - qsort (sec_data->map, sec_data->mapcount, - sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping); + qsort (sec_data->map, sec_data->mapcount, + sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping); for (span = 0; span < sec_data->mapcount; span++) { @@ -4017,7 +3866,7 @@ _bfd_aarch64_erratum_835769_scan (bfd *input_bfd, static bfd_boolean _bfd_aarch64_adrp_p (uint32_t insn) { - return ((insn & AARCH64_ADRP_OP_MASK) == AARCH64_ADRP_OP); + return ((insn & 0x9f000000) == 0x90000000); } @@ -4114,24 +3963,22 @@ _bfd_aarch64_resize_stubs (struct elf_aarch64_link_hash_table *htab) 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 += 8; + section->size += 4; /* 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. 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. */ + in such a way that new errata sequences are created. */ 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, @@ -4167,8 +4014,6 @@ _bfd_aarch64_erratum_843419_fixup (uint32_t insn, 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) @@ -4186,7 +4031,8 @@ _bfd_aarch64_erratum_843419_fixup (uint32_t insn, 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) @@ -4244,9 +4090,8 @@ _bfd_aarch64_erratum_843419_scan (bfd *input_bfd, asection *section, sec_data = elf_aarch64_section_data (section); - if (sec_data->mapcount) - qsort (sec_data->map, sec_data->mapcount, - sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping); + qsort (sec_data->map, sec_data->mapcount, + sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping); for (span = 0; span < sec_data->mapcount; span++) { @@ -4341,15 +4186,9 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, for (input_bfd = info->input_bfds; input_bfd != NULL; input_bfd = input_bfd->link.next) - { - 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; - } + if (!_bfd_aarch64_erratum_835769_scan (input_bfd, info, + &num_erratum_835769_fixes)) + return FALSE; _bfd_aarch64_resize_stubs (htab); (*htab->layout_sections_again) (); @@ -4365,10 +4204,6 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, { 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) @@ -4391,10 +4226,6 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, 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) @@ -4603,9 +4434,6 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, { /* 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; } @@ -4657,7 +4485,7 @@ elfNN_aarch64_size_stubs (bfd *output_bfd, return TRUE; - error_ret_free_local: +error_ret_free_local: return FALSE; } @@ -4692,11 +4520,8 @@ elfNN_aarch64_build_stubs (struct bfd_link_info *info) 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); - bfd_putl32 (INSN_NOP, stub_sec->contents + 4); - stub_sec->size += 8; + stub_sec->size += 4; } /* Build the stubs as directed by the stub hash table. */ @@ -4786,67 +4611,21 @@ 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, - aarch64_bti_pac_info bp_info) + int no_apply_dynamic_relocs) { 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; @@ -4854,20 +4633,6 @@ bfd_elfNN_aarch64_set_options (struct bfd *output_bfd, 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 @@ -5102,7 +4867,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 (input_bfd, r_type); + = elfNN_aarch64_bfd_reloc_from_type (r_type); if (! aarch64_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx)) return bfd_r_type; @@ -5278,7 +5043,7 @@ make_branch_to_erratum_835769_stub (struct bfd_hash_entry *gen_entry, abfd = stub_entry->target_section->owner; if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc)) _bfd_error_handler - (_("%pB: error: erratum 835769 stub out " + (_("%B: error: Erratum 835769 stub out " "of range (input file too large)"), abfd); target = stub_entry->target_value; @@ -5318,21 +5083,15 @@ _bfd_aarch64_erratum_843419_branch_to_stub (struct bfd_hash_entry *gen_entry, || stub_entry->stub_type != aarch64_stub_erratum_843419_veneer) return TRUE; - /* 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); - } + 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 (!_bfd_aarch64_adrp_p (insn)) + if ((insn & AARCH64_ADRP_OP_MASK) != AARCH64_ADRP_OP) abort (); bfd_signed_vma imm = @@ -5346,8 +5105,6 @@ _bfd_aarch64_erratum_843419_branch_to_stub (struct bfd_hash_entry *gen_entry, 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 { @@ -5367,7 +5124,7 @@ _bfd_aarch64_erratum_843419_branch_to_stub (struct bfd_hash_entry *gen_entry, abfd = stub_entry->target_section->owner; if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc)) _bfd_error_handler - (_("%pB: error: erratum 843419 stub out " + (_("%B: error: Erratum 843419 stub out " "of range (input file too large)"), abfd); branch_insn = 0x14000000; @@ -5431,17 +5188,6 @@ aarch64_relocation_aginst_gp_p (bfd_reloc_code_real_type reloc) || 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. */ @@ -5475,7 +5221,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, asection *base_got; bfd_vma orig_value = value; bfd_boolean resolved_to_zero; - bfd_boolean abs_symbol_p; globals = elf_aarch64_hash_table (info); @@ -5495,13 +5240,12 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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; @@ -5529,7 +5273,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, /* 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; } @@ -5543,7 +5286,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, switch (bfd_r_type) { default: - bad_ifunc_reloc: +bad_ifunc_reloc: if (h->root.root.string) name = h->root.root.string; else @@ -5551,7 +5294,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, NULL); _bfd_error_handler /* xgettext:c-format */ - (_("%pB: relocation %s against STT_GNU_IFUNC " + (_("%B: 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); @@ -5567,9 +5310,9 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, sym, NULL); _bfd_error_handler /* xgettext:c-format */ - (_("%pB: relocation %s against STT_GNU_IFUNC " - "symbol `%s' has non-zero addend: %ld"), - input_bfd, howto->name, name, (int64_t) rel->r_addend); + (_("%B: relocation %s against STT_GNU_IFUNC " + "symbol `%s' has non-zero addend: %Ld"), + input_bfd, howto->name, name, rel->r_addend); bfd_set_error (bfd_error_bad_value); return bfd_reloc_notsupported; } @@ -5623,8 +5366,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, /* FALLTHROUGH */ case BFD_RELOC_AARCH64_CALL26: case BFD_RELOC_AARCH64_JUMP26: - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, signed_addend, weak_undef_p); return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type, @@ -5701,8 +5443,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, addend = (globals->root.sgot->output_section->vma + globals->root.sgot->output_offset); - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (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: @@ -5771,12 +5512,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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); @@ -5786,7 +5521,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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 @@ -5880,8 +5616,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, signed_addend = 0; } } - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, signed_addend, weak_undef_p); *unresolved_reloc_p = FALSE; break; @@ -5909,7 +5644,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, _bfd_error_handler /* xgettext:c-format */ - (_("%pB: relocation %s against symbol `%s' which may bind " + (_("%B: 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, @@ -5917,7 +5652,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, bfd_set_error (bfd_error_bad_value); return bfd_reloc_notsupported; } - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, signed_addend, weak_undef_p); @@ -5956,8 +5691,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, case BFD_RELOC_AARCH64_MOVW_G2_NC: case BFD_RELOC_AARCH64_MOVW_G2_S: case BFD_RELOC_AARCH64_MOVW_G3: - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, signed_addend, weak_undef_p); break; @@ -6002,8 +5736,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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 (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, addend, weak_undef_p); } else @@ -6017,7 +5750,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; _bfd_error_handler /* xgettext:c-format */ - (_("%pB: local symbol descriptor table be NULL when applying " + (_("%B: Local symbol descriptor table be NULL when applying " "relocation %s against local symbol"), input_bfd, elfNN_aarch64_howto_table[howto_index].name); abort (); @@ -6050,8 +5783,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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 (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, addend, weak_undef_p); } @@ -6088,8 +5820,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, + globals->root.sgot->output_section->vma + globals->root.sgot->output_offset); - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, 0, weak_undef_p); *unresolved_reloc_p = FALSE; break; @@ -6102,8 +5833,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, return bfd_reloc_notsupported; value = symbol_got_offset (input_bfd, h, r_symndx); - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, 0, weak_undef_p); *unresolved_reloc_p = FALSE; break; @@ -6124,26 +5854,10 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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: - { - 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; - } + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, + signed_addend - dtpoff_base (info), + weak_undef_p); + break; case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: @@ -6161,27 +5875,11 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, 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: - { - 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; - } + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, + signed_addend - tpoff_base (info), + weak_undef_p); + *unresolved_reloc_p = FALSE; + break; case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12: case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: @@ -6196,8 +5894,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, + globals->root.sgotplt->output_offset + globals->sgotplt_jump_table_size); - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, 0, weak_undef_p); *unresolved_reloc_p = FALSE; break; @@ -6215,8 +5912,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, value -= (globals->root.sgot->output_section->vma + globals->root.sgot->output_offset); - value = _bfd_aarch64_elf_resolve_relocation (input_bfd, bfd_r_type, - place, value, + value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, 0, weak_undef_p); *unresolved_reloc_p = FALSE; break; @@ -6265,64 +5961,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, # 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. @@ -6333,9 +5971,8 @@ clear_erratum_843419_entry (struct elf_aarch64_link_hash_table *globals, static bfd_reloc_status_type elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, - bfd *input_bfd, asection *input_section, - bfd_byte *contents, Elf_Internal_Rela *rel, - struct elf_link_hash_entry *h) + bfd *input_bfd, 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); @@ -6343,7 +5980,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, BFD_ASSERT (globals && input_bfd && contents && rel); - switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type)) + switch (elfNN_aarch64_bfd_reloc_from_type (r_type)) { case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: @@ -6356,9 +5993,6 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, 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 @@ -6649,9 +6283,6 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, { 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; @@ -6771,8 +6402,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, r_symndx = ELFNN_R_SYM (rel->r_info); r_type = ELFNN_R_TYPE (rel->r_info); - bfd_reloc.howto = elfNN_aarch64_howto_from_type (input_bfd, r_type); - howto = bfd_reloc.howto; + howto = bfd_reloc.howto = elfNN_aarch64_howto_from_type (r_type); if (howto == NULL) return _bfd_unrecognized_reloc (input_bfd, input_section, r_type); @@ -6842,7 +6472,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, 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 (NULL, sec); + name = bfd_section_name (input_bfd, sec); } if (r_symndx != 0 @@ -6856,11 +6486,11 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, _bfd_error_handler ((sym_type == STT_TLS /* xgettext:c-format */ - ? _("%pB(%pA+%#lx): %s used with TLS symbol %s") + ? _("%B(%A+%#Lx): %s used with TLS symbol %s") /* xgettext:c-format */ - : _("%pB(%pA+%#lx): %s used with non-TLS symbol %s")), + : _("%B(%A+%#Lx): %s used with non-TLS symbol %s")), input_bfd, - input_section, (uint64_t) rel->r_offset, howto->name, name); + input_section, rel->r_offset, howto->name, name); } /* We relax only if we can see that there can be a valid transition @@ -6876,8 +6506,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, 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, input_section, - contents, rel, h); + r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h); unresolved_reloc = 0; } else @@ -6901,7 +6530,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, h, &unresolved_reloc, save_addend, &addend, sym); - switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type)) + switch (elfNN_aarch64_bfd_reloc_from_type (r_type)) { case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: @@ -6944,7 +6573,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc); bfd_reloc_code_real_type real_type = - elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type); + elfNN_aarch64_bfd_reloc_from_type (r_type); if (real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21 || real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21 @@ -7129,9 +6758,8 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%pB(%pA+%#lx): " - "unresolvable %s relocation against symbol `%s'"), - input_bfd, input_section, (uint64_t) rel->r_offset, howto->name, + (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"), + input_bfd, input_section, rel->r_offset, howto->name, h->root.root.string); return FALSE; } @@ -7139,7 +6767,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, if (r != bfd_reloc_ok && r != bfd_reloc_continue) { bfd_reloc_code_real_type real_r_type - = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type); + = elfNN_aarch64_bfd_reloc_from_type (r_type); switch (r) { @@ -7152,7 +6780,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, { (*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; @@ -7170,7 +6798,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, Try to catch this situation here and provide a more helpful error message to the user. */ - if (addend & (((bfd_vma) 1 << howto->rightshift) - 1) + if (addend & ((1 << howto->rightshift) - 1) /* FIXME: Are we testing all of the appropriate reloc types here ? */ && (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL @@ -7182,7 +6810,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, 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; @@ -7325,7 +6953,7 @@ elfNN_aarch64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) for (sec = ibfd->sections; sec != NULL; sec = sec->next) { - if ((bfd_get_section_flags (NULL, sec) + if ((bfd_get_section_flags (ibfd, sec) & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS)) == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS)) only_data_sections = FALSE; @@ -7359,16 +6987,33 @@ elfNN_aarch64_print_private_bfd_data (bfd *abfd, void *ptr) containing valid data. */ /* xgettext:c-format */ - fprintf (file, _("private flags = 0x%lx:"), elf_elfheader (abfd)->e_flags); + fprintf (file, _("private flags = %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 @@ -7554,7 +7199,7 @@ aarch64_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) (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; @@ -7582,7 +7227,8 @@ aarch64_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) { 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; } @@ -7633,7 +7279,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { /* xgettext:c-format */ - _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx); + _bfd_error_handler (_("%B: bad symbol index: %d"), abfd, r_symndx); return FALSE; } @@ -7737,7 +7383,8 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, if (h != NULL /* This is an absolute symbol. It represents a value instead of an address. */ - && (bfd_is_abs_symbol (&h->root) + && ((h->root.type == bfd_link_hash_defined + && bfd_is_abs_section (h->root.u.def.section)) /* This is an undefined symbol. */ || h->root.type == bfd_link_hash_undefined)) break; @@ -7747,7 +7394,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; _bfd_error_handler /* xgettext:c-format */ - (_("%pB: relocation %s against `%s' can not be used when making " + (_("%B: 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"); @@ -7766,7 +7413,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; _bfd_error_handler /* xgettext:c-format */ - (_("%pB: relocation %s against `%s' can not be used when making " + (_("%B: 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"); @@ -7887,7 +7534,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, p = *head; if (p == NULL || p->sec != sec) { - size_t amt = sizeof *p; + bfd_size_type amt = sizeof *p; p = ((struct elf_dyn_relocs *) bfd_zalloc (htab->root.dynobj, amt)); if (p == NULL) @@ -8033,43 +7680,116 @@ elfNN_aarch64_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY); } -/* 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. */ +/* 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_size_type -elfNN_aarch64_maybe_function_sym (const asymbol *sym, asection *sec, - bfd_vma *code_off) +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) { - bfd_size_type size; + const char *filename = NULL; + asymbol *func = NULL; + bfd_vma low_func = 0; + asymbol **p; - if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT - | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0 - || sym->section != sec) - return 0; + for (p = symbols; *p != NULL; p++) + { + elf_symbol_type *q; - if (!(sym->flags & BSF_SYNTHETIC)) - switch (ELF_ST_TYPE (((elf_symbol_type *) sym)->internal_elf_sym.st_info)) - { + q = (elf_symbol_type *) * p; + + switch (ELF_ST_TYPE (q->internal_elf_sym.st_info)) + { + default: + break; + case STT_FILE: + filename = bfd_asymbol_name (&q->symbol); + break; 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; - default: - return 0; - } + } + } - if ((sym->flags & BSF_LOCAL) - && bfd_is_aarch64_special_symbol_name (sym->name, - BFD_AARCH64_SPECIAL_SYM_TYPE_ANY)) - return 0; + 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; - *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; + if (symbols == NULL) + return FALSE; + + if (!aarch64_elf_find_function (abfd, symbols, section, offset, + filename_ptr, functionname_ptr)) + return FALSE; + + *line_ptr = 0; + return TRUE; } static bfd_boolean @@ -8085,6 +7805,19 @@ elfNN_aarch64_find_inliner_info (bfd *abfd, 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, @@ -8109,7 +7842,7 @@ elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSE 0, &sym)) { /* xgettext:c-format */ - _bfd_error_handler (_("%pB symbol number %lu references" + _bfd_error_handler (_("%B symbol number %lu references" " nonexistent SHT_SYMTAB_SHNDX section"), abfd, r_symndx); /* Ideally an error class should be returned here. */ @@ -8360,8 +8093,6 @@ aarch64_map_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr)) return FALSE; break; - case aarch64_stub_none: - break; default: abort (); @@ -8439,7 +8170,7 @@ elfNN_aarch64_new_section_hook (bfd *abfd, asection *sec) if (!sec->used_by_bfd) { _aarch64_elf_section_data *sdata; - size_t amt = sizeof (*sdata); + bfd_size_type amt = sizeof (*sdata); sdata = bfd_zalloc (abfd, amt); if (sdata == NULL) @@ -8567,7 +8298,7 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* 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 += htab->plt_entry_size; + s->size += PLT_SMALL_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. */ @@ -8595,6 +8326,7 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) variant PCS symbols are present. */ if (h->other & STO_AARCH64_VARIANT_PCS) htab->variant_pcs = 1; + } else { @@ -8827,6 +8559,7 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (struct elf_link_hash_entry *h, 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 @@ -8834,7 +8567,7 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (struct elf_link_hash_entry *h, 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, @@ -8844,10 +8577,10 @@ elfNN_aarch64_allocate_ifunc_dynrelocs (struct elf_link_hash_entry *h, } /* Allocate space in .plt, .got and associated reloc sections for - local ifunc dynamic relocs. */ + local dynamic relocs. */ static bfd_boolean -elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf) +elfNN_aarch64_allocate_local_dynrelocs (void **slot, void *inf) { struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) *slot; @@ -8859,24 +8592,26 @@ elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf) || h->root.type != bfd_link_hash_defined) abort (); - return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf); + return elfNN_aarch64_allocate_dynrelocs (h, inf); } -/* Find dynamic relocs for H that apply to read-only sections. */ +/* Allocate space in .plt, .got and associated reloc sections for + local ifunc dynamic relocs. */ -static asection * -readonly_dynrelocs (struct elf_link_hash_entry *h) +static bfd_boolean +elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf) { - struct elf_dyn_relocs *p; + struct elf_link_hash_entry *h + = (struct elf_link_hash_entry *) *slot; - for (p = elf_aarch64_hash_entry (h)->dyn_relocs; p != NULL; p = p->next) - { - asection *s = p->sec->output_section; + if (h->type != STT_GNU_IFUNC + || !h->def_regular + || !h->ref_regular + || !h->forced_local + || h->root.type != bfd_link_hash_defined) + abort (); - if (s != NULL && (s->flags & SEC_READONLY) != 0) - return p->sec; - } - return NULL; + return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf); } /* Set DF_TEXTREL if we find any dynamic relocs that apply to @@ -8906,12 +8641,6 @@ maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p) 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 ! */ @@ -9053,6 +8782,11 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 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, @@ -9070,17 +8804,15 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->tlsdesc_plt) { if (htab->root.splt->size == 0) - htab->root.splt->size += htab->plt_header_size; + htab->root.splt->size += PLT_ENTRY_SIZE; + + htab->tlsdesc_plt = htab->root.splt->size; + htab->root.splt->size += PLT_TLSDESC_ENTRY_SIZE; /* If we're not using lazy TLS relocations, don't generate the - GOT and PLT entry required. */ - if ((info->flags & DF_BIND_NOW)) - htab->tlsdesc_plt = 0; - else + GOT entry required. */ + if (!(info->flags & DF_BIND_NOW)) { - 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; } @@ -9115,7 +8847,7 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Strip this section if we don't need it; see the comment below. */ } - else if (startswith (bfd_section_name (NULL, s), ".rela")) + else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela")) { if (s->size != 0 && s != htab->root.srelplt) relocs = TRUE; @@ -9177,21 +8909,19 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.splt->size != 0) { - if (htab->variant_pcs - && !add_dynamic_entry (DT_AARCH64_VARIANT_PCS, 0)) - return FALSE; - - 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))) + 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; - else if ((elf_aarch64_tdata (output_bfd)->plt_type == PLT_BTI) - && !add_dynamic_entry (DT_AARCH64_BTI_PLT, 0)) + if (htab->variant_pcs + && !add_dynamic_entry (DT_AARCH64_VARIANT_PCS, 0)) return FALSE; - else if ((elf_aarch64_tdata (output_bfd)->plt_type == PLT_PAC) - && !add_dynamic_entry (DT_AARCH64_PAC_PLT, 0)) + if (htab->tlsdesc_plt + && (!add_dynamic_entry (DT_TLSDESC_PLT, 0) + || !add_dynamic_entry (DT_TLSDESC_GOT, 0))) return FALSE; } @@ -9289,13 +9019,7 @@ elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h, gotplt->output_offset + got_offset; /* Copy in the boiler-plate for the PLTn entry. */ - 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; + memcpy (plt_entry, elfNN_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE); /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8. ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ @@ -9513,7 +9237,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_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); @@ -9600,13 +9324,10 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED, bfd_vma plt_base; - 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; + 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; plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma + htab->root.sgotplt->output_offset @@ -9615,24 +9336,18 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED, 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, - plt0_entry + 4, + htab->root.splt->contents + 4, PG (plt_got_2nd_ent) - PG (plt_base + 4)); elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12, - plt0_entry + 8, + htab->root.splt->contents + 8, PG_OFFSET (plt_got_2nd_ent)); elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12, - plt0_entry + 12, + htab->root.splt->contents + 12, PG_OFFSET (plt_got_2nd_ent)); } @@ -9692,7 +9407,6 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, 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; @@ -9708,29 +9422,23 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, { elfNN_aarch64_init_small_plt0_entry (output_bfd, htab); - if (htab->tlsdesc_plt && !(info->flags & DF_BIND_NOW)) + elf_section_data (htab->root.splt->output_section)-> + this_hdr.sh_entsize = htab->plt_entry_size; + + + if (htab->tlsdesc_plt) { - 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, - entry, htab->tlsdesc_plt_entry_size); + elfNN_aarch64_tlsdesc_small_plt_entry, + sizeof (elfNN_aarch64_tlsdesc_small_plt_entry)); { 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; @@ -9747,15 +9455,6 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, 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, @@ -9790,7 +9489,7 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, if (bfd_is_abs_section (htab->root.sgotplt->output_section)) { _bfd_error_handler - (_("discarded output section: `%pA'"), htab->root.sgotplt); + (_("discarded output section: `%A'"), htab->root.sgotplt); return FALSE; } @@ -9834,57 +9533,6 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, 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. */ @@ -9892,27 +9540,7 @@ static bfd_vma elfNN_aarch64_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel ATTRIBUTE_UNUSED) { - 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; + return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE; } /* Returns TRUE if NAME is an AArch64 mapping symbol. @@ -9958,9 +9586,6 @@ elfNN_aarch64_link_setup_gnu_properties (struct bfd_link_info *info) 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; } @@ -9969,38 +9594,14 @@ elfNN_aarch64_link_setup_gnu_properties (struct bfd_link_info *info) 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, - elf_property *aprop, - elf_property *bprop) + bfd *abfd, + bfd *bbfd ATTRIBUTE_UNUSED, + 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); } @@ -10075,8 +9676,8 @@ const struct elf_size_info elfNN_aarch64_size_info = #define bfd_elfNN_find_inliner_info \ elfNN_aarch64_find_inliner_info -#define bfd_elfNN_get_synthetic_symtab \ - elfNN_aarch64_get_synthetic_symtab +#define bfd_elfNN_find_nearest_line \ + elfNN_aarch64_find_nearest_line #define bfd_elfNN_mkobject \ elfNN_aarch64_mkobject @@ -10119,12 +9720,12 @@ const struct elf_size_info elfNN_aarch64_size_info = #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 --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c index b87c8ac..22abce8 100644 --- a/bfd/elfxx-aarch64.c +++ b/bfd/elfxx-aarch64.c @@ -1,5 +1,5 @@ /* AArch64-specific support for ELF. - Copyright (C) 2009-2021 Free Software Foundation, Inc. + Copyright (C) 2009-2018 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of BFD, the Binary File Descriptor library. @@ -19,11 +19,10 @@ 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) @@ -287,18 +286,11 @@ _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 address offset. */ + 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL + which computes the (pc-relative) page base. */ contents = reencode_ldst_pos_imm (contents, addend); break; @@ -310,10 +302,6 @@ _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: @@ -346,9 +334,6 @@ _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: @@ -395,12 +380,10 @@ _bfd_aarch64_elf_put_addend (bfd *abfd, } bfd_vma -_bfd_aarch64_elf_resolve_relocation (bfd *input_bfd, - bfd_reloc_code_real_type r_type, +_bfd_aarch64_elf_resolve_relocation (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: @@ -413,13 +396,6 @@ _bfd_aarch64_elf_resolve_relocation (bfd *input_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: @@ -448,8 +424,6 @@ _bfd_aarch64_elf_resolve_relocation (bfd *input_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: @@ -458,27 +432,18 @@ _bfd_aarch64_elf_resolve_relocation (bfd *input_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; @@ -528,15 +493,7 @@ _bfd_aarch64_elf_resolve_relocation (bfd *input_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; @@ -573,6 +530,25 @@ _bfd_aarch64_elf_resolve_relocation (bfd *input_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 @@ -655,18 +631,7 @@ _bfd_aarch64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_ty 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", @@ -708,7 +673,6 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, bfd *pbfd; bfd *ebfd = NULL; elf_property *prop; - unsigned align; uint32_t gnu_prop = *gprop; @@ -733,11 +697,6 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, 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; @@ -757,11 +716,6 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, 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; } } @@ -882,43 +836,11 @@ _bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info *info break; default: - abort (); + _bfd_error_handler + ( _("error: %pB: "), + abfd, pr_type); + return FALSE; } 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 --git a/bfd/elfxx-aarch64.h b/bfd/elfxx-aarch64.h index 4865725..653b6dd 100644 --- a/bfd/elfxx-aarch64.h +++ b/bfd/elfxx-aarch64.h @@ -1,5 +1,5 @@ /* AArch64-specific backend routines. - Copyright (C) 2009-2021 Free Software Foundation, Inc. + Copyright (C) 2009-2018 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of BFD, the Binary File Descriptor library. @@ -18,77 +18,9 @@ along with this program; see the file COPYING3. If not, see . */ -#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 *); +#include "bfd.h" +#include "elf-bfd.h" +#include "stdint.h" /* Take the PAGE component of an address or offset. */ #define PG(x) ((x) & ~ (bfd_vma) 0xfff) @@ -112,8 +44,13 @@ _bfd_aarch64_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type, reloc_howto_type *, bfd_signed_vma); extern bfd_vma -_bfd_aarch64_elf_resolve_relocation (bfd *, bfd_reloc_code_real_type, bfd_vma, - bfd_vma, bfd_vma, bfd_boolean); +_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 *); extern bfd_boolean _bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *); @@ -124,6 +61,7 @@ _bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *); 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 @@ -141,12 +79,5 @@ _bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info *, bfd *, 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 --git a/ld/testsuite/ld-aarch64/emit-relocs-534.d b/ld/testsuite/ld-aarch64/emit-relocs-534.d index fe59b23..a783901 100644 --- a/ld/testsuite/ld-aarch64/emit-relocs-534.d +++ b/ld/testsuite/ld-aarch64/emit-relocs-534.d @@ -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 --git a/ld/testsuite/ld-aarch64/erratum835769.d b/ld/testsuite/ld-aarch64/erratum835769.d index 5f1ee32..7dcfd7f 100644 --- a/ld/testsuite/ld-aarch64/erratum835769.d +++ b/ld/testsuite/ld-aarch64/erratum835769.d @@ -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 --git a/ld/testsuite/ld-aarch64/erratum843419.d b/ld/testsuite/ld-aarch64/erratum843419.d index b63025b..cad5d5b 100644 --- a/ld/testsuite/ld-aarch64/erratum843419.d +++ b/ld/testsuite/ld-aarch64/erratum843419.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-b-defsym.d b/ld/testsuite/ld-aarch64/farcall-b-defsym.d index f6b0921..4952d4b 100644 --- a/ld/testsuite/ld-aarch64/farcall-b-defsym.d +++ b/ld/testsuite/ld-aarch64/farcall-b-defsym.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-b-none-function.d b/ld/testsuite/ld-aarch64/farcall-b-none-function.d index e06936c..ba2981f 100644 --- a/ld/testsuite/ld-aarch64/farcall-b-none-function.d +++ b/ld/testsuite/ld-aarch64/farcall-b-none-function.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-b-section.d b/ld/testsuite/ld-aarch64/farcall-b-section.d index f91ed40..c6424f8 100644 --- a/ld/testsuite/ld-aarch64/farcall-b-section.d +++ b/ld/testsuite/ld-aarch64/farcall-b-section.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-b.d b/ld/testsuite/ld-aarch64/farcall-b.d index cfa0688..affc8a3 100644 --- a/ld/testsuite/ld-aarch64/farcall-b.d +++ b/ld/testsuite/ld-aarch64/farcall-b.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-back.d b/ld/testsuite/ld-aarch64/farcall-back.d index 20204ee..b24dd64 100644 --- a/ld/testsuite/ld-aarch64/farcall-back.d +++ b/ld/testsuite/ld-aarch64/farcall-back.d @@ -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 +[ \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 -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 +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 -0000000000002050 <__bar1_veneer>: - 2050: d07ffff0 adrp x16, 100000000 - 2054: 91000210 add x16, x16, #0x0 - 2058: d61f0200 br x16 +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 +[ \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 -0000000100002038 <___back_veneer>: - 100002038: 90800010 adrp x16, 2000 <_start\+0x1000> - 10000203c: 91007210 add x16, x16, #0x1c - 100002040: d61f0200 br x16 +00000001000020.. <___back_veneer>: + 1000020..: 90800010 adrp x16, 2000 <_start\+0x1000> + 1000020..: 91007210 add x16, x16, #0x1c + 1000020..: d61f0200 br x16 ... diff --git a/ld/testsuite/ld-aarch64/farcall-bl-defsym.d b/ld/testsuite/ld-aarch64/farcall-bl-defsym.d index 4a3ab80..1ffa007 100644 --- a/ld/testsuite/ld-aarch64/farcall-bl-defsym.d +++ b/ld/testsuite/ld-aarch64/farcall-bl-defsym.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-bl-none-function.d b/ld/testsuite/ld-aarch64/farcall-bl-none-function.d index 4ab9c7e..b6a4dda 100644 --- a/ld/testsuite/ld-aarch64/farcall-bl-none-function.d +++ b/ld/testsuite/ld-aarch64/farcall-bl-none-function.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-bl-section.d b/ld/testsuite/ld-aarch64/farcall-bl-section.d index aa179ec..12cc68c 100644 --- a/ld/testsuite/ld-aarch64/farcall-bl-section.d +++ b/ld/testsuite/ld-aarch64/farcall-bl-section.d @@ -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 --git a/ld/testsuite/ld-aarch64/farcall-bl.d b/ld/testsuite/ld-aarch64/farcall-bl.d index 637225b..75f39cc 100644 --- a/ld/testsuite/ld-aarch64/farcall-bl.d +++ b/ld/testsuite/ld-aarch64/farcall-bl.d @@ -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: diff --git a/ld/testsuite/ld-aarch64/ifunc-21.d b/ld/testsuite/ld-aarch64/ifunc-21.d index 82ae4c4..bd1d8d9 100644 --- a/ld/testsuite/ld-aarch64/ifunc-21.d +++ b/ld/testsuite/ld-aarch64/ifunc-21.d @@ -20,7 +20,7 @@ Disassembly of section .text: .* : .*: 90000080 adrp x0, 10000 <.*> - .*: .* ldr x0, \[x0, #(960|976|1040)\] + .*: .* ldr x0, \[x0, #(896|960|976|1040)\] .*: d65f03c0 ret #pass diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp index a144905..646fe79 100644 --- a/ld/testsuite/ld-elf/shared.exp +++ b/ld/testsuite/ld-elf/shared.exp @@ -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++"}