Fix Sparc, s390 and AArch64 targets so that they can handle relocs against ifunc...
[external/binutils.git] / bfd / elfnn-aarch64.c
1 /* AArch64-specific support for NN-bit ELF.
2    Copyright (C) 2009-2018 Free Software Foundation, Inc.
3    Contributed by ARM Ltd.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; see the file COPYING3. If not,
19    see <http://www.gnu.org/licenses/>.  */
20
21 /* Notes on implementation:
22
23   Thread Local Store (TLS)
24
25   Overview:
26
27   The implementation currently supports both traditional TLS and TLS
28   descriptors, but only general dynamic (GD).
29
30   For traditional TLS the assembler will present us with code
31   fragments of the form:
32
33   adrp x0, :tlsgd:foo
34                            R_AARCH64_TLSGD_ADR_PAGE21(foo)
35   add  x0, :tlsgd_lo12:foo
36                            R_AARCH64_TLSGD_ADD_LO12_NC(foo)
37   bl   __tls_get_addr
38   nop
39
40   For TLS descriptors the assembler will present us with code
41   fragments of the form:
42
43   adrp  x0, :tlsdesc:foo                      R_AARCH64_TLSDESC_ADR_PAGE21(foo)
44   ldr   x1, [x0, #:tlsdesc_lo12:foo]          R_AARCH64_TLSDESC_LD64_LO12(foo)
45   add   x0, x0, #:tlsdesc_lo12:foo            R_AARCH64_TLSDESC_ADD_LO12(foo)
46   .tlsdesccall foo
47   blr   x1                                    R_AARCH64_TLSDESC_CALL(foo)
48
49   The relocations R_AARCH64_TLSGD_{ADR_PREL21,ADD_LO12_NC} against foo
50   indicate that foo is thread local and should be accessed via the
51   traditional TLS mechanims.
52
53   The relocations R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC}
54   against foo indicate that 'foo' is thread local and should be accessed
55   via a TLS descriptor mechanism.
56
57   The precise instruction sequence is only relevant from the
58   perspective of linker relaxation which is currently not implemented.
59
60   The static linker must detect that 'foo' is a TLS object and
61   allocate a double GOT entry. The GOT entry must be created for both
62   global and local TLS symbols. Note that this is different to none
63   TLS local objects which do not need a GOT entry.
64
65   In the traditional TLS mechanism, the double GOT entry is used to
66   provide the tls_index structure, containing module and offset
67   entries. The static linker places the relocation R_AARCH64_TLS_DTPMOD
68   on the module entry. The loader will subsequently fixup this
69   relocation with the module identity.
70
71   For global traditional TLS symbols the static linker places an
72   R_AARCH64_TLS_DTPREL relocation on the offset entry. The loader
73   will subsequently fixup the offset. For local TLS symbols the static
74   linker fixes up offset.
75
76   In the TLS descriptor mechanism the double GOT entry is used to
77   provide the descriptor. The static linker places the relocation
78   R_AARCH64_TLSDESC on the first GOT slot. The loader will
79   subsequently fix this up.
80
81   Implementation:
82
83   The handling of TLS symbols is implemented across a number of
84   different backend functions. The following is a top level view of
85   what processing is performed where.
86
87   The TLS implementation maintains state information for each TLS
88   symbol. The state information for local and global symbols is kept
89   in different places. Global symbols use generic BFD structures while
90   local symbols use backend specific structures that are allocated and
91   maintained entirely by the backend.
92
93   The flow:
94
95   elfNN_aarch64_check_relocs()
96
97   This function is invoked for each relocation.
98
99   The TLS relocations R_AARCH64_TLSGD_{ADR_PREL21,ADD_LO12_NC} and
100   R_AARCH64_TLSDESC_{ADR_PAGE21,LD64_LO12_NC,ADD_LO12_NC} are
101   spotted. One time creation of local symbol data structures are
102   created when the first local symbol is seen.
103
104   The reference count for a symbol is incremented.  The GOT type for
105   each symbol is marked as general dynamic.
106
107   elfNN_aarch64_allocate_dynrelocs ()
108
109   For each global with positive reference count we allocate a double
110   GOT slot. For a traditional TLS symbol we allocate space for two
111   relocation entries on the GOT, for a TLS descriptor symbol we
112   allocate space for one relocation on the slot. Record the GOT offset
113   for this symbol.
114
115   elfNN_aarch64_size_dynamic_sections ()
116
117   Iterate all input BFDS, look for in the local symbol data structure
118   constructed earlier for local TLS symbols and allocate them double
119   GOT slots along with space for a single GOT relocation. Update the
120   local symbol structure to record the GOT offset allocated.
121
122   elfNN_aarch64_relocate_section ()
123
124   Calls elfNN_aarch64_final_link_relocate ()
125
126   Emit the relevant TLS relocations against the GOT for each TLS
127   symbol. For local TLS symbols emit the GOT offset directly. The GOT
128   relocations are emitted once the first time a TLS symbol is
129   encountered. The implementation uses the LSB of the GOT offset to
130   flag that the relevant GOT relocations for a symbol have been
131   emitted. All of the TLS code that uses the GOT offset needs to take
132   care to mask out this flag bit before using the offset.
133
134   elfNN_aarch64_final_link_relocate ()
135
136   Fixup the R_AARCH64_TLSGD_{ADR_PREL21, ADD_LO12_NC} relocations.  */
137
138 #include "sysdep.h"
139 #include "bfd.h"
140 #include "libiberty.h"
141 #include "libbfd.h"
142 #include "bfd_stdint.h"
143 #include "elf-bfd.h"
144 #include "bfdlink.h"
145 #include "objalloc.h"
146 #include "elf/aarch64.h"
147 #include "elfxx-aarch64.h"
148
149 #define ARCH_SIZE       NN
150
151 #if ARCH_SIZE == 64
152 #define AARCH64_R(NAME)         R_AARCH64_ ## NAME
153 #define AARCH64_R_STR(NAME)     "R_AARCH64_" #NAME
154 #define HOWTO64(...)            HOWTO (__VA_ARGS__)
155 #define HOWTO32(...)            EMPTY_HOWTO (0)
156 #define LOG_FILE_ALIGN  3
157 #define BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC BFD_RELOC_AARCH64_TLSDESC_LD64_LO12
158 #endif
159
160 #if ARCH_SIZE == 32
161 #define AARCH64_R(NAME)         R_AARCH64_P32_ ## NAME
162 #define AARCH64_R_STR(NAME)     "R_AARCH64_P32_" #NAME
163 #define HOWTO64(...)            EMPTY_HOWTO (0)
164 #define HOWTO32(...)            HOWTO (__VA_ARGS__)
165 #define LOG_FILE_ALIGN  2
166 #define BFD_RELOC_AARCH64_TLSDESC_LD32_LO12     BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
167 #define R_AARCH64_P32_TLSDESC_ADD_LO12          R_AARCH64_P32_TLSDESC_ADD_LO12_NC
168 #endif
169
170 #define IS_AARCH64_TLS_RELOC(R_TYPE)                            \
171   ((R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC              \
172    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21            \
173    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PREL21            \
174    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC            \
175    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_MOVW_G1               \
176    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21   \
177    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC \
178    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC \
179    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19    \
180    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC   \
181    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1      \
182    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12       \
183    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12       \
184    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC    \
185    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC           \
186    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21            \
187    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21            \
188    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12    \
189    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC \
190    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12    \
191    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC \
192    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12    \
193    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC \
194    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12     \
195    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC  \
196    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0        \
197    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC     \
198    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1        \
199    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC     \
200    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2        \
201    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12        \
202    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12        \
203    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC     \
204    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0         \
205    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC      \
206    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1         \
207    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC      \
208    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2         \
209    || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPMOD                  \
210    || (R_TYPE) == BFD_RELOC_AARCH64_TLS_DTPREL                  \
211    || (R_TYPE) == BFD_RELOC_AARCH64_TLS_TPREL                   \
212    || IS_AARCH64_TLSDESC_RELOC ((R_TYPE)))
213
214 #define IS_AARCH64_TLS_RELAX_RELOC(R_TYPE)                      \
215   ((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD                    \
216    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD_LO12            \
217    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21          \
218    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21          \
219    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_CALL                \
220    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD_PREL19           \
221    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC        \
222    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDR                 \
223    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC           \
224    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G1              \
225    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDR                 \
226    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21            \
227    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADR_PREL21            \
228    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC           \
229    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC            \
230    || (R_TYPE) == BFD_RELOC_AARCH64_TLSGD_MOVW_G1               \
231    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21   \
232    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19    \
233    || (R_TYPE) == BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC \
234    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC           \
235    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21            \
236    || (R_TYPE) == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21)
237
238 #define IS_AARCH64_TLSDESC_RELOC(R_TYPE)                        \
239   ((R_TYPE) == BFD_RELOC_AARCH64_TLSDESC                        \
240    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD                 \
241    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADD_LO12            \
242    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21          \
243    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21          \
244    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_CALL                \
245    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC        \
246    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD64_LO12           \
247    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LDR                 \
248    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_LD_PREL19           \
249    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC           \
250    || (R_TYPE) == BFD_RELOC_AARCH64_TLSDESC_OFF_G1)
251
252 #define ELIMINATE_COPY_RELOCS 1
253
254 /* Return size of a relocation entry.  HTAB is the bfd's
255    elf_aarch64_link_hash_entry.  */
256 #define RELOC_SIZE(HTAB) (sizeof (ElfNN_External_Rela))
257
258 /* GOT Entry size - 8 bytes in ELF64 and 4 bytes in ELF32.  */
259 #define GOT_ENTRY_SIZE                  (ARCH_SIZE / 8)
260 #define PLT_ENTRY_SIZE                  (32)
261 #define PLT_SMALL_ENTRY_SIZE            (16)
262 #define PLT_TLSDESC_ENTRY_SIZE          (32)
263
264 /* Encoding of the nop instruction.  */
265 #define INSN_NOP 0xd503201f
266
267 #define aarch64_compute_jump_table_size(htab)           \
268   (((htab)->root.srelplt == NULL) ? 0                   \
269    : (htab)->root.srelplt->reloc_count * GOT_ENTRY_SIZE)
270
271 /* The first entry in a procedure linkage table looks like this
272    if the distance between the PLTGOT and the PLT is < 4GB use
273    these PLT entries. Note that the dynamic linker gets &PLTGOT[2]
274    in x16 and needs to work out PLTGOT[1] by using an address of
275    [x16,#-GOT_ENTRY_SIZE].  */
276 static const bfd_byte elfNN_aarch64_small_plt0_entry[PLT_ENTRY_SIZE] =
277 {
278   0xf0, 0x7b, 0xbf, 0xa9,       /* stp x16, x30, [sp, #-16]!  */
279   0x10, 0x00, 0x00, 0x90,       /* adrp x16, (GOT+16)  */
280 #if ARCH_SIZE == 64
281   0x11, 0x0A, 0x40, 0xf9,       /* ldr x17, [x16, #PLT_GOT+0x10]  */
282   0x10, 0x42, 0x00, 0x91,       /* add x16, x16,#PLT_GOT+0x10   */
283 #else
284   0x11, 0x0A, 0x40, 0xb9,       /* ldr w17, [x16, #PLT_GOT+0x8]  */
285   0x10, 0x22, 0x00, 0x11,       /* add w16, w16,#PLT_GOT+0x8   */
286 #endif
287   0x20, 0x02, 0x1f, 0xd6,       /* br x17  */
288   0x1f, 0x20, 0x03, 0xd5,       /* nop */
289   0x1f, 0x20, 0x03, 0xd5,       /* nop */
290   0x1f, 0x20, 0x03, 0xd5,       /* nop */
291 };
292
293 /* Per function entry in a procedure linkage table looks like this
294    if the distance between the PLTGOT and the PLT is < 4GB use
295    these PLT entries.  */
296 static const bfd_byte elfNN_aarch64_small_plt_entry[PLT_SMALL_ENTRY_SIZE] =
297 {
298   0x10, 0x00, 0x00, 0x90,       /* adrp x16, PLTGOT + n * 8  */
299 #if ARCH_SIZE == 64
300   0x11, 0x02, 0x40, 0xf9,       /* ldr x17, [x16, PLTGOT + n * 8] */
301   0x10, 0x02, 0x00, 0x91,       /* add x16, x16, :lo12:PLTGOT + n * 8  */
302 #else
303   0x11, 0x02, 0x40, 0xb9,       /* ldr w17, [x16, PLTGOT + n * 4] */
304   0x10, 0x02, 0x00, 0x11,       /* add w16, w16, :lo12:PLTGOT + n * 4  */
305 #endif
306   0x20, 0x02, 0x1f, 0xd6,       /* br x17.  */
307 };
308
309 static const bfd_byte
310 elfNN_aarch64_tlsdesc_small_plt_entry[PLT_TLSDESC_ENTRY_SIZE] =
311 {
312   0xe2, 0x0f, 0xbf, 0xa9,       /* stp x2, x3, [sp, #-16]! */
313   0x02, 0x00, 0x00, 0x90,       /* adrp x2, 0 */
314   0x03, 0x00, 0x00, 0x90,       /* adrp x3, 0 */
315 #if ARCH_SIZE == 64
316   0x42, 0x00, 0x40, 0xf9,       /* ldr x2, [x2, #0] */
317   0x63, 0x00, 0x00, 0x91,       /* add x3, x3, 0 */
318 #else
319   0x42, 0x00, 0x40, 0xb9,       /* ldr w2, [x2, #0] */
320   0x63, 0x00, 0x00, 0x11,       /* add w3, w3, 0 */
321 #endif
322   0x40, 0x00, 0x1f, 0xd6,       /* br x2 */
323   0x1f, 0x20, 0x03, 0xd5,       /* nop */
324   0x1f, 0x20, 0x03, 0xd5,       /* nop */
325 };
326
327 #define elf_info_to_howto               elfNN_aarch64_info_to_howto
328 #define elf_info_to_howto_rel           elfNN_aarch64_info_to_howto
329
330 #define AARCH64_ELF_ABI_VERSION         0
331
332 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
333 #define ALL_ONES (~ (bfd_vma) 0)
334
335 /* Indexed by the bfd interal reloc enumerators.
336    Therefore, the table needs to be synced with BFD_RELOC_AARCH64_*
337    in reloc.c.   */
338
339 static reloc_howto_type elfNN_aarch64_howto_table[] =
340 {
341   EMPTY_HOWTO (0),
342
343   /* Basic data relocations.  */
344
345   /* Deprecated, but retained for backwards compatibility.  */
346   HOWTO64 (R_AARCH64_NULL,      /* type */
347          0,                     /* rightshift */
348          3,                     /* size (0 = byte, 1 = short, 2 = long) */
349          0,                     /* bitsize */
350          FALSE,                 /* pc_relative */
351          0,                     /* bitpos */
352          complain_overflow_dont,        /* complain_on_overflow */
353          bfd_elf_generic_reloc, /* special_function */
354          "R_AARCH64_NULL",      /* name */
355          FALSE,                 /* partial_inplace */
356          0,                     /* src_mask */
357          0,                     /* dst_mask */
358          FALSE),                /* pcrel_offset */
359   HOWTO (R_AARCH64_NONE,        /* type */
360          0,                     /* rightshift */
361          3,                     /* size (0 = byte, 1 = short, 2 = long) */
362          0,                     /* bitsize */
363          FALSE,                 /* pc_relative */
364          0,                     /* bitpos */
365          complain_overflow_dont,        /* complain_on_overflow */
366          bfd_elf_generic_reloc, /* special_function */
367          "R_AARCH64_NONE",      /* name */
368          FALSE,                 /* partial_inplace */
369          0,                     /* src_mask */
370          0,                     /* dst_mask */
371          FALSE),                /* pcrel_offset */
372
373   /* .xword: (S+A) */
374   HOWTO64 (AARCH64_R (ABS64),   /* type */
375          0,                     /* rightshift */
376          4,                     /* size (4 = long long) */
377          64,                    /* bitsize */
378          FALSE,                 /* pc_relative */
379          0,                     /* bitpos */
380          complain_overflow_unsigned,    /* complain_on_overflow */
381          bfd_elf_generic_reloc, /* special_function */
382          AARCH64_R_STR (ABS64), /* name */
383          FALSE,                 /* partial_inplace */
384          ALL_ONES,              /* src_mask */
385          ALL_ONES,              /* dst_mask */
386          FALSE),                /* pcrel_offset */
387
388   /* .word: (S+A) */
389   HOWTO (AARCH64_R (ABS32),     /* type */
390          0,                     /* rightshift */
391          2,                     /* size (0 = byte, 1 = short, 2 = long) */
392          32,                    /* bitsize */
393          FALSE,                 /* pc_relative */
394          0,                     /* bitpos */
395          complain_overflow_unsigned,    /* complain_on_overflow */
396          bfd_elf_generic_reloc, /* special_function */
397          AARCH64_R_STR (ABS32), /* name */
398          FALSE,                 /* partial_inplace */
399          0xffffffff,            /* src_mask */
400          0xffffffff,            /* dst_mask */
401          FALSE),                /* pcrel_offset */
402
403   /* .half:  (S+A) */
404   HOWTO (AARCH64_R (ABS16),     /* type */
405          0,                     /* rightshift */
406          1,                     /* size (0 = byte, 1 = short, 2 = long) */
407          16,                    /* bitsize */
408          FALSE,                 /* pc_relative */
409          0,                     /* bitpos */
410          complain_overflow_unsigned,    /* complain_on_overflow */
411          bfd_elf_generic_reloc, /* special_function */
412          AARCH64_R_STR (ABS16), /* name */
413          FALSE,                 /* partial_inplace */
414          0xffff,                /* src_mask */
415          0xffff,                /* dst_mask */
416          FALSE),                /* pcrel_offset */
417
418   /* .xword: (S+A-P) */
419   HOWTO64 (AARCH64_R (PREL64),  /* type */
420          0,                     /* rightshift */
421          4,                     /* size (4 = long long) */
422          64,                    /* bitsize */
423          TRUE,                  /* pc_relative */
424          0,                     /* bitpos */
425          complain_overflow_signed,      /* complain_on_overflow */
426          bfd_elf_generic_reloc, /* special_function */
427          AARCH64_R_STR (PREL64),        /* name */
428          FALSE,                 /* partial_inplace */
429          ALL_ONES,              /* src_mask */
430          ALL_ONES,              /* dst_mask */
431          TRUE),                 /* pcrel_offset */
432
433   /* .word: (S+A-P) */
434   HOWTO (AARCH64_R (PREL32),    /* type */
435          0,                     /* rightshift */
436          2,                     /* size (0 = byte, 1 = short, 2 = long) */
437          32,                    /* bitsize */
438          TRUE,                  /* pc_relative */
439          0,                     /* bitpos */
440          complain_overflow_signed,      /* complain_on_overflow */
441          bfd_elf_generic_reloc, /* special_function */
442          AARCH64_R_STR (PREL32),        /* name */
443          FALSE,                 /* partial_inplace */
444          0xffffffff,            /* src_mask */
445          0xffffffff,            /* dst_mask */
446          TRUE),                 /* pcrel_offset */
447
448   /* .half: (S+A-P) */
449   HOWTO (AARCH64_R (PREL16),    /* type */
450          0,                     /* rightshift */
451          1,                     /* size (0 = byte, 1 = short, 2 = long) */
452          16,                    /* bitsize */
453          TRUE,                  /* pc_relative */
454          0,                     /* bitpos */
455          complain_overflow_signed,      /* complain_on_overflow */
456          bfd_elf_generic_reloc, /* special_function */
457          AARCH64_R_STR (PREL16),        /* name */
458          FALSE,                 /* partial_inplace */
459          0xffff,                /* src_mask */
460          0xffff,                /* dst_mask */
461          TRUE),                 /* pcrel_offset */
462
463   /* Group relocations to create a 16, 32, 48 or 64 bit
464      unsigned data or abs address inline.  */
465
466   /* MOVZ:   ((S+A) >>  0) & 0xffff */
467   HOWTO (AARCH64_R (MOVW_UABS_G0),      /* type */
468          0,                     /* rightshift */
469          2,                     /* size (0 = byte, 1 = short, 2 = long) */
470          16,                    /* bitsize */
471          FALSE,                 /* pc_relative */
472          0,                     /* bitpos */
473          complain_overflow_unsigned,    /* complain_on_overflow */
474          bfd_elf_generic_reloc, /* special_function */
475          AARCH64_R_STR (MOVW_UABS_G0),  /* name */
476          FALSE,                 /* partial_inplace */
477          0xffff,                /* src_mask */
478          0xffff,                /* dst_mask */
479          FALSE),                /* pcrel_offset */
480
481   /* MOVK:   ((S+A) >>  0) & 0xffff [no overflow check] */
482   HOWTO (AARCH64_R (MOVW_UABS_G0_NC),   /* type */
483          0,                     /* rightshift */
484          2,                     /* size (0 = byte, 1 = short, 2 = long) */
485          16,                    /* bitsize */
486          FALSE,                 /* pc_relative */
487          0,                     /* bitpos */
488          complain_overflow_dont,        /* complain_on_overflow */
489          bfd_elf_generic_reloc, /* special_function */
490          AARCH64_R_STR (MOVW_UABS_G0_NC),       /* name */
491          FALSE,                 /* partial_inplace */
492          0xffff,                /* src_mask */
493          0xffff,                /* dst_mask */
494          FALSE),                /* pcrel_offset */
495
496   /* MOVZ:   ((S+A) >> 16) & 0xffff */
497   HOWTO (AARCH64_R (MOVW_UABS_G1),      /* type */
498          16,                    /* rightshift */
499          2,                     /* size (0 = byte, 1 = short, 2 = long) */
500          16,                    /* bitsize */
501          FALSE,                 /* pc_relative */
502          0,                     /* bitpos */
503          complain_overflow_unsigned,    /* complain_on_overflow */
504          bfd_elf_generic_reloc, /* special_function */
505          AARCH64_R_STR (MOVW_UABS_G1),  /* name */
506          FALSE,                 /* partial_inplace */
507          0xffff,                /* src_mask */
508          0xffff,                /* dst_mask */
509          FALSE),                /* pcrel_offset */
510
511   /* MOVK:   ((S+A) >> 16) & 0xffff [no overflow check] */
512   HOWTO64 (AARCH64_R (MOVW_UABS_G1_NC), /* type */
513          16,                    /* rightshift */
514          2,                     /* size (0 = byte, 1 = short, 2 = long) */
515          16,                    /* bitsize */
516          FALSE,                 /* pc_relative */
517          0,                     /* bitpos */
518          complain_overflow_dont,        /* complain_on_overflow */
519          bfd_elf_generic_reloc, /* special_function */
520          AARCH64_R_STR (MOVW_UABS_G1_NC),       /* name */
521          FALSE,                 /* partial_inplace */
522          0xffff,                /* src_mask */
523          0xffff,                /* dst_mask */
524          FALSE),                /* pcrel_offset */
525
526   /* MOVZ:   ((S+A) >> 32) & 0xffff */
527   HOWTO64 (AARCH64_R (MOVW_UABS_G2),    /* type */
528          32,                    /* rightshift */
529          2,                     /* size (0 = byte, 1 = short, 2 = long) */
530          16,                    /* bitsize */
531          FALSE,                 /* pc_relative */
532          0,                     /* bitpos */
533          complain_overflow_unsigned,    /* complain_on_overflow */
534          bfd_elf_generic_reloc, /* special_function */
535          AARCH64_R_STR (MOVW_UABS_G2),  /* name */
536          FALSE,                 /* partial_inplace */
537          0xffff,                /* src_mask */
538          0xffff,                /* dst_mask */
539          FALSE),                /* pcrel_offset */
540
541   /* MOVK:   ((S+A) >> 32) & 0xffff [no overflow check] */
542   HOWTO64 (AARCH64_R (MOVW_UABS_G2_NC), /* type */
543          32,                    /* rightshift */
544          2,                     /* size (0 = byte, 1 = short, 2 = long) */
545          16,                    /* bitsize */
546          FALSE,                 /* pc_relative */
547          0,                     /* bitpos */
548          complain_overflow_dont,        /* complain_on_overflow */
549          bfd_elf_generic_reloc, /* special_function */
550          AARCH64_R_STR (MOVW_UABS_G2_NC),       /* name */
551          FALSE,                 /* partial_inplace */
552          0xffff,                /* src_mask */
553          0xffff,                /* dst_mask */
554          FALSE),                /* pcrel_offset */
555
556   /* MOVZ:   ((S+A) >> 48) & 0xffff */
557   HOWTO64 (AARCH64_R (MOVW_UABS_G3),    /* type */
558          48,                    /* rightshift */
559          2,                     /* size (0 = byte, 1 = short, 2 = long) */
560          16,                    /* bitsize */
561          FALSE,                 /* pc_relative */
562          0,                     /* bitpos */
563          complain_overflow_unsigned,    /* complain_on_overflow */
564          bfd_elf_generic_reloc, /* special_function */
565          AARCH64_R_STR (MOVW_UABS_G3),  /* name */
566          FALSE,                 /* partial_inplace */
567          0xffff,                /* src_mask */
568          0xffff,                /* dst_mask */
569          FALSE),                /* pcrel_offset */
570
571   /* Group relocations to create high part of a 16, 32, 48 or 64 bit
572      signed data or abs address inline. Will change instruction
573      to MOVN or MOVZ depending on sign of calculated value.  */
574
575   /* MOV[ZN]:   ((S+A) >>  0) & 0xffff */
576   HOWTO (AARCH64_R (MOVW_SABS_G0),      /* type */
577          0,                     /* rightshift */
578          2,                     /* size (0 = byte, 1 = short, 2 = long) */
579          17,                    /* bitsize */
580          FALSE,                 /* pc_relative */
581          0,                     /* bitpos */
582          complain_overflow_signed,      /* complain_on_overflow */
583          bfd_elf_generic_reloc, /* special_function */
584          AARCH64_R_STR (MOVW_SABS_G0),  /* name */
585          FALSE,                 /* partial_inplace */
586          0xffff,                /* src_mask */
587          0xffff,                /* dst_mask */
588          FALSE),                /* pcrel_offset */
589
590   /* MOV[ZN]:   ((S+A) >> 16) & 0xffff */
591   HOWTO64 (AARCH64_R (MOVW_SABS_G1),    /* type */
592          16,                    /* rightshift */
593          2,                     /* size (0 = byte, 1 = short, 2 = long) */
594          17,                    /* bitsize */
595          FALSE,                 /* pc_relative */
596          0,                     /* bitpos */
597          complain_overflow_signed,      /* complain_on_overflow */
598          bfd_elf_generic_reloc, /* special_function */
599          AARCH64_R_STR (MOVW_SABS_G1),  /* name */
600          FALSE,                 /* partial_inplace */
601          0xffff,                /* src_mask */
602          0xffff,                /* dst_mask */
603          FALSE),                /* pcrel_offset */
604
605   /* MOV[ZN]:   ((S+A) >> 32) & 0xffff */
606   HOWTO64 (AARCH64_R (MOVW_SABS_G2),    /* type */
607          32,                    /* rightshift */
608          2,                     /* size (0 = byte, 1 = short, 2 = long) */
609          17,                    /* bitsize */
610          FALSE,                 /* pc_relative */
611          0,                     /* bitpos */
612          complain_overflow_signed,      /* complain_on_overflow */
613          bfd_elf_generic_reloc, /* special_function */
614          AARCH64_R_STR (MOVW_SABS_G2),  /* name */
615          FALSE,                 /* partial_inplace */
616          0xffff,                /* src_mask */
617          0xffff,                /* dst_mask */
618          FALSE),                /* pcrel_offset */
619
620   /* Group relocations to create a 16, 32, 48 or 64 bit
621      PC relative address inline.  */
622
623   /* MOV[NZ]:   ((S+A-P) >>  0) & 0xffff */
624   HOWTO64 (AARCH64_R (MOVW_PREL_G0),    /* type */
625          0,                     /* rightshift */
626          2,                     /* size (0 = byte, 1 = short, 2 = long) */
627          17,                    /* bitsize */
628          TRUE,                  /* pc_relative */
629          0,                     /* bitpos */
630          complain_overflow_signed,      /* complain_on_overflow */
631          bfd_elf_generic_reloc, /* special_function */
632          AARCH64_R_STR (MOVW_PREL_G0),  /* name */
633          FALSE,                 /* partial_inplace */
634          0xffff,                /* src_mask */
635          0xffff,                /* dst_mask */
636          TRUE),         /* pcrel_offset */
637
638   /* MOVK:   ((S+A-P) >>  0) & 0xffff [no overflow check] */
639   HOWTO64 (AARCH64_R (MOVW_PREL_G0_NC), /* type */
640          0,                     /* rightshift */
641          2,                     /* size (0 = byte, 1 = short, 2 = long) */
642          16,                    /* bitsize */
643          TRUE,                  /* pc_relative */
644          0,                     /* bitpos */
645          complain_overflow_dont,        /* complain_on_overflow */
646          bfd_elf_generic_reloc, /* special_function */
647          AARCH64_R_STR (MOVW_PREL_G0_NC),       /* name */
648          FALSE,                 /* partial_inplace */
649          0xffff,                /* src_mask */
650          0xffff,                /* dst_mask */
651          TRUE),         /* pcrel_offset */
652
653   /* MOV[NZ]:   ((S+A-P) >> 16) & 0xffff */
654   HOWTO64 (AARCH64_R (MOVW_PREL_G1),    /* type */
655          16,                    /* rightshift */
656          2,                     /* size (0 = byte, 1 = short, 2 = long) */
657          17,                    /* bitsize */
658          TRUE,                  /* pc_relative */
659          0,                     /* bitpos */
660          complain_overflow_signed,      /* complain_on_overflow */
661          bfd_elf_generic_reloc, /* special_function */
662          AARCH64_R_STR (MOVW_PREL_G1),  /* name */
663          FALSE,                 /* partial_inplace */
664          0xffff,                /* src_mask */
665          0xffff,                /* dst_mask */
666          TRUE),         /* pcrel_offset */
667
668   /* MOVK:   ((S+A-P) >> 16) & 0xffff [no overflow check] */
669   HOWTO64 (AARCH64_R (MOVW_PREL_G1_NC), /* type */
670          16,                    /* rightshift */
671          2,                     /* size (0 = byte, 1 = short, 2 = long) */
672          16,                    /* bitsize */
673          TRUE,                  /* pc_relative */
674          0,                     /* bitpos */
675          complain_overflow_dont,        /* complain_on_overflow */
676          bfd_elf_generic_reloc, /* special_function */
677          AARCH64_R_STR (MOVW_PREL_G1_NC),       /* name */
678          FALSE,                 /* partial_inplace */
679          0xffff,                /* src_mask */
680          0xffff,                /* dst_mask */
681          TRUE),         /* pcrel_offset */
682
683   /* MOV[NZ]:   ((S+A-P) >> 32) & 0xffff */
684   HOWTO64 (AARCH64_R (MOVW_PREL_G2),    /* type */
685          32,                    /* rightshift */
686          2,                     /* size (0 = byte, 1 = short, 2 = long) */
687          17,                    /* bitsize */
688          TRUE,                  /* pc_relative */
689          0,                     /* bitpos */
690          complain_overflow_signed,      /* complain_on_overflow */
691          bfd_elf_generic_reloc, /* special_function */
692          AARCH64_R_STR (MOVW_PREL_G2),  /* name */
693          FALSE,                 /* partial_inplace */
694          0xffff,                /* src_mask */
695          0xffff,                /* dst_mask */
696          TRUE),         /* pcrel_offset */
697
698   /* MOVK:   ((S+A-P) >> 32) & 0xffff [no overflow check] */
699   HOWTO64 (AARCH64_R (MOVW_PREL_G2_NC), /* type */
700          32,                    /* rightshift */
701          2,                     /* size (0 = byte, 1 = short, 2 = long) */
702          16,                    /* bitsize */
703          TRUE,                  /* pc_relative */
704          0,                     /* bitpos */
705          complain_overflow_dont,        /* complain_on_overflow */
706          bfd_elf_generic_reloc, /* special_function */
707          AARCH64_R_STR (MOVW_PREL_G2_NC),       /* name */
708          FALSE,                 /* partial_inplace */
709          0xffff,                /* src_mask */
710          0xffff,                /* dst_mask */
711          TRUE),         /* pcrel_offset */
712
713   /* MOV[NZ]:   ((S+A-P) >> 48) & 0xffff */
714   HOWTO64 (AARCH64_R (MOVW_PREL_G3),    /* type */
715          48,                    /* rightshift */
716          2,                     /* size (0 = byte, 1 = short, 2 = long) */
717          16,                    /* bitsize */
718          TRUE,                  /* pc_relative */
719          0,                     /* bitpos */
720          complain_overflow_dont,        /* complain_on_overflow */
721          bfd_elf_generic_reloc, /* special_function */
722          AARCH64_R_STR (MOVW_PREL_G3),  /* name */
723          FALSE,                 /* partial_inplace */
724          0xffff,                /* src_mask */
725          0xffff,                /* dst_mask */
726          TRUE),         /* pcrel_offset */
727
728 /* Relocations to generate 19, 21 and 33 bit PC-relative load/store
729    addresses: PG(x) is (x & ~0xfff).  */
730
731   /* LD-lit: ((S+A-P) >> 2) & 0x7ffff */
732   HOWTO (AARCH64_R (LD_PREL_LO19),      /* type */
733          2,                     /* rightshift */
734          2,                     /* size (0 = byte, 1 = short, 2 = long) */
735          19,                    /* bitsize */
736          TRUE,                  /* pc_relative */
737          0,                     /* bitpos */
738          complain_overflow_signed,      /* complain_on_overflow */
739          bfd_elf_generic_reloc, /* special_function */
740          AARCH64_R_STR (LD_PREL_LO19),  /* name */
741          FALSE,                 /* partial_inplace */
742          0x7ffff,               /* src_mask */
743          0x7ffff,               /* dst_mask */
744          TRUE),                 /* pcrel_offset */
745
746   /* ADR:    (S+A-P) & 0x1fffff */
747   HOWTO (AARCH64_R (ADR_PREL_LO21),     /* type */
748          0,                     /* rightshift */
749          2,                     /* size (0 = byte, 1 = short, 2 = long) */
750          21,                    /* bitsize */
751          TRUE,                  /* pc_relative */
752          0,                     /* bitpos */
753          complain_overflow_signed,      /* complain_on_overflow */
754          bfd_elf_generic_reloc, /* special_function */
755          AARCH64_R_STR (ADR_PREL_LO21), /* name */
756          FALSE,                 /* partial_inplace */
757          0x1fffff,              /* src_mask */
758          0x1fffff,              /* dst_mask */
759          TRUE),                 /* pcrel_offset */
760
761   /* ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
762   HOWTO (AARCH64_R (ADR_PREL_PG_HI21),  /* type */
763          12,                    /* rightshift */
764          2,                     /* size (0 = byte, 1 = short, 2 = long) */
765          21,                    /* bitsize */
766          TRUE,                  /* pc_relative */
767          0,                     /* bitpos */
768          complain_overflow_signed,      /* complain_on_overflow */
769          bfd_elf_generic_reloc, /* special_function */
770          AARCH64_R_STR (ADR_PREL_PG_HI21),      /* name */
771          FALSE,                 /* partial_inplace */
772          0x1fffff,              /* src_mask */
773          0x1fffff,              /* dst_mask */
774          TRUE),                 /* pcrel_offset */
775
776   /* ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff [no overflow check] */
777   HOWTO64 (AARCH64_R (ADR_PREL_PG_HI21_NC),     /* type */
778          12,                    /* rightshift */
779          2,                     /* size (0 = byte, 1 = short, 2 = long) */
780          21,                    /* bitsize */
781          TRUE,                  /* pc_relative */
782          0,                     /* bitpos */
783          complain_overflow_dont,        /* complain_on_overflow */
784          bfd_elf_generic_reloc, /* special_function */
785          AARCH64_R_STR (ADR_PREL_PG_HI21_NC),   /* name */
786          FALSE,                 /* partial_inplace */
787          0x1fffff,              /* src_mask */
788          0x1fffff,              /* dst_mask */
789          TRUE),                 /* pcrel_offset */
790
791   /* ADD:    (S+A) & 0xfff [no overflow check] */
792   HOWTO (AARCH64_R (ADD_ABS_LO12_NC),   /* type */
793          0,                     /* rightshift */
794          2,                     /* size (0 = byte, 1 = short, 2 = long) */
795          12,                    /* bitsize */
796          FALSE,                 /* pc_relative */
797          10,                    /* bitpos */
798          complain_overflow_dont,        /* complain_on_overflow */
799          bfd_elf_generic_reloc, /* special_function */
800          AARCH64_R_STR (ADD_ABS_LO12_NC),       /* name */
801          FALSE,                 /* partial_inplace */
802          0x3ffc00,              /* src_mask */
803          0x3ffc00,              /* dst_mask */
804          FALSE),                /* pcrel_offset */
805
806   /* LD/ST8:  (S+A) & 0xfff */
807   HOWTO (AARCH64_R (LDST8_ABS_LO12_NC), /* type */
808          0,                     /* rightshift */
809          2,                     /* size (0 = byte, 1 = short, 2 = long) */
810          12,                    /* bitsize */
811          FALSE,                 /* pc_relative */
812          0,                     /* bitpos */
813          complain_overflow_dont,        /* complain_on_overflow */
814          bfd_elf_generic_reloc, /* special_function */
815          AARCH64_R_STR (LDST8_ABS_LO12_NC),     /* name */
816          FALSE,                 /* partial_inplace */
817          0xfff,                 /* src_mask */
818          0xfff,                 /* dst_mask */
819          FALSE),                /* pcrel_offset */
820
821   /* Relocations for control-flow instructions.  */
822
823   /* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff */
824   HOWTO (AARCH64_R (TSTBR14),   /* type */
825          2,                     /* rightshift */
826          2,                     /* size (0 = byte, 1 = short, 2 = long) */
827          14,                    /* bitsize */
828          TRUE,                  /* pc_relative */
829          0,                     /* bitpos */
830          complain_overflow_signed,      /* complain_on_overflow */
831          bfd_elf_generic_reloc, /* special_function */
832          AARCH64_R_STR (TSTBR14),       /* name */
833          FALSE,                 /* partial_inplace */
834          0x3fff,                /* src_mask */
835          0x3fff,                /* dst_mask */
836          TRUE),                 /* pcrel_offset */
837
838   /* B.cond: ((S+A-P) >> 2) & 0x7ffff */
839   HOWTO (AARCH64_R (CONDBR19),  /* type */
840          2,                     /* rightshift */
841          2,                     /* size (0 = byte, 1 = short, 2 = long) */
842          19,                    /* bitsize */
843          TRUE,                  /* pc_relative */
844          0,                     /* bitpos */
845          complain_overflow_signed,      /* complain_on_overflow */
846          bfd_elf_generic_reloc, /* special_function */
847          AARCH64_R_STR (CONDBR19),      /* name */
848          FALSE,                 /* partial_inplace */
849          0x7ffff,               /* src_mask */
850          0x7ffff,               /* dst_mask */
851          TRUE),                 /* pcrel_offset */
852
853   /* B:      ((S+A-P) >> 2) & 0x3ffffff */
854   HOWTO (AARCH64_R (JUMP26),    /* type */
855          2,                     /* rightshift */
856          2,                     /* size (0 = byte, 1 = short, 2 = long) */
857          26,                    /* bitsize */
858          TRUE,                  /* pc_relative */
859          0,                     /* bitpos */
860          complain_overflow_signed,      /* complain_on_overflow */
861          bfd_elf_generic_reloc, /* special_function */
862          AARCH64_R_STR (JUMP26),        /* name */
863          FALSE,                 /* partial_inplace */
864          0x3ffffff,             /* src_mask */
865          0x3ffffff,             /* dst_mask */
866          TRUE),                 /* pcrel_offset */
867
868   /* BL:     ((S+A-P) >> 2) & 0x3ffffff */
869   HOWTO (AARCH64_R (CALL26),    /* type */
870          2,                     /* rightshift */
871          2,                     /* size (0 = byte, 1 = short, 2 = long) */
872          26,                    /* bitsize */
873          TRUE,                  /* pc_relative */
874          0,                     /* bitpos */
875          complain_overflow_signed,      /* complain_on_overflow */
876          bfd_elf_generic_reloc, /* special_function */
877          AARCH64_R_STR (CALL26),        /* name */
878          FALSE,                 /* partial_inplace */
879          0x3ffffff,             /* src_mask */
880          0x3ffffff,             /* dst_mask */
881          TRUE),                 /* pcrel_offset */
882
883   /* LD/ST16:  (S+A) & 0xffe */
884   HOWTO (AARCH64_R (LDST16_ABS_LO12_NC),        /* type */
885          1,                     /* rightshift */
886          2,                     /* size (0 = byte, 1 = short, 2 = long) */
887          12,                    /* bitsize */
888          FALSE,                 /* pc_relative */
889          0,                     /* bitpos */
890          complain_overflow_dont,        /* complain_on_overflow */
891          bfd_elf_generic_reloc, /* special_function */
892          AARCH64_R_STR (LDST16_ABS_LO12_NC),    /* name */
893          FALSE,                 /* partial_inplace */
894          0xffe,                 /* src_mask */
895          0xffe,                 /* dst_mask */
896          FALSE),                /* pcrel_offset */
897
898   /* LD/ST32:  (S+A) & 0xffc */
899   HOWTO (AARCH64_R (LDST32_ABS_LO12_NC),        /* type */
900          2,                     /* rightshift */
901          2,                     /* size (0 = byte, 1 = short, 2 = long) */
902          12,                    /* bitsize */
903          FALSE,                 /* pc_relative */
904          0,                     /* bitpos */
905          complain_overflow_dont,        /* complain_on_overflow */
906          bfd_elf_generic_reloc, /* special_function */
907          AARCH64_R_STR (LDST32_ABS_LO12_NC),    /* name */
908          FALSE,                 /* partial_inplace */
909          0xffc,                 /* src_mask */
910          0xffc,                 /* dst_mask */
911          FALSE),                /* pcrel_offset */
912
913   /* LD/ST64:  (S+A) & 0xff8 */
914   HOWTO (AARCH64_R (LDST64_ABS_LO12_NC),        /* type */
915          3,                     /* rightshift */
916          2,                     /* size (0 = byte, 1 = short, 2 = long) */
917          12,                    /* bitsize */
918          FALSE,                 /* pc_relative */
919          0,                     /* bitpos */
920          complain_overflow_dont,        /* complain_on_overflow */
921          bfd_elf_generic_reloc, /* special_function */
922          AARCH64_R_STR (LDST64_ABS_LO12_NC),    /* name */
923          FALSE,                 /* partial_inplace */
924          0xff8,                 /* src_mask */
925          0xff8,                 /* dst_mask */
926          FALSE),                /* pcrel_offset */
927
928   /* LD/ST128:  (S+A) & 0xff0 */
929   HOWTO (AARCH64_R (LDST128_ABS_LO12_NC),       /* type */
930          4,                     /* rightshift */
931          2,                     /* size (0 = byte, 1 = short, 2 = long) */
932          12,                    /* bitsize */
933          FALSE,                 /* pc_relative */
934          0,                     /* bitpos */
935          complain_overflow_dont,        /* complain_on_overflow */
936          bfd_elf_generic_reloc, /* special_function */
937          AARCH64_R_STR (LDST128_ABS_LO12_NC),   /* name */
938          FALSE,                 /* partial_inplace */
939          0xff0,                 /* src_mask */
940          0xff0,                 /* dst_mask */
941          FALSE),                /* pcrel_offset */
942
943   /* Set a load-literal immediate field to bits
944      0x1FFFFC of G(S)-P */
945   HOWTO (AARCH64_R (GOT_LD_PREL19),     /* type */
946          2,                             /* rightshift */
947          2,                             /* size (0 = byte,1 = short,2 = long) */
948          19,                            /* bitsize */
949          TRUE,                          /* pc_relative */
950          0,                             /* bitpos */
951          complain_overflow_signed,      /* complain_on_overflow */
952          bfd_elf_generic_reloc,         /* special_function */
953          AARCH64_R_STR (GOT_LD_PREL19), /* name */
954          FALSE,                         /* partial_inplace */
955          0xffffe0,                      /* src_mask */
956          0xffffe0,                      /* dst_mask */
957          TRUE),                         /* pcrel_offset */
958
959   /* Get to the page for the GOT entry for the symbol
960      (G(S) - P) using an ADRP instruction.  */
961   HOWTO (AARCH64_R (ADR_GOT_PAGE),      /* type */
962          12,                    /* rightshift */
963          2,                     /* size (0 = byte, 1 = short, 2 = long) */
964          21,                    /* bitsize */
965          TRUE,                  /* pc_relative */
966          0,                     /* bitpos */
967          complain_overflow_dont,        /* complain_on_overflow */
968          bfd_elf_generic_reloc, /* special_function */
969          AARCH64_R_STR (ADR_GOT_PAGE),  /* name */
970          FALSE,                 /* partial_inplace */
971          0x1fffff,              /* src_mask */
972          0x1fffff,              /* dst_mask */
973          TRUE),                 /* pcrel_offset */
974
975   /* LD64: GOT offset G(S) & 0xff8  */
976   HOWTO64 (AARCH64_R (LD64_GOT_LO12_NC),        /* type */
977          3,                     /* rightshift */
978          2,                     /* size (0 = byte, 1 = short, 2 = long) */
979          12,                    /* bitsize */
980          FALSE,                 /* pc_relative */
981          0,                     /* bitpos */
982          complain_overflow_dont,        /* complain_on_overflow */
983          bfd_elf_generic_reloc, /* special_function */
984          AARCH64_R_STR (LD64_GOT_LO12_NC),      /* name */
985          FALSE,                 /* partial_inplace */
986          0xff8,                 /* src_mask */
987          0xff8,                 /* dst_mask */
988          FALSE),                /* pcrel_offset */
989
990   /* LD32: GOT offset G(S) & 0xffc  */
991   HOWTO32 (AARCH64_R (LD32_GOT_LO12_NC),        /* type */
992          2,                     /* rightshift */
993          2,                     /* size (0 = byte, 1 = short, 2 = long) */
994          12,                    /* bitsize */
995          FALSE,                 /* pc_relative */
996          0,                     /* bitpos */
997          complain_overflow_dont,        /* complain_on_overflow */
998          bfd_elf_generic_reloc, /* special_function */
999          AARCH64_R_STR (LD32_GOT_LO12_NC),      /* name */
1000          FALSE,                 /* partial_inplace */
1001          0xffc,                 /* src_mask */
1002          0xffc,                 /* dst_mask */
1003          FALSE),                /* pcrel_offset */
1004
1005   /* Lower 16 bits of GOT offset for the symbol.  */
1006   HOWTO64 (AARCH64_R (MOVW_GOTOFF_G0_NC),       /* type */
1007          0,                     /* rightshift */
1008          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1009          16,                    /* bitsize */
1010          FALSE,                 /* pc_relative */
1011          0,                     /* bitpos */
1012          complain_overflow_dont,        /* complain_on_overflow */
1013          bfd_elf_generic_reloc, /* special_function */
1014          AARCH64_R_STR (MOVW_GOTOFF_G0_NC),     /* name */
1015          FALSE,                 /* partial_inplace */
1016          0xffff,                /* src_mask */
1017          0xffff,                /* dst_mask */
1018          FALSE),                /* pcrel_offset */
1019
1020   /* Higher 16 bits of GOT offset for the symbol.  */
1021   HOWTO64 (AARCH64_R (MOVW_GOTOFF_G1),  /* type */
1022          16,                    /* rightshift */
1023          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1024          16,                    /* bitsize */
1025          FALSE,                 /* pc_relative */
1026          0,                     /* bitpos */
1027          complain_overflow_unsigned,    /* complain_on_overflow */
1028          bfd_elf_generic_reloc, /* special_function */
1029          AARCH64_R_STR (MOVW_GOTOFF_G1),        /* name */
1030          FALSE,                 /* partial_inplace */
1031          0xffff,                /* src_mask */
1032          0xffff,                /* dst_mask */
1033          FALSE),                /* pcrel_offset */
1034
1035   /* LD64: GOT offset for the symbol.  */
1036   HOWTO64 (AARCH64_R (LD64_GOTOFF_LO15),        /* type */
1037          3,                     /* rightshift */
1038          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1039          12,                    /* bitsize */
1040          FALSE,                 /* pc_relative */
1041          0,                     /* bitpos */
1042          complain_overflow_unsigned,    /* complain_on_overflow */
1043          bfd_elf_generic_reloc, /* special_function */
1044          AARCH64_R_STR (LD64_GOTOFF_LO15),      /* name */
1045          FALSE,                 /* partial_inplace */
1046          0x7ff8,                        /* src_mask */
1047          0x7ff8,                        /* dst_mask */
1048          FALSE),                /* pcrel_offset */
1049
1050   /* LD32: GOT offset to the page address of GOT table.
1051      (G(S) - PAGE (_GLOBAL_OFFSET_TABLE_)) & 0x5ffc.  */
1052   HOWTO32 (AARCH64_R (LD32_GOTPAGE_LO14),       /* type */
1053          2,                     /* rightshift */
1054          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1055          12,                    /* bitsize */
1056          FALSE,                 /* pc_relative */
1057          0,                     /* bitpos */
1058          complain_overflow_unsigned,    /* complain_on_overflow */
1059          bfd_elf_generic_reloc, /* special_function */
1060          AARCH64_R_STR (LD32_GOTPAGE_LO14),     /* name */
1061          FALSE,                 /* partial_inplace */
1062          0x5ffc,                /* src_mask */
1063          0x5ffc,                /* dst_mask */
1064          FALSE),                /* pcrel_offset */
1065
1066   /* LD64: GOT offset to the page address of GOT table.
1067      (G(S) - PAGE (_GLOBAL_OFFSET_TABLE_)) & 0x7ff8.  */
1068   HOWTO64 (AARCH64_R (LD64_GOTPAGE_LO15),       /* type */
1069          3,                     /* rightshift */
1070          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1071          12,                    /* bitsize */
1072          FALSE,                 /* pc_relative */
1073          0,                     /* bitpos */
1074          complain_overflow_unsigned,    /* complain_on_overflow */
1075          bfd_elf_generic_reloc, /* special_function */
1076          AARCH64_R_STR (LD64_GOTPAGE_LO15),     /* name */
1077          FALSE,                 /* partial_inplace */
1078          0x7ff8,                /* src_mask */
1079          0x7ff8,                /* dst_mask */
1080          FALSE),                /* pcrel_offset */
1081
1082   /* Get to the page for the GOT entry for the symbol
1083      (G(S) - P) using an ADRP instruction.  */
1084   HOWTO (AARCH64_R (TLSGD_ADR_PAGE21),  /* type */
1085          12,                    /* rightshift */
1086          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1087          21,                    /* bitsize */
1088          TRUE,                  /* pc_relative */
1089          0,                     /* bitpos */
1090          complain_overflow_dont,        /* complain_on_overflow */
1091          bfd_elf_generic_reloc, /* special_function */
1092          AARCH64_R_STR (TLSGD_ADR_PAGE21),      /* name */
1093          FALSE,                 /* partial_inplace */
1094          0x1fffff,              /* src_mask */
1095          0x1fffff,              /* dst_mask */
1096          TRUE),                 /* pcrel_offset */
1097
1098   HOWTO (AARCH64_R (TLSGD_ADR_PREL21),  /* type */
1099          0,                     /* rightshift */
1100          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1101          21,                    /* bitsize */
1102          TRUE,                  /* pc_relative */
1103          0,                     /* bitpos */
1104          complain_overflow_dont,        /* complain_on_overflow */
1105          bfd_elf_generic_reloc, /* special_function */
1106          AARCH64_R_STR (TLSGD_ADR_PREL21),      /* name */
1107          FALSE,                 /* partial_inplace */
1108          0x1fffff,              /* src_mask */
1109          0x1fffff,              /* dst_mask */
1110          TRUE),                 /* pcrel_offset */
1111
1112   /* ADD: GOT offset G(S) & 0xff8 [no overflow check] */
1113   HOWTO (AARCH64_R (TLSGD_ADD_LO12_NC), /* type */
1114          0,                     /* rightshift */
1115          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1116          12,                    /* bitsize */
1117          FALSE,                 /* pc_relative */
1118          0,                     /* bitpos */
1119          complain_overflow_dont,        /* complain_on_overflow */
1120          bfd_elf_generic_reloc, /* special_function */
1121          AARCH64_R_STR (TLSGD_ADD_LO12_NC),     /* name */
1122          FALSE,                 /* partial_inplace */
1123          0xfff,                 /* src_mask */
1124          0xfff,                 /* dst_mask */
1125          FALSE),                /* pcrel_offset */
1126
1127   /* Lower 16 bits of GOT offset to tls_index.  */
1128   HOWTO64 (AARCH64_R (TLSGD_MOVW_G0_NC),        /* type */
1129          0,                     /* rightshift */
1130          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1131          16,                    /* bitsize */
1132          FALSE,                 /* pc_relative */
1133          0,                     /* bitpos */
1134          complain_overflow_dont,        /* complain_on_overflow */
1135          bfd_elf_generic_reloc, /* special_function */
1136          AARCH64_R_STR (TLSGD_MOVW_G0_NC),      /* name */
1137          FALSE,                 /* partial_inplace */
1138          0xffff,                /* src_mask */
1139          0xffff,                /* dst_mask */
1140          FALSE),                /* pcrel_offset */
1141
1142   /* Higher 16 bits of GOT offset to tls_index.  */
1143   HOWTO64 (AARCH64_R (TLSGD_MOVW_G1),   /* type */
1144          16,                    /* rightshift */
1145          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1146          16,                    /* bitsize */
1147          FALSE,                 /* pc_relative */
1148          0,                     /* bitpos */
1149          complain_overflow_unsigned,    /* complain_on_overflow */
1150          bfd_elf_generic_reloc, /* special_function */
1151          AARCH64_R_STR (TLSGD_MOVW_G1), /* name */
1152          FALSE,                 /* partial_inplace */
1153          0xffff,                /* src_mask */
1154          0xffff,                /* dst_mask */
1155          FALSE),                /* pcrel_offset */
1156
1157   HOWTO (AARCH64_R (TLSIE_ADR_GOTTPREL_PAGE21), /* type */
1158          12,                    /* rightshift */
1159          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1160          21,                    /* bitsize */
1161          FALSE,                 /* pc_relative */
1162          0,                     /* bitpos */
1163          complain_overflow_dont,        /* complain_on_overflow */
1164          bfd_elf_generic_reloc, /* special_function */
1165          AARCH64_R_STR (TLSIE_ADR_GOTTPREL_PAGE21),     /* name */
1166          FALSE,                 /* partial_inplace */
1167          0x1fffff,              /* src_mask */
1168          0x1fffff,              /* dst_mask */
1169          FALSE),                /* pcrel_offset */
1170
1171   HOWTO64 (AARCH64_R (TLSIE_LD64_GOTTPREL_LO12_NC),     /* type */
1172          3,                     /* rightshift */
1173          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1174          12,                    /* bitsize */
1175          FALSE,                 /* pc_relative */
1176          0,                     /* bitpos */
1177          complain_overflow_dont,        /* complain_on_overflow */
1178          bfd_elf_generic_reloc, /* special_function */
1179          AARCH64_R_STR (TLSIE_LD64_GOTTPREL_LO12_NC),   /* name */
1180          FALSE,                 /* partial_inplace */
1181          0xff8,                 /* src_mask */
1182          0xff8,                 /* dst_mask */
1183          FALSE),                /* pcrel_offset */
1184
1185   HOWTO32 (AARCH64_R (TLSIE_LD32_GOTTPREL_LO12_NC),     /* type */
1186          2,                     /* rightshift */
1187          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1188          12,                    /* bitsize */
1189          FALSE,                 /* pc_relative */
1190          0,                     /* bitpos */
1191          complain_overflow_dont,        /* complain_on_overflow */
1192          bfd_elf_generic_reloc, /* special_function */
1193          AARCH64_R_STR (TLSIE_LD32_GOTTPREL_LO12_NC),   /* name */
1194          FALSE,                 /* partial_inplace */
1195          0xffc,                 /* src_mask */
1196          0xffc,                 /* dst_mask */
1197          FALSE),                /* pcrel_offset */
1198
1199   HOWTO (AARCH64_R (TLSIE_LD_GOTTPREL_PREL19),  /* type */
1200          2,                     /* rightshift */
1201          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1202          19,                    /* bitsize */
1203          FALSE,                 /* pc_relative */
1204          0,                     /* bitpos */
1205          complain_overflow_dont,        /* complain_on_overflow */
1206          bfd_elf_generic_reloc, /* special_function */
1207          AARCH64_R_STR (TLSIE_LD_GOTTPREL_PREL19),      /* name */
1208          FALSE,                 /* partial_inplace */
1209          0x1ffffc,              /* src_mask */
1210          0x1ffffc,              /* dst_mask */
1211          FALSE),                /* pcrel_offset */
1212
1213   HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G0_NC),       /* type */
1214          0,                     /* rightshift */
1215          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1216          16,                    /* bitsize */
1217          FALSE,                 /* pc_relative */
1218          0,                     /* bitpos */
1219          complain_overflow_dont,        /* complain_on_overflow */
1220          bfd_elf_generic_reloc, /* special_function */
1221          AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G0_NC),     /* name */
1222          FALSE,                 /* partial_inplace */
1223          0xffff,                /* src_mask */
1224          0xffff,                /* dst_mask */
1225          FALSE),                /* pcrel_offset */
1226
1227   HOWTO64 (AARCH64_R (TLSIE_MOVW_GOTTPREL_G1),  /* type */
1228          16,                    /* rightshift */
1229          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1230          16,                    /* bitsize */
1231          FALSE,                 /* pc_relative */
1232          0,                     /* bitpos */
1233          complain_overflow_unsigned,    /* complain_on_overflow */
1234          bfd_elf_generic_reloc, /* special_function */
1235          AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G1),        /* name */
1236          FALSE,                 /* partial_inplace */
1237          0xffff,                /* src_mask */
1238          0xffff,                /* dst_mask */
1239          FALSE),                /* pcrel_offset */
1240
1241   /* ADD: bit[23:12] of byte offset to module TLS base address.  */
1242   HOWTO (AARCH64_R (TLSLD_ADD_DTPREL_HI12),     /* type */
1243          12,                    /* rightshift */
1244          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1245          12,                    /* bitsize */
1246          FALSE,                 /* pc_relative */
1247          0,                     /* bitpos */
1248          complain_overflow_unsigned,    /* complain_on_overflow */
1249          bfd_elf_generic_reloc, /* special_function */
1250          AARCH64_R_STR (TLSLD_ADD_DTPREL_HI12), /* name */
1251          FALSE,                 /* partial_inplace */
1252          0xfff,                 /* src_mask */
1253          0xfff,                 /* dst_mask */
1254          FALSE),                /* pcrel_offset */
1255
1256   /* Unsigned 12 bit byte offset to module TLS base address.  */
1257   HOWTO (AARCH64_R (TLSLD_ADD_DTPREL_LO12),     /* type */
1258          0,                     /* rightshift */
1259          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1260          12,                    /* bitsize */
1261          FALSE,                 /* pc_relative */
1262          0,                     /* bitpos */
1263          complain_overflow_unsigned,    /* complain_on_overflow */
1264          bfd_elf_generic_reloc, /* special_function */
1265          AARCH64_R_STR (TLSLD_ADD_DTPREL_LO12), /* name */
1266          FALSE,                 /* partial_inplace */
1267          0xfff,                 /* src_mask */
1268          0xfff,                 /* dst_mask */
1269          FALSE),                /* pcrel_offset */
1270
1271   /* No overflow check version of BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12.  */
1272   HOWTO (AARCH64_R (TLSLD_ADD_DTPREL_LO12_NC),  /* type */
1273          0,                     /* rightshift */
1274          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1275          12,                    /* bitsize */
1276          FALSE,                 /* pc_relative */
1277          0,                     /* bitpos */
1278          complain_overflow_dont,        /* complain_on_overflow */
1279          bfd_elf_generic_reloc, /* special_function */
1280          AARCH64_R_STR (TLSLD_ADD_DTPREL_LO12_NC),      /* name */
1281          FALSE,                 /* partial_inplace */
1282          0xfff,                 /* src_mask */
1283          0xfff,                 /* dst_mask */
1284          FALSE),                /* pcrel_offset */
1285
1286   /* ADD: GOT offset G(S) & 0xff8 [no overflow check] */
1287   HOWTO (AARCH64_R (TLSLD_ADD_LO12_NC), /* type */
1288          0,                     /* rightshift */
1289          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1290          12,                    /* bitsize */
1291          FALSE,                 /* pc_relative */
1292          0,                     /* bitpos */
1293          complain_overflow_dont,        /* complain_on_overflow */
1294          bfd_elf_generic_reloc, /* special_function */
1295          AARCH64_R_STR (TLSLD_ADD_LO12_NC),     /* name */
1296          FALSE,                 /* partial_inplace */
1297          0xfff,                 /* src_mask */
1298          0xfff,                 /* dst_mask */
1299          FALSE),                /* pcrel_offset */
1300
1301   /* Get to the page for the GOT entry for the symbol
1302      (G(S) - P) using an ADRP instruction.  */
1303   HOWTO (AARCH64_R (TLSLD_ADR_PAGE21),  /* type */
1304          12,                    /* rightshift */
1305          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1306          21,                    /* bitsize */
1307          TRUE,                  /* pc_relative */
1308          0,                     /* bitpos */
1309          complain_overflow_signed,      /* complain_on_overflow */
1310          bfd_elf_generic_reloc, /* special_function */
1311          AARCH64_R_STR (TLSLD_ADR_PAGE21),      /* name */
1312          FALSE,                 /* partial_inplace */
1313          0x1fffff,              /* src_mask */
1314          0x1fffff,              /* dst_mask */
1315          TRUE),                 /* pcrel_offset */
1316
1317   HOWTO (AARCH64_R (TLSLD_ADR_PREL21),  /* type */
1318          0,                     /* rightshift */
1319          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1320          21,                    /* bitsize */
1321          TRUE,                  /* pc_relative */
1322          0,                     /* bitpos */
1323          complain_overflow_signed,      /* complain_on_overflow */
1324          bfd_elf_generic_reloc, /* special_function */
1325          AARCH64_R_STR (TLSLD_ADR_PREL21),      /* name */
1326          FALSE,                 /* partial_inplace */
1327          0x1fffff,              /* src_mask */
1328          0x1fffff,              /* dst_mask */
1329          TRUE),                 /* pcrel_offset */
1330
1331   /* LD/ST16: bit[11:1] of byte offset to module TLS base address.  */
1332   HOWTO64 (AARCH64_R (TLSLD_LDST16_DTPREL_LO12),        /* type */
1333          1,                     /* rightshift */
1334          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1335          11,                    /* bitsize */
1336          FALSE,                 /* pc_relative */
1337          10,                    /* bitpos */
1338          complain_overflow_unsigned,    /* complain_on_overflow */
1339          bfd_elf_generic_reloc, /* special_function */
1340          AARCH64_R_STR (TLSLD_LDST16_DTPREL_LO12),      /* name */
1341          FALSE,                 /* partial_inplace */
1342          0x1ffc00,              /* src_mask */
1343          0x1ffc00,              /* dst_mask */
1344          FALSE),                /* pcrel_offset */
1345
1346   /* Same as BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12, but no overflow check.  */
1347   HOWTO64 (AARCH64_R (TLSLD_LDST16_DTPREL_LO12_NC),     /* type */
1348          1,                     /* rightshift */
1349          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1350          11,                    /* bitsize */
1351          FALSE,                 /* pc_relative */
1352          10,                    /* bitpos */
1353          complain_overflow_dont,        /* complain_on_overflow */
1354          bfd_elf_generic_reloc, /* special_function */
1355          AARCH64_R_STR (TLSLD_LDST16_DTPREL_LO12_NC),   /* name */
1356          FALSE,                 /* partial_inplace */
1357          0x1ffc00,              /* src_mask */
1358          0x1ffc00,              /* dst_mask */
1359          FALSE),                /* pcrel_offset */
1360
1361   /* LD/ST32: bit[11:2] of byte offset to module TLS base address.  */
1362   HOWTO64 (AARCH64_R (TLSLD_LDST32_DTPREL_LO12),        /* type */
1363          2,                     /* rightshift */
1364          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1365          10,                    /* bitsize */
1366          FALSE,                 /* pc_relative */
1367          10,                    /* bitpos */
1368          complain_overflow_unsigned,    /* complain_on_overflow */
1369          bfd_elf_generic_reloc, /* special_function */
1370          AARCH64_R_STR (TLSLD_LDST32_DTPREL_LO12),      /* name */
1371          FALSE,                 /* partial_inplace */
1372          0x3ffc00,              /* src_mask */
1373          0x3ffc00,              /* dst_mask */
1374          FALSE),                /* pcrel_offset */
1375
1376   /* Same as BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12, but no overflow check.  */
1377   HOWTO64 (AARCH64_R (TLSLD_LDST32_DTPREL_LO12_NC),     /* type */
1378          2,                     /* rightshift */
1379          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1380          10,                    /* bitsize */
1381          FALSE,                 /* pc_relative */
1382          10,                    /* bitpos */
1383          complain_overflow_dont,        /* complain_on_overflow */
1384          bfd_elf_generic_reloc, /* special_function */
1385          AARCH64_R_STR (TLSLD_LDST32_DTPREL_LO12_NC),   /* name */
1386          FALSE,                 /* partial_inplace */
1387          0xffc00,               /* src_mask */
1388          0xffc00,               /* dst_mask */
1389          FALSE),                /* pcrel_offset */
1390
1391   /* LD/ST64: bit[11:3] of byte offset to module TLS base address.  */
1392   HOWTO64 (AARCH64_R (TLSLD_LDST64_DTPREL_LO12),        /* type */
1393          3,                     /* rightshift */
1394          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1395          9,                     /* bitsize */
1396          FALSE,                 /* pc_relative */
1397          10,                    /* bitpos */
1398          complain_overflow_unsigned,    /* complain_on_overflow */
1399          bfd_elf_generic_reloc, /* special_function */
1400          AARCH64_R_STR (TLSLD_LDST64_DTPREL_LO12),      /* name */
1401          FALSE,                 /* partial_inplace */
1402          0x3ffc00,              /* src_mask */
1403          0x3ffc00,              /* dst_mask */
1404          FALSE),                /* pcrel_offset */
1405
1406   /* Same as BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12, but no overflow check.  */
1407   HOWTO64 (AARCH64_R (TLSLD_LDST64_DTPREL_LO12_NC),     /* type */
1408          3,                     /* rightshift */
1409          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1410          9,                     /* bitsize */
1411          FALSE,                 /* pc_relative */
1412          10,                    /* bitpos */
1413          complain_overflow_dont,        /* complain_on_overflow */
1414          bfd_elf_generic_reloc, /* special_function */
1415          AARCH64_R_STR (TLSLD_LDST64_DTPREL_LO12_NC),   /* name */
1416          FALSE,                 /* partial_inplace */
1417          0x7fc00,               /* src_mask */
1418          0x7fc00,               /* dst_mask */
1419          FALSE),                /* pcrel_offset */
1420
1421   /* LD/ST8: bit[11:0] of byte offset to module TLS base address.  */
1422   HOWTO64 (AARCH64_R (TLSLD_LDST8_DTPREL_LO12), /* type */
1423          0,                     /* rightshift */
1424          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1425          12,                    /* bitsize */
1426          FALSE,                 /* pc_relative */
1427          10,                    /* bitpos */
1428          complain_overflow_unsigned,    /* complain_on_overflow */
1429          bfd_elf_generic_reloc, /* special_function */
1430          AARCH64_R_STR (TLSLD_LDST8_DTPREL_LO12),       /* name */
1431          FALSE,                 /* partial_inplace */
1432          0x3ffc00,              /* src_mask */
1433          0x3ffc00,              /* dst_mask */
1434          FALSE),                /* pcrel_offset */
1435
1436   /* Same as BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12, but no overflow check.  */
1437   HOWTO64 (AARCH64_R (TLSLD_LDST8_DTPREL_LO12_NC),      /* type */
1438          0,                     /* rightshift */
1439          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1440          12,                    /* bitsize */
1441          FALSE,                 /* pc_relative */
1442          10,                    /* bitpos */
1443          complain_overflow_dont,        /* complain_on_overflow */
1444          bfd_elf_generic_reloc, /* special_function */
1445          AARCH64_R_STR (TLSLD_LDST8_DTPREL_LO12_NC),    /* name */
1446          FALSE,                 /* partial_inplace */
1447          0x3ffc00,              /* src_mask */
1448          0x3ffc00,              /* dst_mask */
1449          FALSE),                /* pcrel_offset */
1450
1451   /* MOVZ: bit[15:0] of byte offset to module TLS base address.  */
1452   HOWTO (AARCH64_R (TLSLD_MOVW_DTPREL_G0),      /* type */
1453          0,                     /* rightshift */
1454          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1455          16,                    /* bitsize */
1456          FALSE,                 /* pc_relative */
1457          0,                     /* bitpos */
1458          complain_overflow_unsigned,    /* complain_on_overflow */
1459          bfd_elf_generic_reloc, /* special_function */
1460          AARCH64_R_STR (TLSLD_MOVW_DTPREL_G0),  /* name */
1461          FALSE,                 /* partial_inplace */
1462          0xffff,                /* src_mask */
1463          0xffff,                /* dst_mask */
1464          FALSE),                /* pcrel_offset */
1465
1466   /* No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0.  */
1467   HOWTO (AARCH64_R (TLSLD_MOVW_DTPREL_G0_NC),   /* type */
1468          0,                     /* rightshift */
1469          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1470          16,                    /* bitsize */
1471          FALSE,                 /* pc_relative */
1472          0,                     /* bitpos */
1473          complain_overflow_dont,        /* complain_on_overflow */
1474          bfd_elf_generic_reloc, /* special_function */
1475          AARCH64_R_STR (TLSLD_MOVW_DTPREL_G0_NC),       /* name */
1476          FALSE,                 /* partial_inplace */
1477          0xffff,                /* src_mask */
1478          0xffff,                /* dst_mask */
1479          FALSE),                /* pcrel_offset */
1480
1481   /* MOVZ: bit[31:16] of byte offset to module TLS base address.  */
1482   HOWTO (AARCH64_R (TLSLD_MOVW_DTPREL_G1),      /* type */
1483          16,                    /* rightshift */
1484          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1485          16,                    /* bitsize */
1486          FALSE,                 /* pc_relative */
1487          0,                     /* bitpos */
1488          complain_overflow_unsigned,    /* complain_on_overflow */
1489          bfd_elf_generic_reloc, /* special_function */
1490          AARCH64_R_STR (TLSLD_MOVW_DTPREL_G1),  /* name */
1491          FALSE,                 /* partial_inplace */
1492          0xffff,                /* src_mask */
1493          0xffff,                /* dst_mask */
1494          FALSE),                /* pcrel_offset */
1495
1496   /* No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1.  */
1497   HOWTO64 (AARCH64_R (TLSLD_MOVW_DTPREL_G1_NC), /* type */
1498          16,                    /* rightshift */
1499          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1500          16,                    /* bitsize */
1501          FALSE,                 /* pc_relative */
1502          0,                     /* bitpos */
1503          complain_overflow_dont,        /* complain_on_overflow */
1504          bfd_elf_generic_reloc, /* special_function */
1505          AARCH64_R_STR (TLSLD_MOVW_DTPREL_G1_NC),       /* name */
1506          FALSE,                 /* partial_inplace */
1507          0xffff,                /* src_mask */
1508          0xffff,                /* dst_mask */
1509          FALSE),                /* pcrel_offset */
1510
1511   /* MOVZ: bit[47:32] of byte offset to module TLS base address.  */
1512   HOWTO64 (AARCH64_R (TLSLD_MOVW_DTPREL_G2),    /* type */
1513          32,                    /* rightshift */
1514          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1515          16,                    /* bitsize */
1516          FALSE,                 /* pc_relative */
1517          0,                     /* bitpos */
1518          complain_overflow_unsigned,    /* complain_on_overflow */
1519          bfd_elf_generic_reloc, /* special_function */
1520          AARCH64_R_STR (TLSLD_MOVW_DTPREL_G2),  /* name */
1521          FALSE,                 /* partial_inplace */
1522          0xffff,                /* src_mask */
1523          0xffff,                /* dst_mask */
1524          FALSE),                /* pcrel_offset */
1525
1526   HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G2),     /* type */
1527          32,                    /* rightshift */
1528          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1529          16,                    /* bitsize */
1530          FALSE,                 /* pc_relative */
1531          0,                     /* bitpos */
1532          complain_overflow_unsigned,    /* complain_on_overflow */
1533          bfd_elf_generic_reloc, /* special_function */
1534          AARCH64_R_STR (TLSLE_MOVW_TPREL_G2),   /* name */
1535          FALSE,                 /* partial_inplace */
1536          0xffff,                /* src_mask */
1537          0xffff,                /* dst_mask */
1538          FALSE),                /* pcrel_offset */
1539
1540   HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G1),       /* type */
1541          16,                    /* rightshift */
1542          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1543          16,                    /* bitsize */
1544          FALSE,                 /* pc_relative */
1545          0,                     /* bitpos */
1546          complain_overflow_dont,        /* complain_on_overflow */
1547          bfd_elf_generic_reloc, /* special_function */
1548          AARCH64_R_STR (TLSLE_MOVW_TPREL_G1),   /* name */
1549          FALSE,                 /* partial_inplace */
1550          0xffff,                /* src_mask */
1551          0xffff,                /* dst_mask */
1552          FALSE),                /* pcrel_offset */
1553
1554   HOWTO64 (AARCH64_R (TLSLE_MOVW_TPREL_G1_NC),  /* type */
1555          16,                    /* rightshift */
1556          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1557          16,                    /* bitsize */
1558          FALSE,                 /* pc_relative */
1559          0,                     /* bitpos */
1560          complain_overflow_dont,        /* complain_on_overflow */
1561          bfd_elf_generic_reloc, /* special_function */
1562          AARCH64_R_STR (TLSLE_MOVW_TPREL_G1_NC),        /* name */
1563          FALSE,                 /* partial_inplace */
1564          0xffff,                /* src_mask */
1565          0xffff,                /* dst_mask */
1566          FALSE),                /* pcrel_offset */
1567
1568   HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0),       /* type */
1569          0,                     /* rightshift */
1570          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1571          16,                    /* bitsize */
1572          FALSE,                 /* pc_relative */
1573          0,                     /* bitpos */
1574          complain_overflow_dont,        /* complain_on_overflow */
1575          bfd_elf_generic_reloc, /* special_function */
1576          AARCH64_R_STR (TLSLE_MOVW_TPREL_G0),   /* name */
1577          FALSE,                 /* partial_inplace */
1578          0xffff,                /* src_mask */
1579          0xffff,                /* dst_mask */
1580          FALSE),                /* pcrel_offset */
1581
1582   HOWTO (AARCH64_R (TLSLE_MOVW_TPREL_G0_NC),    /* type */
1583          0,                     /* rightshift */
1584          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1585          16,                    /* bitsize */
1586          FALSE,                 /* pc_relative */
1587          0,                     /* bitpos */
1588          complain_overflow_dont,        /* complain_on_overflow */
1589          bfd_elf_generic_reloc, /* special_function */
1590          AARCH64_R_STR (TLSLE_MOVW_TPREL_G0_NC),        /* name */
1591          FALSE,                 /* partial_inplace */
1592          0xffff,                /* src_mask */
1593          0xffff,                /* dst_mask */
1594          FALSE),                /* pcrel_offset */
1595
1596   HOWTO (AARCH64_R (TLSLE_ADD_TPREL_HI12),      /* type */
1597          12,                    /* rightshift */
1598          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1599          12,                    /* bitsize */
1600          FALSE,                 /* pc_relative */
1601          0,                     /* bitpos */
1602          complain_overflow_unsigned,    /* complain_on_overflow */
1603          bfd_elf_generic_reloc, /* special_function */
1604          AARCH64_R_STR (TLSLE_ADD_TPREL_HI12),  /* name */
1605          FALSE,                 /* partial_inplace */
1606          0xfff,                 /* src_mask */
1607          0xfff,                 /* dst_mask */
1608          FALSE),                /* pcrel_offset */
1609
1610   HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12),      /* type */
1611          0,                     /* rightshift */
1612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1613          12,                    /* bitsize */
1614          FALSE,                 /* pc_relative */
1615          0,                     /* bitpos */
1616          complain_overflow_unsigned,    /* complain_on_overflow */
1617          bfd_elf_generic_reloc, /* special_function */
1618          AARCH64_R_STR (TLSLE_ADD_TPREL_LO12),  /* name */
1619          FALSE,                 /* partial_inplace */
1620          0xfff,                 /* src_mask */
1621          0xfff,                 /* dst_mask */
1622          FALSE),                /* pcrel_offset */
1623
1624   HOWTO (AARCH64_R (TLSLE_ADD_TPREL_LO12_NC),   /* type */
1625          0,                     /* rightshift */
1626          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1627          12,                    /* bitsize */
1628          FALSE,                 /* pc_relative */
1629          0,                     /* bitpos */
1630          complain_overflow_dont,        /* complain_on_overflow */
1631          bfd_elf_generic_reloc, /* special_function */
1632          AARCH64_R_STR (TLSLE_ADD_TPREL_LO12_NC),       /* name */
1633          FALSE,                 /* partial_inplace */
1634          0xfff,                 /* src_mask */
1635          0xfff,                 /* dst_mask */
1636          FALSE),                /* pcrel_offset */
1637
1638   HOWTO (AARCH64_R (TLSDESC_LD_PREL19), /* type */
1639          2,                     /* rightshift */
1640          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1641          19,                    /* bitsize */
1642          TRUE,                  /* pc_relative */
1643          0,                     /* bitpos */
1644          complain_overflow_dont,        /* complain_on_overflow */
1645          bfd_elf_generic_reloc, /* special_function */
1646          AARCH64_R_STR (TLSDESC_LD_PREL19),     /* name */
1647          FALSE,                 /* partial_inplace */
1648          0x0ffffe0,             /* src_mask */
1649          0x0ffffe0,             /* dst_mask */
1650          TRUE),                 /* pcrel_offset */
1651
1652   HOWTO (AARCH64_R (TLSDESC_ADR_PREL21),        /* type */
1653          0,                     /* rightshift */
1654          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1655          21,                    /* bitsize */
1656          TRUE,                  /* pc_relative */
1657          0,                     /* bitpos */
1658          complain_overflow_dont,        /* complain_on_overflow */
1659          bfd_elf_generic_reloc, /* special_function */
1660          AARCH64_R_STR (TLSDESC_ADR_PREL21),    /* name */
1661          FALSE,                 /* partial_inplace */
1662          0x1fffff,              /* src_mask */
1663          0x1fffff,              /* dst_mask */
1664          TRUE),                 /* pcrel_offset */
1665
1666   /* Get to the page for the GOT entry for the symbol
1667      (G(S) - P) using an ADRP instruction.  */
1668   HOWTO (AARCH64_R (TLSDESC_ADR_PAGE21),        /* type */
1669          12,                    /* rightshift */
1670          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1671          21,                    /* bitsize */
1672          TRUE,                  /* pc_relative */
1673          0,                     /* bitpos */
1674          complain_overflow_dont,        /* complain_on_overflow */
1675          bfd_elf_generic_reloc, /* special_function */
1676          AARCH64_R_STR (TLSDESC_ADR_PAGE21),    /* name */
1677          FALSE,                 /* partial_inplace */
1678          0x1fffff,              /* src_mask */
1679          0x1fffff,              /* dst_mask */
1680          TRUE),                 /* pcrel_offset */
1681
1682   /* LD64: GOT offset G(S) & 0xff8.  */
1683   HOWTO64 (AARCH64_R (TLSDESC_LD64_LO12),       /* type */
1684          3,                     /* rightshift */
1685          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1686          12,                    /* bitsize */
1687          FALSE,                 /* pc_relative */
1688          0,                     /* bitpos */
1689          complain_overflow_dont,        /* complain_on_overflow */
1690          bfd_elf_generic_reloc, /* special_function */
1691          AARCH64_R_STR (TLSDESC_LD64_LO12),     /* name */
1692          FALSE,                 /* partial_inplace */
1693          0xff8,                 /* src_mask */
1694          0xff8,                 /* dst_mask */
1695          FALSE),                /* pcrel_offset */
1696
1697   /* LD32: GOT offset G(S) & 0xffc.  */
1698   HOWTO32 (AARCH64_R (TLSDESC_LD32_LO12_NC),    /* type */
1699          2,                     /* rightshift */
1700          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1701          12,                    /* bitsize */
1702          FALSE,                 /* pc_relative */
1703          0,                     /* bitpos */
1704          complain_overflow_dont,        /* complain_on_overflow */
1705          bfd_elf_generic_reloc, /* special_function */
1706          AARCH64_R_STR (TLSDESC_LD32_LO12_NC),  /* name */
1707          FALSE,                 /* partial_inplace */
1708          0xffc,                 /* src_mask */
1709          0xffc,                 /* dst_mask */
1710          FALSE),                /* pcrel_offset */
1711
1712   /* ADD: GOT offset G(S) & 0xfff.  */
1713   HOWTO (AARCH64_R (TLSDESC_ADD_LO12),  /* type */
1714          0,                     /* rightshift */
1715          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1716          12,                    /* bitsize */
1717          FALSE,                 /* pc_relative */
1718          0,                     /* bitpos */
1719          complain_overflow_dont,/* complain_on_overflow */
1720          bfd_elf_generic_reloc, /* special_function */
1721          AARCH64_R_STR (TLSDESC_ADD_LO12),      /* name */
1722          FALSE,                 /* partial_inplace */
1723          0xfff,                 /* src_mask */
1724          0xfff,                 /* dst_mask */
1725          FALSE),                /* pcrel_offset */
1726
1727   HOWTO64 (AARCH64_R (TLSDESC_OFF_G1),  /* type */
1728          16,                    /* rightshift */
1729          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1730          12,                    /* bitsize */
1731          FALSE,                 /* pc_relative */
1732          0,                     /* bitpos */
1733          complain_overflow_unsigned,    /* complain_on_overflow */
1734          bfd_elf_generic_reloc, /* special_function */
1735          AARCH64_R_STR (TLSDESC_OFF_G1),        /* name */
1736          FALSE,                 /* partial_inplace */
1737          0xffff,                /* src_mask */
1738          0xffff,                /* dst_mask */
1739          FALSE),                /* pcrel_offset */
1740
1741   HOWTO64 (AARCH64_R (TLSDESC_OFF_G0_NC),       /* type */
1742          0,                     /* rightshift */
1743          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1744          12,                    /* bitsize */
1745          FALSE,                 /* pc_relative */
1746          0,                     /* bitpos */
1747          complain_overflow_dont,        /* complain_on_overflow */
1748          bfd_elf_generic_reloc, /* special_function */
1749          AARCH64_R_STR (TLSDESC_OFF_G0_NC),     /* name */
1750          FALSE,                 /* partial_inplace */
1751          0xffff,                /* src_mask */
1752          0xffff,                /* dst_mask */
1753          FALSE),                /* pcrel_offset */
1754
1755   HOWTO64 (AARCH64_R (TLSDESC_LDR),     /* type */
1756          0,                     /* rightshift */
1757          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1758          12,                    /* bitsize */
1759          FALSE,                 /* pc_relative */
1760          0,                     /* bitpos */
1761          complain_overflow_dont,        /* complain_on_overflow */
1762          bfd_elf_generic_reloc, /* special_function */
1763          AARCH64_R_STR (TLSDESC_LDR),   /* name */
1764          FALSE,                 /* partial_inplace */
1765          0x0,                   /* src_mask */
1766          0x0,                   /* dst_mask */
1767          FALSE),                /* pcrel_offset */
1768
1769   HOWTO64 (AARCH64_R (TLSDESC_ADD),     /* type */
1770          0,                     /* rightshift */
1771          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1772          12,                    /* bitsize */
1773          FALSE,                 /* pc_relative */
1774          0,                     /* bitpos */
1775          complain_overflow_dont,        /* complain_on_overflow */
1776          bfd_elf_generic_reloc, /* special_function */
1777          AARCH64_R_STR (TLSDESC_ADD),   /* name */
1778          FALSE,                 /* partial_inplace */
1779          0x0,                   /* src_mask */
1780          0x0,                   /* dst_mask */
1781          FALSE),                /* pcrel_offset */
1782
1783   HOWTO (AARCH64_R (TLSDESC_CALL),      /* type */
1784          0,                     /* rightshift */
1785          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1786          0,                     /* bitsize */
1787          FALSE,                 /* pc_relative */
1788          0,                     /* bitpos */
1789          complain_overflow_dont,        /* complain_on_overflow */
1790          bfd_elf_generic_reloc, /* special_function */
1791          AARCH64_R_STR (TLSDESC_CALL),  /* name */
1792          FALSE,                 /* partial_inplace */
1793          0x0,                   /* src_mask */
1794          0x0,                   /* dst_mask */
1795          FALSE),                /* pcrel_offset */
1796
1797   HOWTO (AARCH64_R (COPY),      /* type */
1798          0,                     /* rightshift */
1799          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1800          64,                    /* bitsize */
1801          FALSE,                 /* pc_relative */
1802          0,                     /* bitpos */
1803          complain_overflow_bitfield,    /* complain_on_overflow */
1804          bfd_elf_generic_reloc, /* special_function */
1805          AARCH64_R_STR (COPY),  /* name */
1806          TRUE,                  /* partial_inplace */
1807          0xffffffff,            /* src_mask */
1808          0xffffffff,            /* dst_mask */
1809          FALSE),                /* pcrel_offset */
1810
1811   HOWTO (AARCH64_R (GLOB_DAT),  /* type */
1812          0,                     /* rightshift */
1813          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1814          64,                    /* bitsize */
1815          FALSE,                 /* pc_relative */
1816          0,                     /* bitpos */
1817          complain_overflow_bitfield,    /* complain_on_overflow */
1818          bfd_elf_generic_reloc, /* special_function */
1819          AARCH64_R_STR (GLOB_DAT),      /* name */
1820          TRUE,                  /* partial_inplace */
1821          0xffffffff,            /* src_mask */
1822          0xffffffff,            /* dst_mask */
1823          FALSE),                /* pcrel_offset */
1824
1825   HOWTO (AARCH64_R (JUMP_SLOT), /* type */
1826          0,                     /* rightshift */
1827          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1828          64,                    /* bitsize */
1829          FALSE,                 /* pc_relative */
1830          0,                     /* bitpos */
1831          complain_overflow_bitfield,    /* complain_on_overflow */
1832          bfd_elf_generic_reloc, /* special_function */
1833          AARCH64_R_STR (JUMP_SLOT),     /* name */
1834          TRUE,                  /* partial_inplace */
1835          0xffffffff,            /* src_mask */
1836          0xffffffff,            /* dst_mask */
1837          FALSE),                /* pcrel_offset */
1838
1839   HOWTO (AARCH64_R (RELATIVE),  /* type */
1840          0,                     /* rightshift */
1841          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1842          64,                    /* bitsize */
1843          FALSE,                 /* pc_relative */
1844          0,                     /* bitpos */
1845          complain_overflow_bitfield,    /* complain_on_overflow */
1846          bfd_elf_generic_reloc, /* special_function */
1847          AARCH64_R_STR (RELATIVE),      /* name */
1848          TRUE,                  /* partial_inplace */
1849          ALL_ONES,              /* src_mask */
1850          ALL_ONES,              /* dst_mask */
1851          FALSE),                /* pcrel_offset */
1852
1853   HOWTO (AARCH64_R (TLS_DTPMOD),        /* type */
1854          0,                     /* rightshift */
1855          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1856          64,                    /* bitsize */
1857          FALSE,                 /* pc_relative */
1858          0,                     /* bitpos */
1859          complain_overflow_dont,        /* complain_on_overflow */
1860          bfd_elf_generic_reloc, /* special_function */
1861 #if ARCH_SIZE == 64
1862          AARCH64_R_STR (TLS_DTPMOD64),  /* name */
1863 #else
1864          AARCH64_R_STR (TLS_DTPMOD),    /* name */
1865 #endif
1866          FALSE,                 /* partial_inplace */
1867          0,                     /* src_mask */
1868          ALL_ONES,              /* dst_mask */
1869          FALSE),                /* pc_reloffset */
1870
1871   HOWTO (AARCH64_R (TLS_DTPREL),        /* type */
1872          0,                     /* rightshift */
1873          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1874          64,                    /* bitsize */
1875          FALSE,                 /* pc_relative */
1876          0,                     /* bitpos */
1877          complain_overflow_dont,        /* complain_on_overflow */
1878          bfd_elf_generic_reloc, /* special_function */
1879 #if ARCH_SIZE == 64
1880          AARCH64_R_STR (TLS_DTPREL64),  /* name */
1881 #else
1882          AARCH64_R_STR (TLS_DTPREL),    /* name */
1883 #endif
1884          FALSE,                 /* partial_inplace */
1885          0,                     /* src_mask */
1886          ALL_ONES,              /* dst_mask */
1887          FALSE),                /* pcrel_offset */
1888
1889   HOWTO (AARCH64_R (TLS_TPREL), /* type */
1890          0,                     /* rightshift */
1891          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1892          64,                    /* bitsize */
1893          FALSE,                 /* pc_relative */
1894          0,                     /* bitpos */
1895          complain_overflow_dont,        /* complain_on_overflow */
1896          bfd_elf_generic_reloc, /* special_function */
1897 #if ARCH_SIZE == 64
1898          AARCH64_R_STR (TLS_TPREL64),   /* name */
1899 #else
1900          AARCH64_R_STR (TLS_TPREL),     /* name */
1901 #endif
1902          FALSE,                 /* partial_inplace */
1903          0,                     /* src_mask */
1904          ALL_ONES,              /* dst_mask */
1905          FALSE),                /* pcrel_offset */
1906
1907   HOWTO (AARCH64_R (TLSDESC),   /* type */
1908          0,                     /* rightshift */
1909          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1910          64,                    /* bitsize */
1911          FALSE,                 /* pc_relative */
1912          0,                     /* bitpos */
1913          complain_overflow_dont,        /* complain_on_overflow */
1914          bfd_elf_generic_reloc, /* special_function */
1915          AARCH64_R_STR (TLSDESC),       /* name */
1916          FALSE,                 /* partial_inplace */
1917          0,                     /* src_mask */
1918          ALL_ONES,              /* dst_mask */
1919          FALSE),                /* pcrel_offset */
1920
1921   HOWTO (AARCH64_R (IRELATIVE), /* type */
1922          0,                     /* rightshift */
1923          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1924          64,                    /* bitsize */
1925          FALSE,                 /* pc_relative */
1926          0,                     /* bitpos */
1927          complain_overflow_bitfield,    /* complain_on_overflow */
1928          bfd_elf_generic_reloc, /* special_function */
1929          AARCH64_R_STR (IRELATIVE),     /* name */
1930          FALSE,                 /* partial_inplace */
1931          0,                     /* src_mask */
1932          ALL_ONES,              /* dst_mask */
1933          FALSE),                /* pcrel_offset */
1934
1935   EMPTY_HOWTO (0),
1936 };
1937
1938 static reloc_howto_type elfNN_aarch64_howto_none =
1939   HOWTO (R_AARCH64_NONE,        /* type */
1940          0,                     /* rightshift */
1941          3,                     /* size (0 = byte, 1 = short, 2 = long) */
1942          0,                     /* bitsize */
1943          FALSE,                 /* pc_relative */
1944          0,                     /* bitpos */
1945          complain_overflow_dont,/* complain_on_overflow */
1946          bfd_elf_generic_reloc, /* special_function */
1947          "R_AARCH64_NONE",      /* name */
1948          FALSE,                 /* partial_inplace */
1949          0,                     /* src_mask */
1950          0,                     /* dst_mask */
1951          FALSE);                /* pcrel_offset */
1952
1953 /* Given HOWTO, return the bfd internal relocation enumerator.  */
1954
1955 static bfd_reloc_code_real_type
1956 elfNN_aarch64_bfd_reloc_from_howto (reloc_howto_type *howto)
1957 {
1958   const int size
1959     = (int) ARRAY_SIZE (elfNN_aarch64_howto_table);
1960   const ptrdiff_t offset
1961     = howto - elfNN_aarch64_howto_table;
1962
1963   if (offset > 0 && offset < size - 1)
1964     return BFD_RELOC_AARCH64_RELOC_START + offset;
1965
1966   if (howto == &elfNN_aarch64_howto_none)
1967     return BFD_RELOC_AARCH64_NONE;
1968
1969   return BFD_RELOC_AARCH64_RELOC_START;
1970 }
1971
1972 /* Given R_TYPE, return the bfd internal relocation enumerator.  */
1973
1974 static bfd_reloc_code_real_type
1975 elfNN_aarch64_bfd_reloc_from_type (bfd *abfd, unsigned int r_type)
1976 {
1977   static bfd_boolean initialized_p = FALSE;
1978   /* Indexed by R_TYPE, values are offsets in the howto_table.  */
1979   static unsigned int offsets[R_AARCH64_end];
1980
1981   if (!initialized_p)
1982     {
1983       unsigned int i;
1984
1985       for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i)
1986         if (elfNN_aarch64_howto_table[i].type != 0)
1987           offsets[elfNN_aarch64_howto_table[i].type] = i;
1988
1989       initialized_p = TRUE;
1990     }
1991
1992   if (r_type == R_AARCH64_NONE || r_type == R_AARCH64_NULL)
1993     return BFD_RELOC_AARCH64_NONE;
1994
1995   /* PR 17512: file: b371e70a.  */
1996   if (r_type >= R_AARCH64_end)
1997     {
1998       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1999                           abfd, r_type);
2000       bfd_set_error (bfd_error_bad_value);
2001       return BFD_RELOC_AARCH64_NONE;
2002     }
2003
2004   return BFD_RELOC_AARCH64_RELOC_START + offsets[r_type];
2005 }
2006
2007 struct elf_aarch64_reloc_map
2008 {
2009   bfd_reloc_code_real_type from;
2010   bfd_reloc_code_real_type to;
2011 };
2012
2013 /* Map bfd generic reloc to AArch64-specific reloc.  */
2014 static const struct elf_aarch64_reloc_map elf_aarch64_reloc_map[] =
2015 {
2016   {BFD_RELOC_NONE, BFD_RELOC_AARCH64_NONE},
2017
2018   /* Basic data relocations.  */
2019   {BFD_RELOC_CTOR, BFD_RELOC_AARCH64_NN},
2020   {BFD_RELOC_64, BFD_RELOC_AARCH64_64},
2021   {BFD_RELOC_32, BFD_RELOC_AARCH64_32},
2022   {BFD_RELOC_16, BFD_RELOC_AARCH64_16},
2023   {BFD_RELOC_64_PCREL, BFD_RELOC_AARCH64_64_PCREL},
2024   {BFD_RELOC_32_PCREL, BFD_RELOC_AARCH64_32_PCREL},
2025   {BFD_RELOC_16_PCREL, BFD_RELOC_AARCH64_16_PCREL},
2026 };
2027
2028 /* Given the bfd internal relocation enumerator in CODE, return the
2029    corresponding howto entry.  */
2030
2031 static reloc_howto_type *
2032 elfNN_aarch64_howto_from_bfd_reloc (bfd_reloc_code_real_type code)
2033 {
2034   unsigned int i;
2035
2036   /* Convert bfd generic reloc to AArch64-specific reloc.  */
2037   if (code < BFD_RELOC_AARCH64_RELOC_START
2038       || code > BFD_RELOC_AARCH64_RELOC_END)
2039     for (i = 0; i < ARRAY_SIZE (elf_aarch64_reloc_map); i++)
2040       if (elf_aarch64_reloc_map[i].from == code)
2041         {
2042           code = elf_aarch64_reloc_map[i].to;
2043           break;
2044         }
2045
2046   if (code > BFD_RELOC_AARCH64_RELOC_START
2047       && code < BFD_RELOC_AARCH64_RELOC_END)
2048     if (elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START].type)
2049       return &elfNN_aarch64_howto_table[code - BFD_RELOC_AARCH64_RELOC_START];
2050
2051   if (code == BFD_RELOC_AARCH64_NONE)
2052     return &elfNN_aarch64_howto_none;
2053
2054   return NULL;
2055 }
2056
2057 static reloc_howto_type *
2058 elfNN_aarch64_howto_from_type (bfd *abfd, unsigned int r_type)
2059 {
2060   bfd_reloc_code_real_type val;
2061   reloc_howto_type *howto;
2062
2063 #if ARCH_SIZE == 32
2064   if (r_type > 256)
2065     {
2066       bfd_set_error (bfd_error_bad_value);
2067       return NULL;
2068     }
2069 #endif
2070
2071   if (r_type == R_AARCH64_NONE)
2072     return &elfNN_aarch64_howto_none;
2073
2074   val = elfNN_aarch64_bfd_reloc_from_type (abfd, r_type);
2075   howto = elfNN_aarch64_howto_from_bfd_reloc (val);
2076
2077   if (howto != NULL)
2078     return howto;
2079
2080   bfd_set_error (bfd_error_bad_value);
2081   return NULL;
2082 }
2083
2084 static bfd_boolean
2085 elfNN_aarch64_info_to_howto (bfd *abfd, arelent *bfd_reloc,
2086                              Elf_Internal_Rela *elf_reloc)
2087 {
2088   unsigned int r_type;
2089
2090   r_type = ELFNN_R_TYPE (elf_reloc->r_info);
2091   bfd_reloc->howto = elfNN_aarch64_howto_from_type (abfd, r_type);
2092
2093   if (bfd_reloc->howto == NULL)
2094     {
2095       /* xgettext:c-format */
2096       _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r_type);
2097       return FALSE;
2098     }
2099   return TRUE;
2100 }
2101
2102 static reloc_howto_type *
2103 elfNN_aarch64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2104                                  bfd_reloc_code_real_type code)
2105 {
2106   reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (code);
2107
2108   if (howto != NULL)
2109     return howto;
2110
2111   bfd_set_error (bfd_error_bad_value);
2112   return NULL;
2113 }
2114
2115 static reloc_howto_type *
2116 elfNN_aarch64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2117                                  const char *r_name)
2118 {
2119   unsigned int i;
2120
2121   for (i = 1; i < ARRAY_SIZE (elfNN_aarch64_howto_table) - 1; ++i)
2122     if (elfNN_aarch64_howto_table[i].name != NULL
2123         && strcasecmp (elfNN_aarch64_howto_table[i].name, r_name) == 0)
2124       return &elfNN_aarch64_howto_table[i];
2125
2126   return NULL;
2127 }
2128
2129 #define TARGET_LITTLE_SYM               aarch64_elfNN_le_vec
2130 #define TARGET_LITTLE_NAME              "elfNN-littleaarch64"
2131 #define TARGET_BIG_SYM                  aarch64_elfNN_be_vec
2132 #define TARGET_BIG_NAME                 "elfNN-bigaarch64"
2133
2134 /* The linker script knows the section names for placement.
2135    The entry_names are used to do simple name mangling on the stubs.
2136    Given a function name, and its type, the stub can be found. The
2137    name can be changed. The only requirement is the %s be present.  */
2138 #define STUB_ENTRY_NAME   "__%s_veneer"
2139
2140 /* The name of the dynamic interpreter.  This is put in the .interp
2141    section.  */
2142 #define ELF_DYNAMIC_INTERPRETER     "/lib/ld.so.1"
2143
2144 #define AARCH64_MAX_FWD_BRANCH_OFFSET \
2145   (((1 << 25) - 1) << 2)
2146 #define AARCH64_MAX_BWD_BRANCH_OFFSET \
2147   (-((1 << 25) << 2))
2148
2149 #define AARCH64_MAX_ADRP_IMM ((1 << 20) - 1)
2150 #define AARCH64_MIN_ADRP_IMM (-(1 << 20))
2151
2152 static int
2153 aarch64_valid_for_adrp_p (bfd_vma value, bfd_vma place)
2154 {
2155   bfd_signed_vma offset = (bfd_signed_vma) (PG (value) - PG (place)) >> 12;
2156   return offset <= AARCH64_MAX_ADRP_IMM && offset >= AARCH64_MIN_ADRP_IMM;
2157 }
2158
2159 static int
2160 aarch64_valid_branch_p (bfd_vma value, bfd_vma place)
2161 {
2162   bfd_signed_vma offset = (bfd_signed_vma) (value - place);
2163   return (offset <= AARCH64_MAX_FWD_BRANCH_OFFSET
2164           && offset >= AARCH64_MAX_BWD_BRANCH_OFFSET);
2165 }
2166
2167 static const uint32_t aarch64_adrp_branch_stub [] =
2168 {
2169   0x90000010,                   /*      adrp    ip0, X */
2170                                 /*              R_AARCH64_ADR_HI21_PCREL(X) */
2171   0x91000210,                   /*      add     ip0, ip0, :lo12:X */
2172                                 /*              R_AARCH64_ADD_ABS_LO12_NC(X) */
2173   0xd61f0200,                   /*      br      ip0 */
2174 };
2175
2176 static const uint32_t aarch64_long_branch_stub[] =
2177 {
2178 #if ARCH_SIZE == 64
2179   0x58000090,                   /*      ldr   ip0, 1f */
2180 #else
2181   0x18000090,                   /*      ldr   wip0, 1f */
2182 #endif
2183   0x10000011,                   /*      adr   ip1, #0 */
2184   0x8b110210,                   /*      add   ip0, ip0, ip1 */
2185   0xd61f0200,                   /*      br      ip0 */
2186   0x00000000,                   /* 1:   .xword or .word
2187                                    R_AARCH64_PRELNN(X) + 12
2188                                  */
2189   0x00000000,
2190 };
2191
2192 static const uint32_t aarch64_erratum_835769_stub[] =
2193 {
2194   0x00000000,    /* Placeholder for multiply accumulate.  */
2195   0x14000000,    /* b <label> */
2196 };
2197
2198 static const uint32_t aarch64_erratum_843419_stub[] =
2199 {
2200   0x00000000,    /* Placeholder for LDR instruction.  */
2201   0x14000000,    /* b <label> */
2202 };
2203
2204 /* Section name for stubs is the associated section name plus this
2205    string.  */
2206 #define STUB_SUFFIX ".stub"
2207
2208 enum elf_aarch64_stub_type
2209 {
2210   aarch64_stub_none,
2211   aarch64_stub_adrp_branch,
2212   aarch64_stub_long_branch,
2213   aarch64_stub_erratum_835769_veneer,
2214   aarch64_stub_erratum_843419_veneer,
2215 };
2216
2217 struct elf_aarch64_stub_hash_entry
2218 {
2219   /* Base hash table entry structure.  */
2220   struct bfd_hash_entry root;
2221
2222   /* The stub section.  */
2223   asection *stub_sec;
2224
2225   /* Offset within stub_sec of the beginning of this stub.  */
2226   bfd_vma stub_offset;
2227
2228   /* Given the symbol's value and its section we can determine its final
2229      value when building the stubs (so the stub knows where to jump).  */
2230   bfd_vma target_value;
2231   asection *target_section;
2232
2233   enum elf_aarch64_stub_type stub_type;
2234
2235   /* The symbol table entry, if any, that this was derived from.  */
2236   struct elf_aarch64_link_hash_entry *h;
2237
2238   /* Destination symbol type */
2239   unsigned char st_type;
2240
2241   /* Where this stub is being called from, or, in the case of combined
2242      stub sections, the first input section in the group.  */
2243   asection *id_sec;
2244
2245   /* The name for the local symbol at the start of this stub.  The
2246      stub name in the hash table has to be unique; this does not, so
2247      it can be friendlier.  */
2248   char *output_name;
2249
2250   /* The instruction which caused this stub to be generated (only valid for
2251      erratum 835769 workaround stubs at present).  */
2252   uint32_t veneered_insn;
2253
2254   /* In an erratum 843419 workaround stub, the ADRP instruction offset.  */
2255   bfd_vma adrp_offset;
2256 };
2257
2258 /* Used to build a map of a section.  This is required for mixed-endian
2259    code/data.  */
2260
2261 typedef struct elf_elf_section_map
2262 {
2263   bfd_vma vma;
2264   char type;
2265 }
2266 elf_aarch64_section_map;
2267
2268
2269 typedef struct _aarch64_elf_section_data
2270 {
2271   struct bfd_elf_section_data elf;
2272   unsigned int mapcount;
2273   unsigned int mapsize;
2274   elf_aarch64_section_map *map;
2275 }
2276 _aarch64_elf_section_data;
2277
2278 #define elf_aarch64_section_data(sec) \
2279   ((_aarch64_elf_section_data *) elf_section_data (sec))
2280
2281 /* The size of the thread control block which is defined to be two pointers.  */
2282 #define TCB_SIZE        (ARCH_SIZE/8)*2
2283
2284 struct elf_aarch64_local_symbol
2285 {
2286   unsigned int got_type;
2287   bfd_signed_vma got_refcount;
2288   bfd_vma got_offset;
2289
2290   /* Offset of the GOTPLT entry reserved for the TLS descriptor. The
2291      offset is from the end of the jump table and reserved entries
2292      within the PLTGOT.
2293
2294      The magic value (bfd_vma) -1 indicates that an offset has not be
2295      allocated.  */
2296   bfd_vma tlsdesc_got_jump_table_offset;
2297 };
2298
2299 struct elf_aarch64_obj_tdata
2300 {
2301   struct elf_obj_tdata root;
2302
2303   /* local symbol descriptors */
2304   struct elf_aarch64_local_symbol *locals;
2305
2306   /* Zero to warn when linking objects with incompatible enum sizes.  */
2307   int no_enum_size_warning;
2308
2309   /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
2310   int no_wchar_size_warning;
2311 };
2312
2313 #define elf_aarch64_tdata(bfd)                          \
2314   ((struct elf_aarch64_obj_tdata *) (bfd)->tdata.any)
2315
2316 #define elf_aarch64_locals(bfd) (elf_aarch64_tdata (bfd)->locals)
2317
2318 #define is_aarch64_elf(bfd)                             \
2319   (bfd_get_flavour (bfd) == bfd_target_elf_flavour      \
2320    && elf_tdata (bfd) != NULL                           \
2321    && elf_object_id (bfd) == AARCH64_ELF_DATA)
2322
2323 static bfd_boolean
2324 elfNN_aarch64_mkobject (bfd *abfd)
2325 {
2326   return bfd_elf_allocate_object (abfd, sizeof (struct elf_aarch64_obj_tdata),
2327                                   AARCH64_ELF_DATA);
2328 }
2329
2330 #define elf_aarch64_hash_entry(ent) \
2331   ((struct elf_aarch64_link_hash_entry *)(ent))
2332
2333 #define GOT_UNKNOWN    0
2334 #define GOT_NORMAL     1
2335 #define GOT_TLS_GD     2
2336 #define GOT_TLS_IE     4
2337 #define GOT_TLSDESC_GD 8
2338
2339 #define GOT_TLS_GD_ANY_P(type)  ((type & GOT_TLS_GD) || (type & GOT_TLSDESC_GD))
2340
2341 /* AArch64 ELF linker hash entry.  */
2342 struct elf_aarch64_link_hash_entry
2343 {
2344   struct elf_link_hash_entry root;
2345
2346   /* Track dynamic relocs copied for this symbol.  */
2347   struct elf_dyn_relocs *dyn_relocs;
2348
2349   /* Since PLT entries have variable size, we need to record the
2350      index into .got.plt instead of recomputing it from the PLT
2351      offset.  */
2352   bfd_signed_vma plt_got_offset;
2353
2354   /* Bit mask representing the type of GOT entry(s) if any required by
2355      this symbol.  */
2356   unsigned int got_type;
2357
2358   /* A pointer to the most recently used stub hash entry against this
2359      symbol.  */
2360   struct elf_aarch64_stub_hash_entry *stub_cache;
2361
2362   /* Offset of the GOTPLT entry reserved for the TLS descriptor.  The offset
2363      is from the end of the jump table and reserved entries within the PLTGOT.
2364
2365      The magic value (bfd_vma) -1 indicates that an offset has not
2366      be allocated.  */
2367   bfd_vma tlsdesc_got_jump_table_offset;
2368 };
2369
2370 static unsigned int
2371 elfNN_aarch64_symbol_got_type (struct elf_link_hash_entry *h,
2372                                bfd *abfd,
2373                                unsigned long r_symndx)
2374 {
2375   if (h)
2376     return elf_aarch64_hash_entry (h)->got_type;
2377
2378   if (! elf_aarch64_locals (abfd))
2379     return GOT_UNKNOWN;
2380
2381   return elf_aarch64_locals (abfd)[r_symndx].got_type;
2382 }
2383
2384 /* Get the AArch64 elf linker hash table from a link_info structure.  */
2385 #define elf_aarch64_hash_table(info)                                    \
2386   ((struct elf_aarch64_link_hash_table *) ((info)->hash))
2387
2388 #define aarch64_stub_hash_lookup(table, string, create, copy)           \
2389   ((struct elf_aarch64_stub_hash_entry *)                               \
2390    bfd_hash_lookup ((table), (string), (create), (copy)))
2391
2392 /* AArch64 ELF linker hash table.  */
2393 struct elf_aarch64_link_hash_table
2394 {
2395   /* The main hash table.  */
2396   struct elf_link_hash_table root;
2397
2398   /* Nonzero to force PIC branch veneers.  */
2399   int pic_veneer;
2400
2401   /* Fix erratum 835769.  */
2402   int fix_erratum_835769;
2403
2404   /* Fix erratum 843419.  */
2405   int fix_erratum_843419;
2406
2407   /* Enable ADRP->ADR rewrite for erratum 843419 workaround.  */
2408   int fix_erratum_843419_adr;
2409
2410   /* Don't apply link-time values for dynamic relocations.  */
2411   int no_apply_dynamic_relocs;
2412
2413   /* The number of bytes in the initial entry in the PLT.  */
2414   bfd_size_type plt_header_size;
2415
2416   /* The number of bytes in the subsequent PLT etries.  */
2417   bfd_size_type plt_entry_size;
2418
2419   /* Small local sym cache.  */
2420   struct sym_cache sym_cache;
2421
2422   /* For convenience in allocate_dynrelocs.  */
2423   bfd *obfd;
2424
2425   /* The amount of space used by the reserved portion of the sgotplt
2426      section, plus whatever space is used by the jump slots.  */
2427   bfd_vma sgotplt_jump_table_size;
2428
2429   /* The stub hash table.  */
2430   struct bfd_hash_table stub_hash_table;
2431
2432   /* Linker stub bfd.  */
2433   bfd *stub_bfd;
2434
2435   /* Linker call-backs.  */
2436   asection *(*add_stub_section) (const char *, asection *);
2437   void (*layout_sections_again) (void);
2438
2439   /* Array to keep track of which stub sections have been created, and
2440      information on stub grouping.  */
2441   struct map_stub
2442   {
2443     /* This is the section to which stubs in the group will be
2444        attached.  */
2445     asection *link_sec;
2446     /* The stub section.  */
2447     asection *stub_sec;
2448   } *stub_group;
2449
2450   /* Assorted information used by elfNN_aarch64_size_stubs.  */
2451   unsigned int bfd_count;
2452   unsigned int top_index;
2453   asection **input_list;
2454
2455   /* The offset into splt of the PLT entry for the TLS descriptor
2456      resolver.  Special values are 0, if not necessary (or not found
2457      to be necessary yet), and -1 if needed but not determined
2458      yet.  */
2459   bfd_vma tlsdesc_plt;
2460
2461   /* The GOT offset for the lazy trampoline.  Communicated to the
2462      loader via DT_TLSDESC_GOT.  The magic value (bfd_vma) -1
2463      indicates an offset is not allocated.  */
2464   bfd_vma dt_tlsdesc_got;
2465
2466   /* Used by local STT_GNU_IFUNC symbols.  */
2467   htab_t loc_hash_table;
2468   void * loc_hash_memory;
2469 };
2470
2471 /* Create an entry in an AArch64 ELF linker hash table.  */
2472
2473 static struct bfd_hash_entry *
2474 elfNN_aarch64_link_hash_newfunc (struct bfd_hash_entry *entry,
2475                                  struct bfd_hash_table *table,
2476                                  const char *string)
2477 {
2478   struct elf_aarch64_link_hash_entry *ret =
2479     (struct elf_aarch64_link_hash_entry *) entry;
2480
2481   /* Allocate the structure if it has not already been allocated by a
2482      subclass.  */
2483   if (ret == NULL)
2484     ret = bfd_hash_allocate (table,
2485                              sizeof (struct elf_aarch64_link_hash_entry));
2486   if (ret == NULL)
2487     return (struct bfd_hash_entry *) ret;
2488
2489   /* Call the allocation method of the superclass.  */
2490   ret = ((struct elf_aarch64_link_hash_entry *)
2491          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2492                                      table, string));
2493   if (ret != NULL)
2494     {
2495       ret->dyn_relocs = NULL;
2496       ret->got_type = GOT_UNKNOWN;
2497       ret->plt_got_offset = (bfd_vma) - 1;
2498       ret->stub_cache = NULL;
2499       ret->tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
2500     }
2501
2502   return (struct bfd_hash_entry *) ret;
2503 }
2504
2505 /* Initialize an entry in the stub hash table.  */
2506
2507 static struct bfd_hash_entry *
2508 stub_hash_newfunc (struct bfd_hash_entry *entry,
2509                    struct bfd_hash_table *table, const char *string)
2510 {
2511   /* Allocate the structure if it has not already been allocated by a
2512      subclass.  */
2513   if (entry == NULL)
2514     {
2515       entry = bfd_hash_allocate (table,
2516                                  sizeof (struct
2517                                          elf_aarch64_stub_hash_entry));
2518       if (entry == NULL)
2519         return entry;
2520     }
2521
2522   /* Call the allocation method of the superclass.  */
2523   entry = bfd_hash_newfunc (entry, table, string);
2524   if (entry != NULL)
2525     {
2526       struct elf_aarch64_stub_hash_entry *eh;
2527
2528       /* Initialize the local fields.  */
2529       eh = (struct elf_aarch64_stub_hash_entry *) entry;
2530       eh->adrp_offset = 0;
2531       eh->stub_sec = NULL;
2532       eh->stub_offset = 0;
2533       eh->target_value = 0;
2534       eh->target_section = NULL;
2535       eh->stub_type = aarch64_stub_none;
2536       eh->h = NULL;
2537       eh->id_sec = NULL;
2538     }
2539
2540   return entry;
2541 }
2542
2543 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
2544   for local symbol so that we can handle local STT_GNU_IFUNC symbols
2545   as global symbol.  We reuse indx and dynstr_index for local symbol
2546   hash since they aren't used by global symbols in this backend.  */
2547
2548 static hashval_t
2549 elfNN_aarch64_local_htab_hash (const void *ptr)
2550 {
2551   struct elf_link_hash_entry *h
2552     = (struct elf_link_hash_entry *) ptr;
2553   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
2554 }
2555
2556 /* Compare local hash entries.  */
2557
2558 static int
2559 elfNN_aarch64_local_htab_eq (const void *ptr1, const void *ptr2)
2560 {
2561   struct elf_link_hash_entry *h1
2562      = (struct elf_link_hash_entry *) ptr1;
2563   struct elf_link_hash_entry *h2
2564     = (struct elf_link_hash_entry *) ptr2;
2565
2566   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
2567 }
2568
2569 /* Find and/or create a hash entry for local symbol.  */
2570
2571 static struct elf_link_hash_entry *
2572 elfNN_aarch64_get_local_sym_hash (struct elf_aarch64_link_hash_table *htab,
2573                                   bfd *abfd, const Elf_Internal_Rela *rel,
2574                                   bfd_boolean create)
2575 {
2576   struct elf_aarch64_link_hash_entry e, *ret;
2577   asection *sec = abfd->sections;
2578   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
2579                                        ELFNN_R_SYM (rel->r_info));
2580   void **slot;
2581
2582   e.root.indx = sec->id;
2583   e.root.dynstr_index = ELFNN_R_SYM (rel->r_info);
2584   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
2585                                    create ? INSERT : NO_INSERT);
2586
2587   if (!slot)
2588     return NULL;
2589
2590   if (*slot)
2591     {
2592       ret = (struct elf_aarch64_link_hash_entry *) *slot;
2593       return &ret->root;
2594     }
2595
2596   ret = (struct elf_aarch64_link_hash_entry *)
2597         objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
2598                         sizeof (struct elf_aarch64_link_hash_entry));
2599   if (ret)
2600     {
2601       memset (ret, 0, sizeof (*ret));
2602       ret->root.indx = sec->id;
2603       ret->root.dynstr_index = ELFNN_R_SYM (rel->r_info);
2604       ret->root.dynindx = -1;
2605       *slot = ret;
2606     }
2607   return &ret->root;
2608 }
2609
2610 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2611
2612 static void
2613 elfNN_aarch64_copy_indirect_symbol (struct bfd_link_info *info,
2614                                     struct elf_link_hash_entry *dir,
2615                                     struct elf_link_hash_entry *ind)
2616 {
2617   struct elf_aarch64_link_hash_entry *edir, *eind;
2618
2619   edir = (struct elf_aarch64_link_hash_entry *) dir;
2620   eind = (struct elf_aarch64_link_hash_entry *) ind;
2621
2622   if (eind->dyn_relocs != NULL)
2623     {
2624       if (edir->dyn_relocs != NULL)
2625         {
2626           struct elf_dyn_relocs **pp;
2627           struct elf_dyn_relocs *p;
2628
2629           /* Add reloc counts against the indirect sym to the direct sym
2630              list.  Merge any entries against the same section.  */
2631           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
2632             {
2633               struct elf_dyn_relocs *q;
2634
2635               for (q = edir->dyn_relocs; q != NULL; q = q->next)
2636                 if (q->sec == p->sec)
2637                   {
2638                     q->pc_count += p->pc_count;
2639                     q->count += p->count;
2640                     *pp = p->next;
2641                     break;
2642                   }
2643               if (q == NULL)
2644                 pp = &p->next;
2645             }
2646           *pp = edir->dyn_relocs;
2647         }
2648
2649       edir->dyn_relocs = eind->dyn_relocs;
2650       eind->dyn_relocs = NULL;
2651     }
2652
2653   if (ind->root.type == bfd_link_hash_indirect)
2654     {
2655       /* Copy over PLT info.  */
2656       if (dir->got.refcount <= 0)
2657         {
2658           edir->got_type = eind->got_type;
2659           eind->got_type = GOT_UNKNOWN;
2660         }
2661     }
2662
2663   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
2664 }
2665
2666 /* Destroy an AArch64 elf linker hash table.  */
2667
2668 static void
2669 elfNN_aarch64_link_hash_table_free (bfd *obfd)
2670 {
2671   struct elf_aarch64_link_hash_table *ret
2672     = (struct elf_aarch64_link_hash_table *) obfd->link.hash;
2673
2674   if (ret->loc_hash_table)
2675     htab_delete (ret->loc_hash_table);
2676   if (ret->loc_hash_memory)
2677     objalloc_free ((struct objalloc *) ret->loc_hash_memory);
2678
2679   bfd_hash_table_free (&ret->stub_hash_table);
2680   _bfd_elf_link_hash_table_free (obfd);
2681 }
2682
2683 /* Create an AArch64 elf linker hash table.  */
2684
2685 static struct bfd_link_hash_table *
2686 elfNN_aarch64_link_hash_table_create (bfd *abfd)
2687 {
2688   struct elf_aarch64_link_hash_table *ret;
2689   bfd_size_type amt = sizeof (struct elf_aarch64_link_hash_table);
2690
2691   ret = bfd_zmalloc (amt);
2692   if (ret == NULL)
2693     return NULL;
2694
2695   if (!_bfd_elf_link_hash_table_init
2696       (&ret->root, abfd, elfNN_aarch64_link_hash_newfunc,
2697        sizeof (struct elf_aarch64_link_hash_entry), AARCH64_ELF_DATA))
2698     {
2699       free (ret);
2700       return NULL;
2701     }
2702
2703   ret->plt_header_size = PLT_ENTRY_SIZE;
2704   ret->plt_entry_size = PLT_SMALL_ENTRY_SIZE;
2705   ret->obfd = abfd;
2706   ret->dt_tlsdesc_got = (bfd_vma) - 1;
2707
2708   if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
2709                             sizeof (struct elf_aarch64_stub_hash_entry)))
2710     {
2711       _bfd_elf_link_hash_table_free (abfd);
2712       return NULL;
2713     }
2714
2715   ret->loc_hash_table = htab_try_create (1024,
2716                                          elfNN_aarch64_local_htab_hash,
2717                                          elfNN_aarch64_local_htab_eq,
2718                                          NULL);
2719   ret->loc_hash_memory = objalloc_create ();
2720   if (!ret->loc_hash_table || !ret->loc_hash_memory)
2721     {
2722       elfNN_aarch64_link_hash_table_free (abfd);
2723       return NULL;
2724     }
2725   ret->root.root.hash_table_free = elfNN_aarch64_link_hash_table_free;
2726
2727   return &ret->root.root;
2728 }
2729
2730 /* Perform relocation R_TYPE.  Returns TRUE upon success, FALSE otherwise.  */
2731
2732 static bfd_boolean
2733 aarch64_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section,
2734                   bfd_vma offset, bfd_vma value)
2735 {
2736   reloc_howto_type *howto;
2737   bfd_vma place;
2738
2739   howto = elfNN_aarch64_howto_from_type (input_bfd, r_type);
2740   place = (input_section->output_section->vma + input_section->output_offset
2741            + offset);
2742
2743   r_type = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
2744   value = _bfd_aarch64_elf_resolve_relocation (r_type, place, value, 0, FALSE);
2745   return _bfd_aarch64_elf_put_addend (input_bfd,
2746                                       input_section->contents + offset, r_type,
2747                                       howto, value) == bfd_reloc_ok;
2748 }
2749
2750 static enum elf_aarch64_stub_type
2751 aarch64_select_branch_stub (bfd_vma value, bfd_vma place)
2752 {
2753   if (aarch64_valid_for_adrp_p (value, place))
2754     return aarch64_stub_adrp_branch;
2755   return aarch64_stub_long_branch;
2756 }
2757
2758 /* Determine the type of stub needed, if any, for a call.  */
2759
2760 static enum elf_aarch64_stub_type
2761 aarch64_type_of_stub (asection *input_sec,
2762                       const Elf_Internal_Rela *rel,
2763                       asection *sym_sec,
2764                       unsigned char st_type,
2765                       bfd_vma destination)
2766 {
2767   bfd_vma location;
2768   bfd_signed_vma branch_offset;
2769   unsigned int r_type;
2770   enum elf_aarch64_stub_type stub_type = aarch64_stub_none;
2771
2772   if (st_type != STT_FUNC
2773       && (sym_sec == input_sec))
2774     return stub_type;
2775
2776   /* Determine where the call point is.  */
2777   location = (input_sec->output_offset
2778               + input_sec->output_section->vma + rel->r_offset);
2779
2780   branch_offset = (bfd_signed_vma) (destination - location);
2781
2782   r_type = ELFNN_R_TYPE (rel->r_info);
2783
2784   /* We don't want to redirect any old unconditional jump in this way,
2785      only one which is being used for a sibcall, where it is
2786      acceptable for the IP0 and IP1 registers to be clobbered.  */
2787   if ((r_type == AARCH64_R (CALL26) || r_type == AARCH64_R (JUMP26))
2788       && (branch_offset > AARCH64_MAX_FWD_BRANCH_OFFSET
2789           || branch_offset < AARCH64_MAX_BWD_BRANCH_OFFSET))
2790     {
2791       stub_type = aarch64_stub_long_branch;
2792     }
2793
2794   return stub_type;
2795 }
2796
2797 /* Build a name for an entry in the stub hash table.  */
2798
2799 static char *
2800 elfNN_aarch64_stub_name (const asection *input_section,
2801                          const asection *sym_sec,
2802                          const struct elf_aarch64_link_hash_entry *hash,
2803                          const Elf_Internal_Rela *rel)
2804 {
2805   char *stub_name;
2806   bfd_size_type len;
2807
2808   if (hash)
2809     {
2810       len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 16 + 1;
2811       stub_name = bfd_malloc (len);
2812       if (stub_name != NULL)
2813         snprintf (stub_name, len, "%08x_%s+%" BFD_VMA_FMT "x",
2814                   (unsigned int) input_section->id,
2815                   hash->root.root.root.string,
2816                   rel->r_addend);
2817     }
2818   else
2819     {
2820       len = 8 + 1 + 8 + 1 + 8 + 1 + 16 + 1;
2821       stub_name = bfd_malloc (len);
2822       if (stub_name != NULL)
2823         snprintf (stub_name, len, "%08x_%x:%x+%" BFD_VMA_FMT "x",
2824                   (unsigned int) input_section->id,
2825                   (unsigned int) sym_sec->id,
2826                   (unsigned int) ELFNN_R_SYM (rel->r_info),
2827                   rel->r_addend);
2828     }
2829
2830   return stub_name;
2831 }
2832
2833 /* Return TRUE if symbol H should be hashed in the `.gnu.hash' section.  For
2834    executable PLT slots where the executable never takes the address of those
2835    functions, the function symbols are not added to the hash table.  */
2836
2837 static bfd_boolean
2838 elf_aarch64_hash_symbol (struct elf_link_hash_entry *h)
2839 {
2840   if (h->plt.offset != (bfd_vma) -1
2841       && !h->def_regular
2842       && !h->pointer_equality_needed)
2843     return FALSE;
2844
2845   return _bfd_elf_hash_symbol (h);
2846 }
2847
2848
2849 /* Look up an entry in the stub hash.  Stub entries are cached because
2850    creating the stub name takes a bit of time.  */
2851
2852 static struct elf_aarch64_stub_hash_entry *
2853 elfNN_aarch64_get_stub_entry (const asection *input_section,
2854                               const asection *sym_sec,
2855                               struct elf_link_hash_entry *hash,
2856                               const Elf_Internal_Rela *rel,
2857                               struct elf_aarch64_link_hash_table *htab)
2858 {
2859   struct elf_aarch64_stub_hash_entry *stub_entry;
2860   struct elf_aarch64_link_hash_entry *h =
2861     (struct elf_aarch64_link_hash_entry *) hash;
2862   const asection *id_sec;
2863
2864   if ((input_section->flags & SEC_CODE) == 0)
2865     return NULL;
2866
2867   /* If this input section is part of a group of sections sharing one
2868      stub section, then use the id of the first section in the group.
2869      Stub names need to include a section id, as there may well be
2870      more than one stub used to reach say, printf, and we need to
2871      distinguish between them.  */
2872   id_sec = htab->stub_group[input_section->id].link_sec;
2873
2874   if (h != NULL && h->stub_cache != NULL
2875       && h->stub_cache->h == h && h->stub_cache->id_sec == id_sec)
2876     {
2877       stub_entry = h->stub_cache;
2878     }
2879   else
2880     {
2881       char *stub_name;
2882
2883       stub_name = elfNN_aarch64_stub_name (id_sec, sym_sec, h, rel);
2884       if (stub_name == NULL)
2885         return NULL;
2886
2887       stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table,
2888                                              stub_name, FALSE, FALSE);
2889       if (h != NULL)
2890         h->stub_cache = stub_entry;
2891
2892       free (stub_name);
2893     }
2894
2895   return stub_entry;
2896 }
2897
2898
2899 /* Create a stub section.  */
2900
2901 static asection *
2902 _bfd_aarch64_create_stub_section (asection *section,
2903                                   struct elf_aarch64_link_hash_table *htab)
2904 {
2905   size_t namelen;
2906   bfd_size_type len;
2907   char *s_name;
2908
2909   namelen = strlen (section->name);
2910   len = namelen + sizeof (STUB_SUFFIX);
2911   s_name = bfd_alloc (htab->stub_bfd, len);
2912   if (s_name == NULL)
2913     return NULL;
2914
2915   memcpy (s_name, section->name, namelen);
2916   memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
2917   return (*htab->add_stub_section) (s_name, section);
2918 }
2919
2920
2921 /* Find or create a stub section for a link section.
2922
2923    Fix or create the stub section used to collect stubs attached to
2924    the specified link section.  */
2925
2926 static asection *
2927 _bfd_aarch64_get_stub_for_link_section (asection *link_section,
2928                                         struct elf_aarch64_link_hash_table *htab)
2929 {
2930   if (htab->stub_group[link_section->id].stub_sec == NULL)
2931     htab->stub_group[link_section->id].stub_sec
2932       = _bfd_aarch64_create_stub_section (link_section, htab);
2933   return htab->stub_group[link_section->id].stub_sec;
2934 }
2935
2936
2937 /* Find or create a stub section in the stub group for an input
2938    section.  */
2939
2940 static asection *
2941 _bfd_aarch64_create_or_find_stub_sec (asection *section,
2942                                       struct elf_aarch64_link_hash_table *htab)
2943 {
2944   asection *link_sec = htab->stub_group[section->id].link_sec;
2945   return _bfd_aarch64_get_stub_for_link_section (link_sec, htab);
2946 }
2947
2948
2949 /* Add a new stub entry in the stub group associated with an input
2950    section to the stub hash.  Not all fields of the new stub entry are
2951    initialised.  */
2952
2953 static struct elf_aarch64_stub_hash_entry *
2954 _bfd_aarch64_add_stub_entry_in_group (const char *stub_name,
2955                                       asection *section,
2956                                       struct elf_aarch64_link_hash_table *htab)
2957 {
2958   asection *link_sec;
2959   asection *stub_sec;
2960   struct elf_aarch64_stub_hash_entry *stub_entry;
2961
2962   link_sec = htab->stub_group[section->id].link_sec;
2963   stub_sec = _bfd_aarch64_create_or_find_stub_sec (section, htab);
2964
2965   /* Enter this entry into the linker stub hash table.  */
2966   stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table, stub_name,
2967                                          TRUE, FALSE);
2968   if (stub_entry == NULL)
2969     {
2970       /* xgettext:c-format */
2971       _bfd_error_handler (_("%pB: cannot create stub entry %s"),
2972                           section->owner, stub_name);
2973       return NULL;
2974     }
2975
2976   stub_entry->stub_sec = stub_sec;
2977   stub_entry->stub_offset = 0;
2978   stub_entry->id_sec = link_sec;
2979
2980   return stub_entry;
2981 }
2982
2983 /* Add a new stub entry in the final stub section to the stub hash.
2984    Not all fields of the new stub entry are initialised.  */
2985
2986 static struct elf_aarch64_stub_hash_entry *
2987 _bfd_aarch64_add_stub_entry_after (const char *stub_name,
2988                                    asection *link_section,
2989                                    struct elf_aarch64_link_hash_table *htab)
2990 {
2991   asection *stub_sec;
2992   struct elf_aarch64_stub_hash_entry *stub_entry;
2993
2994   stub_sec = _bfd_aarch64_get_stub_for_link_section (link_section, htab);
2995   stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table, stub_name,
2996                                          TRUE, FALSE);
2997   if (stub_entry == NULL)
2998     {
2999       _bfd_error_handler (_("cannot create stub entry %s"), stub_name);
3000       return NULL;
3001     }
3002
3003   stub_entry->stub_sec = stub_sec;
3004   stub_entry->stub_offset = 0;
3005   stub_entry->id_sec = link_section;
3006
3007   return stub_entry;
3008 }
3009
3010
3011 static bfd_boolean
3012 aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
3013                         void *in_arg ATTRIBUTE_UNUSED)
3014 {
3015   struct elf_aarch64_stub_hash_entry *stub_entry;
3016   asection *stub_sec;
3017   bfd *stub_bfd;
3018   bfd_byte *loc;
3019   bfd_vma sym_value;
3020   bfd_vma veneered_insn_loc;
3021   bfd_vma veneer_entry_loc;
3022   bfd_signed_vma branch_offset = 0;
3023   unsigned int template_size;
3024   const uint32_t *template;
3025   unsigned int i;
3026
3027   /* Massage our args to the form they really have.  */
3028   stub_entry = (struct elf_aarch64_stub_hash_entry *) gen_entry;
3029
3030   stub_sec = stub_entry->stub_sec;
3031
3032   /* Make a note of the offset within the stubs for this entry.  */
3033   stub_entry->stub_offset = stub_sec->size;
3034   loc = stub_sec->contents + stub_entry->stub_offset;
3035
3036   stub_bfd = stub_sec->owner;
3037
3038   /* This is the address of the stub destination.  */
3039   sym_value = (stub_entry->target_value
3040                + stub_entry->target_section->output_offset
3041                + stub_entry->target_section->output_section->vma);
3042
3043   if (stub_entry->stub_type == aarch64_stub_long_branch)
3044     {
3045       bfd_vma place = (stub_entry->stub_offset + stub_sec->output_section->vma
3046                        + stub_sec->output_offset);
3047
3048       /* See if we can relax the stub.  */
3049       if (aarch64_valid_for_adrp_p (sym_value, place))
3050         stub_entry->stub_type = aarch64_select_branch_stub (sym_value, place);
3051     }
3052
3053   switch (stub_entry->stub_type)
3054     {
3055     case aarch64_stub_adrp_branch:
3056       template = aarch64_adrp_branch_stub;
3057       template_size = sizeof (aarch64_adrp_branch_stub);
3058       break;
3059     case aarch64_stub_long_branch:
3060       template = aarch64_long_branch_stub;
3061       template_size = sizeof (aarch64_long_branch_stub);
3062       break;
3063     case aarch64_stub_erratum_835769_veneer:
3064       template = aarch64_erratum_835769_stub;
3065       template_size = sizeof (aarch64_erratum_835769_stub);
3066       break;
3067     case aarch64_stub_erratum_843419_veneer:
3068       template = aarch64_erratum_843419_stub;
3069       template_size = sizeof (aarch64_erratum_843419_stub);
3070       break;
3071     default:
3072       abort ();
3073     }
3074
3075   for (i = 0; i < (template_size / sizeof template[0]); i++)
3076     {
3077       bfd_putl32 (template[i], loc);
3078       loc += 4;
3079     }
3080
3081   template_size = (template_size + 7) & ~7;
3082   stub_sec->size += template_size;
3083
3084   switch (stub_entry->stub_type)
3085     {
3086     case aarch64_stub_adrp_branch:
3087       if (!aarch64_relocate (AARCH64_R (ADR_PREL_PG_HI21), stub_bfd, stub_sec,
3088                              stub_entry->stub_offset, sym_value))
3089         /* The stub would not have been relaxed if the offset was out
3090            of range.  */
3091         BFD_FAIL ();
3092
3093       if (!aarch64_relocate (AARCH64_R (ADD_ABS_LO12_NC), stub_bfd, stub_sec,
3094                              stub_entry->stub_offset + 4, sym_value))
3095         BFD_FAIL ();
3096       break;
3097
3098     case aarch64_stub_long_branch:
3099       /* We want the value relative to the address 12 bytes back from the
3100          value itself.  */
3101       if (!aarch64_relocate (AARCH64_R (PRELNN), stub_bfd, stub_sec,
3102                              stub_entry->stub_offset + 16, sym_value + 12))
3103         BFD_FAIL ();
3104       break;
3105
3106     case aarch64_stub_erratum_835769_veneer:
3107       veneered_insn_loc = stub_entry->target_section->output_section->vma
3108                           + stub_entry->target_section->output_offset
3109                           + stub_entry->target_value;
3110       veneer_entry_loc = stub_entry->stub_sec->output_section->vma
3111                           + stub_entry->stub_sec->output_offset
3112                           + stub_entry->stub_offset;
3113       branch_offset = veneered_insn_loc - veneer_entry_loc;
3114       branch_offset >>= 2;
3115       branch_offset &= 0x3ffffff;
3116       bfd_putl32 (stub_entry->veneered_insn,
3117                   stub_sec->contents + stub_entry->stub_offset);
3118       bfd_putl32 (template[1] | branch_offset,
3119                   stub_sec->contents + stub_entry->stub_offset + 4);
3120       break;
3121
3122     case aarch64_stub_erratum_843419_veneer:
3123       if (!aarch64_relocate (AARCH64_R (JUMP26), stub_bfd, stub_sec,
3124                              stub_entry->stub_offset + 4, sym_value + 4))
3125         BFD_FAIL ();
3126       break;
3127
3128     default:
3129       abort ();
3130     }
3131
3132   return TRUE;
3133 }
3134
3135 /* As above, but don't actually build the stub.  Just bump offset so
3136    we know stub section sizes.  */
3137
3138 static bfd_boolean
3139 aarch64_size_one_stub (struct bfd_hash_entry *gen_entry,
3140                        void *in_arg ATTRIBUTE_UNUSED)
3141 {
3142   struct elf_aarch64_stub_hash_entry *stub_entry;
3143   int size;
3144
3145   /* Massage our args to the form they really have.  */
3146   stub_entry = (struct elf_aarch64_stub_hash_entry *) gen_entry;
3147
3148   switch (stub_entry->stub_type)
3149     {
3150     case aarch64_stub_adrp_branch:
3151       size = sizeof (aarch64_adrp_branch_stub);
3152       break;
3153     case aarch64_stub_long_branch:
3154       size = sizeof (aarch64_long_branch_stub);
3155       break;
3156     case aarch64_stub_erratum_835769_veneer:
3157       size = sizeof (aarch64_erratum_835769_stub);
3158       break;
3159     case aarch64_stub_erratum_843419_veneer:
3160       size = sizeof (aarch64_erratum_843419_stub);
3161       break;
3162     default:
3163       abort ();
3164     }
3165
3166   size = (size + 7) & ~7;
3167   stub_entry->stub_sec->size += size;
3168   return TRUE;
3169 }
3170
3171 /* External entry points for sizing and building linker stubs.  */
3172
3173 /* Set up various things so that we can make a list of input sections
3174    for each output section included in the link.  Returns -1 on error,
3175    0 when no stubs will be needed, and 1 on success.  */
3176
3177 int
3178 elfNN_aarch64_setup_section_lists (bfd *output_bfd,
3179                                    struct bfd_link_info *info)
3180 {
3181   bfd *input_bfd;
3182   unsigned int bfd_count;
3183   unsigned int top_id, top_index;
3184   asection *section;
3185   asection **input_list, **list;
3186   bfd_size_type amt;
3187   struct elf_aarch64_link_hash_table *htab =
3188     elf_aarch64_hash_table (info);
3189
3190   if (!is_elf_hash_table (htab))
3191     return 0;
3192
3193   /* Count the number of input BFDs and find the top input section id.  */
3194   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
3195        input_bfd != NULL; input_bfd = input_bfd->link.next)
3196     {
3197       bfd_count += 1;
3198       for (section = input_bfd->sections;
3199            section != NULL; section = section->next)
3200         {
3201           if (top_id < section->id)
3202             top_id = section->id;
3203         }
3204     }
3205   htab->bfd_count = bfd_count;
3206
3207   amt = sizeof (struct map_stub) * (top_id + 1);
3208   htab->stub_group = bfd_zmalloc (amt);
3209   if (htab->stub_group == NULL)
3210     return -1;
3211
3212   /* We can't use output_bfd->section_count here to find the top output
3213      section index as some sections may have been removed, and
3214      _bfd_strip_section_from_output doesn't renumber the indices.  */
3215   for (section = output_bfd->sections, top_index = 0;
3216        section != NULL; section = section->next)
3217     {
3218       if (top_index < section->index)
3219         top_index = section->index;
3220     }
3221
3222   htab->top_index = top_index;
3223   amt = sizeof (asection *) * (top_index + 1);
3224   input_list = bfd_malloc (amt);
3225   htab->input_list = input_list;
3226   if (input_list == NULL)
3227     return -1;
3228
3229   /* For sections we aren't interested in, mark their entries with a
3230      value we can check later.  */
3231   list = input_list + top_index;
3232   do
3233     *list = bfd_abs_section_ptr;
3234   while (list-- != input_list);
3235
3236   for (section = output_bfd->sections;
3237        section != NULL; section = section->next)
3238     {
3239       if ((section->flags & SEC_CODE) != 0)
3240         input_list[section->index] = NULL;
3241     }
3242
3243   return 1;
3244 }
3245
3246 /* Used by elfNN_aarch64_next_input_section and group_sections.  */
3247 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3248
3249 /* The linker repeatedly calls this function for each input section,
3250    in the order that input sections are linked into output sections.
3251    Build lists of input sections to determine groupings between which
3252    we may insert linker stubs.  */
3253
3254 void
3255 elfNN_aarch64_next_input_section (struct bfd_link_info *info, asection *isec)
3256 {
3257   struct elf_aarch64_link_hash_table *htab =
3258     elf_aarch64_hash_table (info);
3259
3260   if (isec->output_section->index <= htab->top_index)
3261     {
3262       asection **list = htab->input_list + isec->output_section->index;
3263
3264       if (*list != bfd_abs_section_ptr)
3265         {
3266           /* Steal the link_sec pointer for our list.  */
3267           /* This happens to make the list in reverse order,
3268              which is what we want.  */
3269           PREV_SEC (isec) = *list;
3270           *list = isec;
3271         }
3272     }
3273 }
3274
3275 /* See whether we can group stub sections together.  Grouping stub
3276    sections may result in fewer stubs.  More importantly, we need to
3277    put all .init* and .fini* stubs at the beginning of the .init or
3278    .fini output sections respectively, because glibc splits the
3279    _init and _fini functions into multiple parts.  Putting a stub in
3280    the middle of a function is not a good idea.  */
3281
3282 static void
3283 group_sections (struct elf_aarch64_link_hash_table *htab,
3284                 bfd_size_type stub_group_size,
3285                 bfd_boolean stubs_always_before_branch)
3286 {
3287   asection **list = htab->input_list + htab->top_index;
3288
3289   do
3290     {
3291       asection *tail = *list;
3292
3293       if (tail == bfd_abs_section_ptr)
3294         continue;
3295
3296       while (tail != NULL)
3297         {
3298           asection *curr;
3299           asection *prev;
3300           bfd_size_type total;
3301
3302           curr = tail;
3303           total = tail->size;
3304           while ((prev = PREV_SEC (curr)) != NULL
3305                  && ((total += curr->output_offset - prev->output_offset)
3306                      < stub_group_size))
3307             curr = prev;
3308
3309           /* OK, the size from the start of CURR to the end is less
3310              than stub_group_size and thus can be handled by one stub
3311              section.  (Or the tail section is itself larger than
3312              stub_group_size, in which case we may be toast.)
3313              We should really be keeping track of the total size of
3314              stubs added here, as stubs contribute to the final output
3315              section size.  */
3316           do
3317             {
3318               prev = PREV_SEC (tail);
3319               /* Set up this stub group.  */
3320               htab->stub_group[tail->id].link_sec = curr;
3321             }
3322           while (tail != curr && (tail = prev) != NULL);
3323
3324           /* But wait, there's more!  Input sections up to stub_group_size
3325              bytes before the stub section can be handled by it too.  */
3326           if (!stubs_always_before_branch)
3327             {
3328               total = 0;
3329               while (prev != NULL
3330                      && ((total += tail->output_offset - prev->output_offset)
3331                          < stub_group_size))
3332                 {
3333                   tail = prev;
3334                   prev = PREV_SEC (tail);
3335                   htab->stub_group[tail->id].link_sec = curr;
3336                 }
3337             }
3338           tail = prev;
3339         }
3340     }
3341   while (list-- != htab->input_list);
3342
3343   free (htab->input_list);
3344 }
3345
3346 #undef PREV_SEC
3347
3348 #define AARCH64_BITS(x, pos, n) (((x) >> (pos)) & ((1 << (n)) - 1))
3349
3350 #define AARCH64_RT(insn) AARCH64_BITS (insn, 0, 5)
3351 #define AARCH64_RT2(insn) AARCH64_BITS (insn, 10, 5)
3352 #define AARCH64_RA(insn) AARCH64_BITS (insn, 10, 5)
3353 #define AARCH64_RD(insn) AARCH64_BITS (insn, 0, 5)
3354 #define AARCH64_RN(insn) AARCH64_BITS (insn, 5, 5)
3355 #define AARCH64_RM(insn) AARCH64_BITS (insn, 16, 5)
3356
3357 #define AARCH64_MAC(insn) (((insn) & 0xff000000) == 0x9b000000)
3358 #define AARCH64_BIT(insn, n) AARCH64_BITS (insn, n, 1)
3359 #define AARCH64_OP31(insn) AARCH64_BITS (insn, 21, 3)
3360 #define AARCH64_ZR 0x1f
3361
3362 /* All ld/st ops.  See C4-182 of the ARM ARM.  The encoding space for
3363    LD_PCREL, LDST_RO, LDST_UI and LDST_UIMM cover prefetch ops.  */
3364
3365 #define AARCH64_LD(insn) (AARCH64_BIT (insn, 22) == 1)
3366 #define AARCH64_LDST(insn) (((insn) & 0x0a000000) == 0x08000000)
3367 #define AARCH64_LDST_EX(insn) (((insn) & 0x3f000000) == 0x08000000)
3368 #define AARCH64_LDST_PCREL(insn) (((insn) & 0x3b000000) == 0x18000000)
3369 #define AARCH64_LDST_NAP(insn) (((insn) & 0x3b800000) == 0x28000000)
3370 #define AARCH64_LDSTP_PI(insn) (((insn) & 0x3b800000) == 0x28800000)
3371 #define AARCH64_LDSTP_O(insn) (((insn) & 0x3b800000) == 0x29000000)
3372 #define AARCH64_LDSTP_PRE(insn) (((insn) & 0x3b800000) == 0x29800000)
3373 #define AARCH64_LDST_UI(insn) (((insn) & 0x3b200c00) == 0x38000000)
3374 #define AARCH64_LDST_PIIMM(insn) (((insn) & 0x3b200c00) == 0x38000400)
3375 #define AARCH64_LDST_U(insn) (((insn) & 0x3b200c00) == 0x38000800)
3376 #define AARCH64_LDST_PREIMM(insn) (((insn) & 0x3b200c00) == 0x38000c00)
3377 #define AARCH64_LDST_RO(insn) (((insn) & 0x3b200c00) == 0x38200800)
3378 #define AARCH64_LDST_UIMM(insn) (((insn) & 0x3b000000) == 0x39000000)
3379 #define AARCH64_LDST_SIMD_M(insn) (((insn) & 0xbfbf0000) == 0x0c000000)
3380 #define AARCH64_LDST_SIMD_M_PI(insn) (((insn) & 0xbfa00000) == 0x0c800000)
3381 #define AARCH64_LDST_SIMD_S(insn) (((insn) & 0xbf9f0000) == 0x0d000000)
3382 #define AARCH64_LDST_SIMD_S_PI(insn) (((insn) & 0xbf800000) == 0x0d800000)
3383
3384 /* Classify an INSN if it is indeed a load/store.
3385
3386    Return TRUE if INSN is a LD/ST instruction otherwise return FALSE.
3387
3388    For scalar LD/ST instructions PAIR is FALSE, RT is returned and RT2
3389    is set equal to RT.
3390
3391    For LD/ST pair instructions PAIR is TRUE, RT and RT2 are returned.  */
3392
3393 static bfd_boolean
3394 aarch64_mem_op_p (uint32_t insn, unsigned int *rt, unsigned int *rt2,
3395                   bfd_boolean *pair, bfd_boolean *load)
3396 {
3397   uint32_t opcode;
3398   unsigned int r;
3399   uint32_t opc = 0;
3400   uint32_t v = 0;
3401   uint32_t opc_v = 0;
3402
3403   /* Bail out quickly if INSN doesn't fall into the load-store
3404      encoding space.  */
3405   if (!AARCH64_LDST (insn))
3406     return FALSE;
3407
3408   *pair = FALSE;
3409   *load = FALSE;
3410   if (AARCH64_LDST_EX (insn))
3411     {
3412       *rt = AARCH64_RT (insn);
3413       *rt2 = *rt;
3414       if (AARCH64_BIT (insn, 21) == 1)
3415         {
3416           *pair = TRUE;
3417           *rt2 = AARCH64_RT2 (insn);
3418         }
3419       *load = AARCH64_LD (insn);
3420       return TRUE;
3421     }
3422   else if (AARCH64_LDST_NAP (insn)
3423            || AARCH64_LDSTP_PI (insn)
3424            || AARCH64_LDSTP_O (insn)
3425            || AARCH64_LDSTP_PRE (insn))
3426     {
3427       *pair = TRUE;
3428       *rt = AARCH64_RT (insn);
3429       *rt2 = AARCH64_RT2 (insn);
3430       *load = AARCH64_LD (insn);
3431       return TRUE;
3432     }
3433   else if (AARCH64_LDST_PCREL (insn)
3434            || AARCH64_LDST_UI (insn)
3435            || AARCH64_LDST_PIIMM (insn)
3436            || AARCH64_LDST_U (insn)
3437            || AARCH64_LDST_PREIMM (insn)
3438            || AARCH64_LDST_RO (insn)
3439            || AARCH64_LDST_UIMM (insn))
3440    {
3441       *rt = AARCH64_RT (insn);
3442       *rt2 = *rt;
3443       if (AARCH64_LDST_PCREL (insn))
3444         *load = TRUE;
3445       opc = AARCH64_BITS (insn, 22, 2);
3446       v = AARCH64_BIT (insn, 26);
3447       opc_v = opc | (v << 2);
3448       *load =  (opc_v == 1 || opc_v == 2 || opc_v == 3
3449                 || opc_v == 5 || opc_v == 7);
3450       return TRUE;
3451    }
3452   else if (AARCH64_LDST_SIMD_M (insn)
3453            || AARCH64_LDST_SIMD_M_PI (insn))
3454     {
3455       *rt = AARCH64_RT (insn);
3456       *load = AARCH64_BIT (insn, 22);
3457       opcode = (insn >> 12) & 0xf;
3458       switch (opcode)
3459         {
3460         case 0:
3461         case 2:
3462           *rt2 = *rt + 3;
3463           break;
3464
3465         case 4:
3466         case 6:
3467           *rt2 = *rt + 2;
3468           break;
3469
3470         case 7:
3471           *rt2 = *rt;
3472           break;
3473
3474         case 8:
3475         case 10:
3476           *rt2 = *rt + 1;
3477           break;
3478
3479         default:
3480           return FALSE;
3481         }
3482       return TRUE;
3483     }
3484   else if (AARCH64_LDST_SIMD_S (insn)
3485            || AARCH64_LDST_SIMD_S_PI (insn))
3486     {
3487       *rt = AARCH64_RT (insn);
3488       r = (insn >> 21) & 1;
3489       *load = AARCH64_BIT (insn, 22);
3490       opcode = (insn >> 13) & 0x7;
3491       switch (opcode)
3492         {
3493         case 0:
3494         case 2:
3495         case 4:
3496           *rt2 = *rt + r;
3497           break;
3498
3499         case 1:
3500         case 3:
3501         case 5:
3502           *rt2 = *rt + (r == 0 ? 2 : 3);
3503           break;
3504
3505         case 6:
3506           *rt2 = *rt + r;
3507           break;
3508
3509         case 7:
3510           *rt2 = *rt + (r == 0 ? 2 : 3);
3511           break;
3512
3513         default:
3514           return FALSE;
3515         }
3516       return TRUE;
3517     }
3518
3519   return FALSE;
3520 }
3521
3522 /* Return TRUE if INSN is multiply-accumulate.  */
3523
3524 static bfd_boolean
3525 aarch64_mlxl_p (uint32_t insn)
3526 {
3527   uint32_t op31 = AARCH64_OP31 (insn);
3528
3529   if (AARCH64_MAC (insn)
3530       && (op31 == 0 || op31 == 1 || op31 == 5)
3531       /* Exclude MUL instructions which are encoded as a multiple accumulate
3532          with RA = XZR.  */
3533       && AARCH64_RA (insn) != AARCH64_ZR)
3534     return TRUE;
3535
3536   return FALSE;
3537 }
3538
3539 /* Some early revisions of the Cortex-A53 have an erratum (835769) whereby
3540    it is possible for a 64-bit multiply-accumulate instruction to generate an
3541    incorrect result.  The details are quite complex and hard to
3542    determine statically, since branches in the code may exist in some
3543    circumstances, but all cases end with a memory (load, store, or
3544    prefetch) instruction followed immediately by the multiply-accumulate
3545    operation.  We employ a linker patching technique, by moving the potentially
3546    affected multiply-accumulate instruction into a patch region and replacing
3547    the original instruction with a branch to the patch.  This function checks
3548    if INSN_1 is the memory operation followed by a multiply-accumulate
3549    operation (INSN_2).  Return TRUE if an erratum sequence is found, FALSE
3550    if INSN_1 and INSN_2 are safe.  */
3551
3552 static bfd_boolean
3553 aarch64_erratum_sequence (uint32_t insn_1, uint32_t insn_2)
3554 {
3555   uint32_t rt;
3556   uint32_t rt2;
3557   uint32_t rn;
3558   uint32_t rm;
3559   uint32_t ra;
3560   bfd_boolean pair;
3561   bfd_boolean load;
3562
3563   if (aarch64_mlxl_p (insn_2)
3564       && aarch64_mem_op_p (insn_1, &rt, &rt2, &pair, &load))
3565     {
3566       /* Any SIMD memory op is independent of the subsequent MLA
3567          by definition of the erratum.  */
3568       if (AARCH64_BIT (insn_1, 26))
3569         return TRUE;
3570
3571       /* If not SIMD, check for integer memory ops and MLA relationship.  */
3572       rn = AARCH64_RN (insn_2);
3573       ra = AARCH64_RA (insn_2);
3574       rm = AARCH64_RM (insn_2);
3575
3576       /* If this is a load and there's a true(RAW) dependency, we are safe
3577          and this is not an erratum sequence.  */
3578       if (load &&
3579           (rt == rn || rt == rm || rt == ra
3580            || (pair && (rt2 == rn || rt2 == rm || rt2 == ra))))
3581         return FALSE;
3582
3583       /* We conservatively put out stubs for all other cases (including
3584          writebacks).  */
3585       return TRUE;
3586     }
3587
3588   return FALSE;
3589 }
3590
3591 /* Used to order a list of mapping symbols by address.  */
3592
3593 static int
3594 elf_aarch64_compare_mapping (const void *a, const void *b)
3595 {
3596   const elf_aarch64_section_map *amap = (const elf_aarch64_section_map *) a;
3597   const elf_aarch64_section_map *bmap = (const elf_aarch64_section_map *) b;
3598
3599   if (amap->vma > bmap->vma)
3600     return 1;
3601   else if (amap->vma < bmap->vma)
3602     return -1;
3603   else if (amap->type > bmap->type)
3604     /* Ensure results do not depend on the host qsort for objects with
3605        multiple mapping symbols at the same address by sorting on type
3606        after vma.  */
3607     return 1;
3608   else if (amap->type < bmap->type)
3609     return -1;
3610   else
3611     return 0;
3612 }
3613
3614
3615 static char *
3616 _bfd_aarch64_erratum_835769_stub_name (unsigned num_fixes)
3617 {
3618   char *stub_name = (char *) bfd_malloc
3619     (strlen ("__erratum_835769_veneer_") + 16);
3620   sprintf (stub_name,"__erratum_835769_veneer_%d", num_fixes);
3621   return stub_name;
3622 }
3623
3624 /* Scan for Cortex-A53 erratum 835769 sequence.
3625
3626    Return TRUE else FALSE on abnormal termination.  */
3627
3628 static bfd_boolean
3629 _bfd_aarch64_erratum_835769_scan (bfd *input_bfd,
3630                                   struct bfd_link_info *info,
3631                                   unsigned int *num_fixes_p)
3632 {
3633   asection *section;
3634   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
3635   unsigned int num_fixes = *num_fixes_p;
3636
3637   if (htab == NULL)
3638     return TRUE;
3639
3640   for (section = input_bfd->sections;
3641        section != NULL;
3642        section = section->next)
3643     {
3644       bfd_byte *contents = NULL;
3645       struct _aarch64_elf_section_data *sec_data;
3646       unsigned int span;
3647
3648       if (elf_section_type (section) != SHT_PROGBITS
3649           || (elf_section_flags (section) & SHF_EXECINSTR) == 0
3650           || (section->flags & SEC_EXCLUDE) != 0
3651           || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
3652           || (section->output_section == bfd_abs_section_ptr))
3653         continue;
3654
3655       if (elf_section_data (section)->this_hdr.contents != NULL)
3656         contents = elf_section_data (section)->this_hdr.contents;
3657       else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
3658         return FALSE;
3659
3660       sec_data = elf_aarch64_section_data (section);
3661
3662       qsort (sec_data->map, sec_data->mapcount,
3663              sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
3664
3665       for (span = 0; span < sec_data->mapcount; span++)
3666         {
3667           unsigned int span_start = sec_data->map[span].vma;
3668           unsigned int span_end = ((span == sec_data->mapcount - 1)
3669                                    ? sec_data->map[0].vma + section->size
3670                                    : sec_data->map[span + 1].vma);
3671           unsigned int i;
3672           char span_type = sec_data->map[span].type;
3673
3674           if (span_type == 'd')
3675             continue;
3676
3677           for (i = span_start; i + 4 < span_end; i += 4)
3678             {
3679               uint32_t insn_1 = bfd_getl32 (contents + i);
3680               uint32_t insn_2 = bfd_getl32 (contents + i + 4);
3681
3682               if (aarch64_erratum_sequence (insn_1, insn_2))
3683                 {
3684                   struct elf_aarch64_stub_hash_entry *stub_entry;
3685                   char *stub_name = _bfd_aarch64_erratum_835769_stub_name (num_fixes);
3686                   if (! stub_name)
3687                     return FALSE;
3688
3689                   stub_entry = _bfd_aarch64_add_stub_entry_in_group (stub_name,
3690                                                                      section,
3691                                                                      htab);
3692                   if (! stub_entry)
3693                     return FALSE;
3694
3695                   stub_entry->stub_type = aarch64_stub_erratum_835769_veneer;
3696                   stub_entry->target_section = section;
3697                   stub_entry->target_value = i + 4;
3698                   stub_entry->veneered_insn = insn_2;
3699                   stub_entry->output_name = stub_name;
3700                   num_fixes++;
3701                 }
3702             }
3703         }
3704       if (elf_section_data (section)->this_hdr.contents == NULL)
3705         free (contents);
3706     }
3707
3708   *num_fixes_p = num_fixes;
3709
3710   return TRUE;
3711 }
3712
3713
3714 /* Test if instruction INSN is ADRP.  */
3715
3716 static bfd_boolean
3717 _bfd_aarch64_adrp_p (uint32_t insn)
3718 {
3719   return ((insn & 0x9f000000) == 0x90000000);
3720 }
3721
3722
3723 /* Helper predicate to look for cortex-a53 erratum 843419 sequence 1.  */
3724
3725 static bfd_boolean
3726 _bfd_aarch64_erratum_843419_sequence_p (uint32_t insn_1, uint32_t insn_2,
3727                                         uint32_t insn_3)
3728 {
3729   uint32_t rt;
3730   uint32_t rt2;
3731   bfd_boolean pair;
3732   bfd_boolean load;
3733
3734   return (aarch64_mem_op_p (insn_2, &rt, &rt2, &pair, &load)
3735           && (!pair
3736               || (pair && !load))
3737           && AARCH64_LDST_UIMM (insn_3)
3738           && AARCH64_RN (insn_3) == AARCH64_RD (insn_1));
3739 }
3740
3741
3742 /* Test for the presence of Cortex-A53 erratum 843419 instruction sequence.
3743
3744    Return TRUE if section CONTENTS at offset I contains one of the
3745    erratum 843419 sequences, otherwise return FALSE.  If a sequence is
3746    seen set P_VENEER_I to the offset of the final LOAD/STORE
3747    instruction in the sequence.
3748  */
3749
3750 static bfd_boolean
3751 _bfd_aarch64_erratum_843419_p (bfd_byte *contents, bfd_vma vma,
3752                                bfd_vma i, bfd_vma span_end,
3753                                bfd_vma *p_veneer_i)
3754 {
3755   uint32_t insn_1 = bfd_getl32 (contents + i);
3756
3757   if (!_bfd_aarch64_adrp_p (insn_1))
3758     return FALSE;
3759
3760   if (span_end < i + 12)
3761     return FALSE;
3762
3763   uint32_t insn_2 = bfd_getl32 (contents + i + 4);
3764   uint32_t insn_3 = bfd_getl32 (contents + i + 8);
3765
3766   if ((vma & 0xfff) != 0xff8 && (vma & 0xfff) != 0xffc)
3767     return FALSE;
3768
3769   if (_bfd_aarch64_erratum_843419_sequence_p (insn_1, insn_2, insn_3))
3770     {
3771       *p_veneer_i = i + 8;
3772       return TRUE;
3773     }
3774
3775   if (span_end < i + 16)
3776     return FALSE;
3777
3778   uint32_t insn_4 = bfd_getl32 (contents + i + 12);
3779
3780   if (_bfd_aarch64_erratum_843419_sequence_p (insn_1, insn_2, insn_4))
3781     {
3782       *p_veneer_i = i + 12;
3783       return TRUE;
3784     }
3785
3786   return FALSE;
3787 }
3788
3789
3790 /* Resize all stub sections.  */
3791
3792 static void
3793 _bfd_aarch64_resize_stubs (struct elf_aarch64_link_hash_table *htab)
3794 {
3795   asection *section;
3796
3797   /* OK, we've added some stubs.  Find out the new size of the
3798      stub sections.  */
3799   for (section = htab->stub_bfd->sections;
3800        section != NULL; section = section->next)
3801     {
3802       /* Ignore non-stub sections.  */
3803       if (!strstr (section->name, STUB_SUFFIX))
3804         continue;
3805       section->size = 0;
3806     }
3807
3808   bfd_hash_traverse (&htab->stub_hash_table, aarch64_size_one_stub, htab);
3809
3810   for (section = htab->stub_bfd->sections;
3811        section != NULL; section = section->next)
3812     {
3813       if (!strstr (section->name, STUB_SUFFIX))
3814         continue;
3815
3816       /* Add space for a branch.  Add 8 bytes to keep section 8 byte aligned,
3817          as long branch stubs contain a 64-bit address.  */
3818       if (section->size)
3819         section->size += 8;
3820
3821       /* Ensure all stub sections have a size which is a multiple of
3822          4096.  This is important in order to ensure that the insertion
3823          of stub sections does not in itself move existing code around
3824          in such a way that new errata sequences are created.  */
3825       if (htab->fix_erratum_843419)
3826         if (section->size)
3827           section->size = BFD_ALIGN (section->size, 0x1000);
3828     }
3829 }
3830
3831 /* Construct an erratum 843419 workaround stub name.  */
3832
3833 static char *
3834 _bfd_aarch64_erratum_843419_stub_name (asection *input_section,
3835                                        bfd_vma offset)
3836 {
3837   const bfd_size_type len = 8 + 4 + 1 + 8 + 1 + 16 + 1;
3838   char *stub_name = bfd_malloc (len);
3839
3840   if (stub_name != NULL)
3841     snprintf (stub_name, len, "e843419@%04x_%08x_%" BFD_VMA_FMT "x",
3842               input_section->owner->id,
3843               input_section->id,
3844               offset);
3845   return stub_name;
3846 }
3847
3848 /*  Build a stub_entry structure describing an 843419 fixup.
3849
3850     The stub_entry constructed is populated with the bit pattern INSN
3851     of the instruction located at OFFSET within input SECTION.
3852
3853     Returns TRUE on success.  */
3854
3855 static bfd_boolean
3856 _bfd_aarch64_erratum_843419_fixup (uint32_t insn,
3857                                    bfd_vma adrp_offset,
3858                                    bfd_vma ldst_offset,
3859                                    asection *section,
3860                                    struct bfd_link_info *info)
3861 {
3862   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
3863   char *stub_name;
3864   struct elf_aarch64_stub_hash_entry *stub_entry;
3865
3866   stub_name = _bfd_aarch64_erratum_843419_stub_name (section, ldst_offset);
3867   stub_entry = aarch64_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3868                                          FALSE, FALSE);
3869   if (stub_entry)
3870     {
3871       free (stub_name);
3872       return TRUE;
3873     }
3874
3875   /* We always place an 843419 workaround veneer in the stub section
3876      attached to the input section in which an erratum sequence has
3877      been found.  This ensures that later in the link process (in
3878      elfNN_aarch64_write_section) when we copy the veneered
3879      instruction from the input section into the stub section the
3880      copied instruction will have had any relocations applied to it.
3881      If we placed workaround veneers in any other stub section then we
3882      could not assume that all relocations have been processed on the
3883      corresponding input section at the point we output the stub
3884      section.
3885    */
3886
3887   stub_entry = _bfd_aarch64_add_stub_entry_after (stub_name, section, htab);
3888   if (stub_entry == NULL)
3889     {
3890       free (stub_name);
3891       return FALSE;
3892     }
3893
3894   stub_entry->adrp_offset = adrp_offset;
3895   stub_entry->target_value = ldst_offset;
3896   stub_entry->target_section = section;
3897   stub_entry->stub_type = aarch64_stub_erratum_843419_veneer;
3898   stub_entry->veneered_insn = insn;
3899   stub_entry->output_name = stub_name;
3900
3901   return TRUE;
3902 }
3903
3904
3905 /* Scan an input section looking for the signature of erratum 843419.
3906
3907    Scans input SECTION in INPUT_BFD looking for erratum 843419
3908    signatures, for each signature found a stub_entry is created
3909    describing the location of the erratum for subsequent fixup.
3910
3911    Return TRUE on successful scan, FALSE on failure to scan.
3912  */
3913
3914 static bfd_boolean
3915 _bfd_aarch64_erratum_843419_scan (bfd *input_bfd, asection *section,
3916                                   struct bfd_link_info *info)
3917 {
3918   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
3919
3920   if (htab == NULL)
3921     return TRUE;
3922
3923   if (elf_section_type (section) != SHT_PROGBITS
3924       || (elf_section_flags (section) & SHF_EXECINSTR) == 0
3925       || (section->flags & SEC_EXCLUDE) != 0
3926       || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
3927       || (section->output_section == bfd_abs_section_ptr))
3928     return TRUE;
3929
3930   do
3931     {
3932       bfd_byte *contents = NULL;
3933       struct _aarch64_elf_section_data *sec_data;
3934       unsigned int span;
3935
3936       if (elf_section_data (section)->this_hdr.contents != NULL)
3937         contents = elf_section_data (section)->this_hdr.contents;
3938       else if (! bfd_malloc_and_get_section (input_bfd, section, &contents))
3939         return FALSE;
3940
3941       sec_data = elf_aarch64_section_data (section);
3942
3943       qsort (sec_data->map, sec_data->mapcount,
3944              sizeof (elf_aarch64_section_map), elf_aarch64_compare_mapping);
3945
3946       for (span = 0; span < sec_data->mapcount; span++)
3947         {
3948           unsigned int span_start = sec_data->map[span].vma;
3949           unsigned int span_end = ((span == sec_data->mapcount - 1)
3950                                    ? sec_data->map[0].vma + section->size
3951                                    : sec_data->map[span + 1].vma);
3952           unsigned int i;
3953           char span_type = sec_data->map[span].type;
3954
3955           if (span_type == 'd')
3956             continue;
3957
3958           for (i = span_start; i + 8 < span_end; i += 4)
3959             {
3960               bfd_vma vma = (section->output_section->vma
3961                              + section->output_offset
3962                              + i);
3963               bfd_vma veneer_i;
3964
3965               if (_bfd_aarch64_erratum_843419_p
3966                   (contents, vma, i, span_end, &veneer_i))
3967                 {
3968                   uint32_t insn = bfd_getl32 (contents + veneer_i);
3969
3970                   if (!_bfd_aarch64_erratum_843419_fixup (insn, i, veneer_i,
3971                                                           section, info))
3972                     return FALSE;
3973                 }
3974             }
3975         }
3976
3977       if (elf_section_data (section)->this_hdr.contents == NULL)
3978         free (contents);
3979     }
3980   while (0);
3981
3982   return TRUE;
3983 }
3984
3985
3986 /* Determine and set the size of the stub section for a final link.
3987
3988    The basic idea here is to examine all the relocations looking for
3989    PC-relative calls to a target that is unreachable with a "bl"
3990    instruction.  */
3991
3992 bfd_boolean
3993 elfNN_aarch64_size_stubs (bfd *output_bfd,
3994                           bfd *stub_bfd,
3995                           struct bfd_link_info *info,
3996                           bfd_signed_vma group_size,
3997                           asection * (*add_stub_section) (const char *,
3998                                                           asection *),
3999                           void (*layout_sections_again) (void))
4000 {
4001   bfd_size_type stub_group_size;
4002   bfd_boolean stubs_always_before_branch;
4003   bfd_boolean stub_changed = FALSE;
4004   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
4005   unsigned int num_erratum_835769_fixes = 0;
4006
4007   /* Propagate mach to stub bfd, because it may not have been
4008      finalized when we created stub_bfd.  */
4009   bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
4010                      bfd_get_mach (output_bfd));
4011
4012   /* Stash our params away.  */
4013   htab->stub_bfd = stub_bfd;
4014   htab->add_stub_section = add_stub_section;
4015   htab->layout_sections_again = layout_sections_again;
4016   stubs_always_before_branch = group_size < 0;
4017   if (group_size < 0)
4018     stub_group_size = -group_size;
4019   else
4020     stub_group_size = group_size;
4021
4022   if (stub_group_size == 1)
4023     {
4024       /* Default values.  */
4025       /* AArch64 branch range is +-128MB. The value used is 1MB less.  */
4026       stub_group_size = 127 * 1024 * 1024;
4027     }
4028
4029   group_sections (htab, stub_group_size, stubs_always_before_branch);
4030
4031   (*htab->layout_sections_again) ();
4032
4033   if (htab->fix_erratum_835769)
4034     {
4035       bfd *input_bfd;
4036
4037       for (input_bfd = info->input_bfds;
4038            input_bfd != NULL; input_bfd = input_bfd->link.next)
4039         if (!_bfd_aarch64_erratum_835769_scan (input_bfd, info,
4040                                                &num_erratum_835769_fixes))
4041           return FALSE;
4042
4043       _bfd_aarch64_resize_stubs (htab);
4044       (*htab->layout_sections_again) ();
4045     }
4046
4047   if (htab->fix_erratum_843419)
4048     {
4049       bfd *input_bfd;
4050
4051       for (input_bfd = info->input_bfds;
4052            input_bfd != NULL;
4053            input_bfd = input_bfd->link.next)
4054         {
4055           asection *section;
4056
4057           for (section = input_bfd->sections;
4058                section != NULL;
4059                section = section->next)
4060             if (!_bfd_aarch64_erratum_843419_scan (input_bfd, section, info))
4061               return FALSE;
4062         }
4063
4064       _bfd_aarch64_resize_stubs (htab);
4065       (*htab->layout_sections_again) ();
4066     }
4067
4068   while (1)
4069     {
4070       bfd *input_bfd;
4071
4072       for (input_bfd = info->input_bfds;
4073            input_bfd != NULL; input_bfd = input_bfd->link.next)
4074         {
4075           Elf_Internal_Shdr *symtab_hdr;
4076           asection *section;
4077           Elf_Internal_Sym *local_syms = NULL;
4078
4079           /* We'll need the symbol table in a second.  */
4080           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4081           if (symtab_hdr->sh_info == 0)
4082             continue;
4083
4084           /* Walk over each section attached to the input bfd.  */
4085           for (section = input_bfd->sections;
4086                section != NULL; section = section->next)
4087             {
4088               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
4089
4090               /* If there aren't any relocs, then there's nothing more
4091                  to do.  */
4092               if ((section->flags & SEC_RELOC) == 0
4093                   || section->reloc_count == 0
4094                   || (section->flags & SEC_CODE) == 0)
4095                 continue;
4096
4097               /* If this section is a link-once section that will be
4098                  discarded, then don't create any stubs.  */
4099               if (section->output_section == NULL
4100                   || section->output_section->owner != output_bfd)
4101                 continue;
4102
4103               /* Get the relocs.  */
4104               internal_relocs
4105                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
4106                                              NULL, info->keep_memory);
4107               if (internal_relocs == NULL)
4108                 goto error_ret_free_local;
4109
4110               /* Now examine each relocation.  */
4111               irela = internal_relocs;
4112               irelaend = irela + section->reloc_count;
4113               for (; irela < irelaend; irela++)
4114                 {
4115                   unsigned int r_type, r_indx;
4116                   enum elf_aarch64_stub_type stub_type;
4117                   struct elf_aarch64_stub_hash_entry *stub_entry;
4118                   asection *sym_sec;
4119                   bfd_vma sym_value;
4120                   bfd_vma destination;
4121                   struct elf_aarch64_link_hash_entry *hash;
4122                   const char *sym_name;
4123                   char *stub_name;
4124                   const asection *id_sec;
4125                   unsigned char st_type;
4126                   bfd_size_type len;
4127
4128                   r_type = ELFNN_R_TYPE (irela->r_info);
4129                   r_indx = ELFNN_R_SYM (irela->r_info);
4130
4131                   if (r_type >= (unsigned int) R_AARCH64_end)
4132                     {
4133                       bfd_set_error (bfd_error_bad_value);
4134                     error_ret_free_internal:
4135                       if (elf_section_data (section)->relocs == NULL)
4136                         free (internal_relocs);
4137                       goto error_ret_free_local;
4138                     }
4139
4140                   /* Only look for stubs on unconditional branch and
4141                      branch and link instructions.  */
4142                   if (r_type != (unsigned int) AARCH64_R (CALL26)
4143                       && r_type != (unsigned int) AARCH64_R (JUMP26))
4144                     continue;
4145
4146                   /* Now determine the call target, its name, value,
4147                      section.  */
4148                   sym_sec = NULL;
4149                   sym_value = 0;
4150                   destination = 0;
4151                   hash = NULL;
4152                   sym_name = NULL;
4153                   if (r_indx < symtab_hdr->sh_info)
4154                     {
4155                       /* It's a local symbol.  */
4156                       Elf_Internal_Sym *sym;
4157                       Elf_Internal_Shdr *hdr;
4158
4159                       if (local_syms == NULL)
4160                         {
4161                           local_syms
4162                             = (Elf_Internal_Sym *) symtab_hdr->contents;
4163                           if (local_syms == NULL)
4164                             local_syms
4165                               = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
4166                                                       symtab_hdr->sh_info, 0,
4167                                                       NULL, NULL, NULL);
4168                           if (local_syms == NULL)
4169                             goto error_ret_free_internal;
4170                         }
4171
4172                       sym = local_syms + r_indx;
4173                       hdr = elf_elfsections (input_bfd)[sym->st_shndx];
4174                       sym_sec = hdr->bfd_section;
4175                       if (!sym_sec)
4176                         /* This is an undefined symbol.  It can never
4177                            be resolved.  */
4178                         continue;
4179
4180                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4181                         sym_value = sym->st_value;
4182                       destination = (sym_value + irela->r_addend
4183                                      + sym_sec->output_offset
4184                                      + sym_sec->output_section->vma);
4185                       st_type = ELF_ST_TYPE (sym->st_info);
4186                       sym_name
4187                         = bfd_elf_string_from_elf_section (input_bfd,
4188                                                            symtab_hdr->sh_link,
4189                                                            sym->st_name);
4190                     }
4191                   else
4192                     {
4193                       int e_indx;
4194
4195                       e_indx = r_indx - symtab_hdr->sh_info;
4196                       hash = ((struct elf_aarch64_link_hash_entry *)
4197                               elf_sym_hashes (input_bfd)[e_indx]);
4198
4199                       while (hash->root.root.type == bfd_link_hash_indirect
4200                              || hash->root.root.type == bfd_link_hash_warning)
4201                         hash = ((struct elf_aarch64_link_hash_entry *)
4202                                 hash->root.root.u.i.link);
4203
4204                       if (hash->root.root.type == bfd_link_hash_defined
4205                           || hash->root.root.type == bfd_link_hash_defweak)
4206                         {
4207                           struct elf_aarch64_link_hash_table *globals =
4208                             elf_aarch64_hash_table (info);
4209                           sym_sec = hash->root.root.u.def.section;
4210                           sym_value = hash->root.root.u.def.value;
4211                           /* For a destination in a shared library,
4212                              use the PLT stub as target address to
4213                              decide whether a branch stub is
4214                              needed.  */
4215                           if (globals->root.splt != NULL && hash != NULL
4216                               && hash->root.plt.offset != (bfd_vma) - 1)
4217                             {
4218                               sym_sec = globals->root.splt;
4219                               sym_value = hash->root.plt.offset;
4220                               if (sym_sec->output_section != NULL)
4221                                 destination = (sym_value
4222                                                + sym_sec->output_offset
4223                                                +
4224                                                sym_sec->output_section->vma);
4225                             }
4226                           else if (sym_sec->output_section != NULL)
4227                             destination = (sym_value + irela->r_addend
4228                                            + sym_sec->output_offset
4229                                            + sym_sec->output_section->vma);
4230                         }
4231                       else if (hash->root.root.type == bfd_link_hash_undefined
4232                                || (hash->root.root.type
4233                                    == bfd_link_hash_undefweak))
4234                         {
4235                           /* For a shared library, use the PLT stub as
4236                              target address to decide whether a long
4237                              branch stub is needed.
4238                              For absolute code, they cannot be handled.  */
4239                           struct elf_aarch64_link_hash_table *globals =
4240                             elf_aarch64_hash_table (info);
4241
4242                           if (globals->root.splt != NULL && hash != NULL
4243                               && hash->root.plt.offset != (bfd_vma) - 1)
4244                             {
4245                               sym_sec = globals->root.splt;
4246                               sym_value = hash->root.plt.offset;
4247                               if (sym_sec->output_section != NULL)
4248                                 destination = (sym_value
4249                                                + sym_sec->output_offset
4250                                                +
4251                                                sym_sec->output_section->vma);
4252                             }
4253                           else
4254                             continue;
4255                         }
4256                       else
4257                         {
4258                           bfd_set_error (bfd_error_bad_value);
4259                           goto error_ret_free_internal;
4260                         }
4261                       st_type = ELF_ST_TYPE (hash->root.type);
4262                       sym_name = hash->root.root.root.string;
4263                     }
4264
4265                   /* Determine what (if any) linker stub is needed.  */
4266                   stub_type = aarch64_type_of_stub (section, irela, sym_sec,
4267                                                     st_type, destination);
4268                   if (stub_type == aarch64_stub_none)
4269                     continue;
4270
4271                   /* Support for grouping stub sections.  */
4272                   id_sec = htab->stub_group[section->id].link_sec;
4273
4274                   /* Get the name of this stub.  */
4275                   stub_name = elfNN_aarch64_stub_name (id_sec, sym_sec, hash,
4276                                                        irela);
4277                   if (!stub_name)
4278                     goto error_ret_free_internal;
4279
4280                   stub_entry =
4281                     aarch64_stub_hash_lookup (&htab->stub_hash_table,
4282                                               stub_name, FALSE, FALSE);
4283                   if (stub_entry != NULL)
4284                     {
4285                       /* The proper stub has already been created.  */
4286                       free (stub_name);
4287                       continue;
4288                     }
4289
4290                   stub_entry = _bfd_aarch64_add_stub_entry_in_group
4291                     (stub_name, section, htab);
4292                   if (stub_entry == NULL)
4293                     {
4294                       free (stub_name);
4295                       goto error_ret_free_internal;
4296                     }
4297
4298                   stub_entry->target_value = sym_value + irela->r_addend;
4299                   stub_entry->target_section = sym_sec;
4300                   stub_entry->stub_type = stub_type;
4301                   stub_entry->h = hash;
4302                   stub_entry->st_type = st_type;
4303
4304                   if (sym_name == NULL)
4305                     sym_name = "unnamed";
4306                   len = sizeof (STUB_ENTRY_NAME) + strlen (sym_name);
4307                   stub_entry->output_name = bfd_alloc (htab->stub_bfd, len);
4308                   if (stub_entry->output_name == NULL)
4309                     {
4310                       free (stub_name);
4311                       goto error_ret_free_internal;
4312                     }
4313
4314                   snprintf (stub_entry->output_name, len, STUB_ENTRY_NAME,
4315                             sym_name);
4316
4317                   stub_changed = TRUE;
4318                 }
4319
4320               /* We're done with the internal relocs, free them.  */
4321               if (elf_section_data (section)->relocs == NULL)
4322                 free (internal_relocs);
4323             }
4324         }
4325
4326       if (!stub_changed)
4327         break;
4328
4329       _bfd_aarch64_resize_stubs (htab);
4330
4331       /* Ask the linker to do its stuff.  */
4332       (*htab->layout_sections_again) ();
4333       stub_changed = FALSE;
4334     }
4335
4336   return TRUE;
4337
4338 error_ret_free_local:
4339   return FALSE;
4340 }
4341
4342 /* Build all the stubs associated with the current output file.  The
4343    stubs are kept in a hash table attached to the main linker hash
4344    table.  We also set up the .plt entries for statically linked PIC
4345    functions here.  This function is called via aarch64_elf_finish in the
4346    linker.  */
4347
4348 bfd_boolean
4349 elfNN_aarch64_build_stubs (struct bfd_link_info *info)
4350 {
4351   asection *stub_sec;
4352   struct bfd_hash_table *table;
4353   struct elf_aarch64_link_hash_table *htab;
4354
4355   htab = elf_aarch64_hash_table (info);
4356
4357   for (stub_sec = htab->stub_bfd->sections;
4358        stub_sec != NULL; stub_sec = stub_sec->next)
4359     {
4360       bfd_size_type size;
4361
4362       /* Ignore non-stub sections.  */
4363       if (!strstr (stub_sec->name, STUB_SUFFIX))
4364         continue;
4365
4366       /* Allocate memory to hold the linker stubs.  */
4367       size = stub_sec->size;
4368       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
4369       if (stub_sec->contents == NULL && size != 0)
4370         return FALSE;
4371       stub_sec->size = 0;
4372
4373       /* Add a branch around the stub section, and a nop, to keep it 8 byte
4374          aligned, as long branch stubs contain a 64-bit address.  */
4375       bfd_putl32 (0x14000000 | (size >> 2), stub_sec->contents);
4376       bfd_putl32 (INSN_NOP, stub_sec->contents + 4);
4377       stub_sec->size += 8;
4378     }
4379
4380   /* Build the stubs as directed by the stub hash table.  */
4381   table = &htab->stub_hash_table;
4382   bfd_hash_traverse (table, aarch64_build_one_stub, info);
4383
4384   return TRUE;
4385 }
4386
4387
4388 /* Add an entry to the code/data map for section SEC.  */
4389
4390 static void
4391 elfNN_aarch64_section_map_add (asection *sec, char type, bfd_vma vma)
4392 {
4393   struct _aarch64_elf_section_data *sec_data =
4394     elf_aarch64_section_data (sec);
4395   unsigned int newidx;
4396
4397   if (sec_data->map == NULL)
4398     {
4399       sec_data->map = bfd_malloc (sizeof (elf_aarch64_section_map));
4400       sec_data->mapcount = 0;
4401       sec_data->mapsize = 1;
4402     }
4403
4404   newidx = sec_data->mapcount++;
4405
4406   if (sec_data->mapcount > sec_data->mapsize)
4407     {
4408       sec_data->mapsize *= 2;
4409       sec_data->map = bfd_realloc_or_free
4410         (sec_data->map, sec_data->mapsize * sizeof (elf_aarch64_section_map));
4411     }
4412
4413   if (sec_data->map)
4414     {
4415       sec_data->map[newidx].vma = vma;
4416       sec_data->map[newidx].type = type;
4417     }
4418 }
4419
4420
4421 /* Initialise maps of insn/data for input BFDs.  */
4422 void
4423 bfd_elfNN_aarch64_init_maps (bfd *abfd)
4424 {
4425   Elf_Internal_Sym *isymbuf;
4426   Elf_Internal_Shdr *hdr;
4427   unsigned int i, localsyms;
4428
4429   /* Make sure that we are dealing with an AArch64 elf binary.  */
4430   if (!is_aarch64_elf (abfd))
4431     return;
4432
4433   if ((abfd->flags & DYNAMIC) != 0)
4434    return;
4435
4436   hdr = &elf_symtab_hdr (abfd);
4437   localsyms = hdr->sh_info;
4438
4439   /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
4440      should contain the number of local symbols, which should come before any
4441      global symbols.  Mapping symbols are always local.  */
4442   isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL, NULL);
4443
4444   /* No internal symbols read?  Skip this BFD.  */
4445   if (isymbuf == NULL)
4446     return;
4447
4448   for (i = 0; i < localsyms; i++)
4449     {
4450       Elf_Internal_Sym *isym = &isymbuf[i];
4451       asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4452       const char *name;
4453
4454       if (sec != NULL && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
4455         {
4456           name = bfd_elf_string_from_elf_section (abfd,
4457                                                   hdr->sh_link,
4458                                                   isym->st_name);
4459
4460           if (bfd_is_aarch64_special_symbol_name
4461               (name, BFD_AARCH64_SPECIAL_SYM_TYPE_MAP))
4462             elfNN_aarch64_section_map_add (sec, name[1], isym->st_value);
4463         }
4464     }
4465 }
4466
4467 /* Set option values needed during linking.  */
4468 void
4469 bfd_elfNN_aarch64_set_options (struct bfd *output_bfd,
4470                                struct bfd_link_info *link_info,
4471                                int no_enum_warn,
4472                                int no_wchar_warn, int pic_veneer,
4473                                int fix_erratum_835769,
4474                                int fix_erratum_843419,
4475                                int no_apply_dynamic_relocs)
4476 {
4477   struct elf_aarch64_link_hash_table *globals;
4478
4479   globals = elf_aarch64_hash_table (link_info);
4480   globals->pic_veneer = pic_veneer;
4481   globals->fix_erratum_835769 = fix_erratum_835769;
4482   globals->fix_erratum_843419 = fix_erratum_843419;
4483   globals->fix_erratum_843419_adr = TRUE;
4484   globals->no_apply_dynamic_relocs = no_apply_dynamic_relocs;
4485
4486   BFD_ASSERT (is_aarch64_elf (output_bfd));
4487   elf_aarch64_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
4488   elf_aarch64_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
4489 }
4490
4491 static bfd_vma
4492 aarch64_calculate_got_entry_vma (struct elf_link_hash_entry *h,
4493                                  struct elf_aarch64_link_hash_table
4494                                  *globals, struct bfd_link_info *info,
4495                                  bfd_vma value, bfd *output_bfd,
4496                                  bfd_boolean *unresolved_reloc_p)
4497 {
4498   bfd_vma off = (bfd_vma) - 1;
4499   asection *basegot = globals->root.sgot;
4500   bfd_boolean dyn = globals->root.dynamic_sections_created;
4501
4502   if (h != NULL)
4503     {
4504       BFD_ASSERT (basegot != NULL);
4505       off = h->got.offset;
4506       BFD_ASSERT (off != (bfd_vma) - 1);
4507       if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
4508           || (bfd_link_pic (info)
4509               && SYMBOL_REFERENCES_LOCAL (info, h))
4510           || (ELF_ST_VISIBILITY (h->other)
4511               && h->root.type == bfd_link_hash_undefweak))
4512         {
4513           /* This is actually a static link, or it is a -Bsymbolic link
4514              and the symbol is defined locally.  We must initialize this
4515              entry in the global offset table.  Since the offset must
4516              always be a multiple of 8 (4 in the case of ILP32), we use
4517              the least significant bit to record whether we have
4518              initialized it already.
4519              When doing a dynamic link, we create a .rel(a).got relocation
4520              entry to initialize the value.  This is done in the
4521              finish_dynamic_symbol routine.  */
4522           if ((off & 1) != 0)
4523             off &= ~1;
4524           else
4525             {
4526               bfd_put_NN (output_bfd, value, basegot->contents + off);
4527               h->got.offset |= 1;
4528             }
4529         }
4530       else
4531         *unresolved_reloc_p = FALSE;
4532
4533       off = off + basegot->output_section->vma + basegot->output_offset;
4534     }
4535
4536   return off;
4537 }
4538
4539 /* Change R_TYPE to a more efficient access model where possible,
4540    return the new reloc type.  */
4541
4542 static bfd_reloc_code_real_type
4543 aarch64_tls_transition_without_check (bfd_reloc_code_real_type r_type,
4544                                       struct elf_link_hash_entry *h)
4545 {
4546   bfd_boolean is_local = h == NULL;
4547
4548   switch (r_type)
4549     {
4550     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
4551     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
4552       return (is_local
4553               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1
4554               : BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21);
4555
4556     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
4557       return (is_local
4558               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
4559               : r_type);
4560
4561     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
4562       return (is_local
4563               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1
4564               : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19);
4565
4566     case BFD_RELOC_AARCH64_TLSDESC_LDR:
4567       return (is_local
4568               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
4569               : BFD_RELOC_AARCH64_NONE);
4570
4571     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
4572       return (is_local
4573               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC
4574               : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC);
4575
4576     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
4577       return (is_local
4578               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2
4579               : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1);
4580
4581     case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
4582     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
4583       return (is_local
4584               ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
4585               : BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC);
4586
4587     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
4588       return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1 : r_type;
4589
4590     case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
4591       return is_local ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC : r_type;
4592
4593     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
4594       return r_type;
4595
4596     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
4597       return (is_local
4598               ? BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12
4599               : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19);
4600
4601     case BFD_RELOC_AARCH64_TLSDESC_ADD:
4602     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
4603     case BFD_RELOC_AARCH64_TLSDESC_CALL:
4604       /* Instructions with these relocations will become NOPs.  */
4605       return BFD_RELOC_AARCH64_NONE;
4606
4607     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
4608     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
4609     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4610       return is_local ? BFD_RELOC_AARCH64_NONE : r_type;
4611
4612 #if ARCH_SIZE == 64
4613     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
4614       return is_local
4615         ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC
4616         : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC;
4617
4618     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
4619       return is_local
4620         ? BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2
4621         : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1;
4622 #endif
4623
4624     default:
4625       break;
4626     }
4627
4628   return r_type;
4629 }
4630
4631 static unsigned int
4632 aarch64_reloc_got_type (bfd_reloc_code_real_type r_type)
4633 {
4634   switch (r_type)
4635     {
4636     case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
4637     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
4638     case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
4639     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
4640     case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
4641     case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
4642     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
4643     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
4644     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
4645       return GOT_NORMAL;
4646
4647     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
4648     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
4649     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
4650     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
4651     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
4652     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
4653     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
4654     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4655       return GOT_TLS_GD;
4656
4657     case BFD_RELOC_AARCH64_TLSDESC_ADD:
4658     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
4659     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
4660     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
4661     case BFD_RELOC_AARCH64_TLSDESC_CALL:
4662     case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
4663     case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
4664     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
4665     case BFD_RELOC_AARCH64_TLSDESC_LDR:
4666     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
4667     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
4668       return GOT_TLSDESC_GD;
4669
4670     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
4671     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
4672     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
4673     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
4674     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
4675     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
4676       return GOT_TLS_IE;
4677
4678     default:
4679       break;
4680     }
4681   return GOT_UNKNOWN;
4682 }
4683
4684 static bfd_boolean
4685 aarch64_can_relax_tls (bfd *input_bfd,
4686                        struct bfd_link_info *info,
4687                        bfd_reloc_code_real_type r_type,
4688                        struct elf_link_hash_entry *h,
4689                        unsigned long r_symndx)
4690 {
4691   unsigned int symbol_got_type;
4692   unsigned int reloc_got_type;
4693
4694   if (! IS_AARCH64_TLS_RELAX_RELOC (r_type))
4695     return FALSE;
4696
4697   symbol_got_type = elfNN_aarch64_symbol_got_type (h, input_bfd, r_symndx);
4698   reloc_got_type = aarch64_reloc_got_type (r_type);
4699
4700   if (symbol_got_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (reloc_got_type))
4701     return TRUE;
4702
4703   if (!bfd_link_executable (info))
4704     return FALSE;
4705
4706   if  (h && h->root.type == bfd_link_hash_undefweak)
4707     return FALSE;
4708
4709   return TRUE;
4710 }
4711
4712 /* Given the relocation code R_TYPE, return the relaxed bfd reloc
4713    enumerator.  */
4714
4715 static bfd_reloc_code_real_type
4716 aarch64_tls_transition (bfd *input_bfd,
4717                         struct bfd_link_info *info,
4718                         unsigned int r_type,
4719                         struct elf_link_hash_entry *h,
4720                         unsigned long r_symndx)
4721 {
4722   bfd_reloc_code_real_type bfd_r_type
4723     = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
4724
4725   if (! aarch64_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx))
4726     return bfd_r_type;
4727
4728   return aarch64_tls_transition_without_check (bfd_r_type, h);
4729 }
4730
4731 /* Return the base VMA address which should be subtracted from real addresses
4732    when resolving R_AARCH64_TLS_DTPREL relocation.  */
4733
4734 static bfd_vma
4735 dtpoff_base (struct bfd_link_info *info)
4736 {
4737   /* If tls_sec is NULL, we should have signalled an error already.  */
4738   BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4739   return elf_hash_table (info)->tls_sec->vma;
4740 }
4741
4742 /* Return the base VMA address which should be subtracted from real addresses
4743    when resolving R_AARCH64_TLS_GOTTPREL64 relocations.  */
4744
4745 static bfd_vma
4746 tpoff_base (struct bfd_link_info *info)
4747 {
4748   struct elf_link_hash_table *htab = elf_hash_table (info);
4749
4750   /* If tls_sec is NULL, we should have signalled an error already.  */
4751   BFD_ASSERT (htab->tls_sec != NULL);
4752
4753   bfd_vma base = align_power ((bfd_vma) TCB_SIZE,
4754                               htab->tls_sec->alignment_power);
4755   return htab->tls_sec->vma - base;
4756 }
4757
4758 static bfd_vma *
4759 symbol_got_offset_ref (bfd *input_bfd, struct elf_link_hash_entry *h,
4760                        unsigned long r_symndx)
4761 {
4762   /* Calculate the address of the GOT entry for symbol
4763      referred to in h.  */
4764   if (h != NULL)
4765     return &h->got.offset;
4766   else
4767     {
4768       /* local symbol */
4769       struct elf_aarch64_local_symbol *l;
4770
4771       l = elf_aarch64_locals (input_bfd);
4772       return &l[r_symndx].got_offset;
4773     }
4774 }
4775
4776 static void
4777 symbol_got_offset_mark (bfd *input_bfd, struct elf_link_hash_entry *h,
4778                         unsigned long r_symndx)
4779 {
4780   bfd_vma *p;
4781   p = symbol_got_offset_ref (input_bfd, h, r_symndx);
4782   *p |= 1;
4783 }
4784
4785 static int
4786 symbol_got_offset_mark_p (bfd *input_bfd, struct elf_link_hash_entry *h,
4787                           unsigned long r_symndx)
4788 {
4789   bfd_vma value;
4790   value = * symbol_got_offset_ref (input_bfd, h, r_symndx);
4791   return value & 1;
4792 }
4793
4794 static bfd_vma
4795 symbol_got_offset (bfd *input_bfd, struct elf_link_hash_entry *h,
4796                    unsigned long r_symndx)
4797 {
4798   bfd_vma value;
4799   value = * symbol_got_offset_ref (input_bfd, h, r_symndx);
4800   value &= ~1;
4801   return value;
4802 }
4803
4804 static bfd_vma *
4805 symbol_tlsdesc_got_offset_ref (bfd *input_bfd, struct elf_link_hash_entry *h,
4806                                unsigned long r_symndx)
4807 {
4808   /* Calculate the address of the GOT entry for symbol
4809      referred to in h.  */
4810   if (h != NULL)
4811     {
4812       struct elf_aarch64_link_hash_entry *eh;
4813       eh = (struct elf_aarch64_link_hash_entry *) h;
4814       return &eh->tlsdesc_got_jump_table_offset;
4815     }
4816   else
4817     {
4818       /* local symbol */
4819       struct elf_aarch64_local_symbol *l;
4820
4821       l = elf_aarch64_locals (input_bfd);
4822       return &l[r_symndx].tlsdesc_got_jump_table_offset;
4823     }
4824 }
4825
4826 static void
4827 symbol_tlsdesc_got_offset_mark (bfd *input_bfd, struct elf_link_hash_entry *h,
4828                                 unsigned long r_symndx)
4829 {
4830   bfd_vma *p;
4831   p = symbol_tlsdesc_got_offset_ref (input_bfd, h, r_symndx);
4832   *p |= 1;
4833 }
4834
4835 static int
4836 symbol_tlsdesc_got_offset_mark_p (bfd *input_bfd,
4837                                   struct elf_link_hash_entry *h,
4838                                   unsigned long r_symndx)
4839 {
4840   bfd_vma value;
4841   value = * symbol_tlsdesc_got_offset_ref (input_bfd, h, r_symndx);
4842   return value & 1;
4843 }
4844
4845 static bfd_vma
4846 symbol_tlsdesc_got_offset (bfd *input_bfd, struct elf_link_hash_entry *h,
4847                           unsigned long r_symndx)
4848 {
4849   bfd_vma value;
4850   value = * symbol_tlsdesc_got_offset_ref (input_bfd, h, r_symndx);
4851   value &= ~1;
4852   return value;
4853 }
4854
4855 /* Data for make_branch_to_erratum_835769_stub().  */
4856
4857 struct erratum_835769_branch_to_stub_data
4858 {
4859   struct bfd_link_info *info;
4860   asection *output_section;
4861   bfd_byte *contents;
4862 };
4863
4864 /* Helper to insert branches to erratum 835769 stubs in the right
4865    places for a particular section.  */
4866
4867 static bfd_boolean
4868 make_branch_to_erratum_835769_stub (struct bfd_hash_entry *gen_entry,
4869                                     void *in_arg)
4870 {
4871   struct elf_aarch64_stub_hash_entry *stub_entry;
4872   struct erratum_835769_branch_to_stub_data *data;
4873   bfd_byte *contents;
4874   unsigned long branch_insn = 0;
4875   bfd_vma veneered_insn_loc, veneer_entry_loc;
4876   bfd_signed_vma branch_offset;
4877   unsigned int target;
4878   bfd *abfd;
4879
4880   stub_entry = (struct elf_aarch64_stub_hash_entry *) gen_entry;
4881   data = (struct erratum_835769_branch_to_stub_data *) in_arg;
4882
4883   if (stub_entry->target_section != data->output_section
4884       || stub_entry->stub_type != aarch64_stub_erratum_835769_veneer)
4885     return TRUE;
4886
4887   contents = data->contents;
4888   veneered_insn_loc = stub_entry->target_section->output_section->vma
4889                       + stub_entry->target_section->output_offset
4890                       + stub_entry->target_value;
4891   veneer_entry_loc = stub_entry->stub_sec->output_section->vma
4892                      + stub_entry->stub_sec->output_offset
4893                      + stub_entry->stub_offset;
4894   branch_offset = veneer_entry_loc - veneered_insn_loc;
4895
4896   abfd = stub_entry->target_section->owner;
4897   if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc))
4898     _bfd_error_handler
4899       (_("%pB: error: erratum 835769 stub out "
4900          "of range (input file too large)"), abfd);
4901
4902   target = stub_entry->target_value;
4903   branch_insn = 0x14000000;
4904   branch_offset >>= 2;
4905   branch_offset &= 0x3ffffff;
4906   branch_insn |= branch_offset;
4907   bfd_putl32 (branch_insn, &contents[target]);
4908
4909   return TRUE;
4910 }
4911
4912
4913 static bfd_boolean
4914 _bfd_aarch64_erratum_843419_branch_to_stub (struct bfd_hash_entry *gen_entry,
4915                                             void *in_arg)
4916 {
4917   struct elf_aarch64_stub_hash_entry *stub_entry
4918     = (struct elf_aarch64_stub_hash_entry *) gen_entry;
4919   struct erratum_835769_branch_to_stub_data *data
4920     = (struct erratum_835769_branch_to_stub_data *) in_arg;
4921   struct bfd_link_info *info;
4922   struct elf_aarch64_link_hash_table *htab;
4923   bfd_byte *contents;
4924   asection *section;
4925   bfd *abfd;
4926   bfd_vma place;
4927   uint32_t insn;
4928
4929   info = data->info;
4930   contents = data->contents;
4931   section = data->output_section;
4932
4933   htab = elf_aarch64_hash_table (info);
4934
4935   if (stub_entry->target_section != section
4936       || stub_entry->stub_type != aarch64_stub_erratum_843419_veneer)
4937     return TRUE;
4938
4939   insn = bfd_getl32 (contents + stub_entry->target_value);
4940   bfd_putl32 (insn,
4941               stub_entry->stub_sec->contents + stub_entry->stub_offset);
4942
4943   place = (section->output_section->vma + section->output_offset
4944            + stub_entry->adrp_offset);
4945   insn = bfd_getl32 (contents + stub_entry->adrp_offset);
4946
4947   if ((insn & AARCH64_ADRP_OP_MASK) !=  AARCH64_ADRP_OP)
4948     abort ();
4949
4950   bfd_signed_vma imm =
4951     (_bfd_aarch64_sign_extend
4952      ((bfd_vma) _bfd_aarch64_decode_adrp_imm (insn) << 12, 33)
4953      - (place & 0xfff));
4954
4955   if (htab->fix_erratum_843419_adr
4956       && (imm >= AARCH64_MIN_ADRP_IMM  && imm <= AARCH64_MAX_ADRP_IMM))
4957     {
4958       insn = (_bfd_aarch64_reencode_adr_imm (AARCH64_ADR_OP, imm)
4959               | AARCH64_RT (insn));
4960       bfd_putl32 (insn, contents + stub_entry->adrp_offset);
4961     }
4962   else
4963     {
4964       bfd_vma veneered_insn_loc;
4965       bfd_vma veneer_entry_loc;
4966       bfd_signed_vma branch_offset;
4967       uint32_t branch_insn;
4968
4969       veneered_insn_loc = stub_entry->target_section->output_section->vma
4970         + stub_entry->target_section->output_offset
4971         + stub_entry->target_value;
4972       veneer_entry_loc = stub_entry->stub_sec->output_section->vma
4973         + stub_entry->stub_sec->output_offset
4974         + stub_entry->stub_offset;
4975       branch_offset = veneer_entry_loc - veneered_insn_loc;
4976
4977       abfd = stub_entry->target_section->owner;
4978       if (!aarch64_valid_branch_p (veneer_entry_loc, veneered_insn_loc))
4979         _bfd_error_handler
4980           (_("%pB: error: erratum 843419 stub out "
4981              "of range (input file too large)"), abfd);
4982
4983       branch_insn = 0x14000000;
4984       branch_offset >>= 2;
4985       branch_offset &= 0x3ffffff;
4986       branch_insn |= branch_offset;
4987       bfd_putl32 (branch_insn, contents + stub_entry->target_value);
4988     }
4989   return TRUE;
4990 }
4991
4992
4993 static bfd_boolean
4994 elfNN_aarch64_write_section (bfd *output_bfd  ATTRIBUTE_UNUSED,
4995                              struct bfd_link_info *link_info,
4996                              asection *sec,
4997                              bfd_byte *contents)
4998
4999 {
5000   struct elf_aarch64_link_hash_table *globals =
5001     elf_aarch64_hash_table (link_info);
5002
5003   if (globals == NULL)
5004     return FALSE;
5005
5006   /* Fix code to point to erratum 835769 stubs.  */
5007   if (globals->fix_erratum_835769)
5008     {
5009       struct erratum_835769_branch_to_stub_data data;
5010
5011       data.info = link_info;
5012       data.output_section = sec;
5013       data.contents = contents;
5014       bfd_hash_traverse (&globals->stub_hash_table,
5015                          make_branch_to_erratum_835769_stub, &data);
5016     }
5017
5018   if (globals->fix_erratum_843419)
5019     {
5020       struct erratum_835769_branch_to_stub_data data;
5021
5022       data.info = link_info;
5023       data.output_section = sec;
5024       data.contents = contents;
5025       bfd_hash_traverse (&globals->stub_hash_table,
5026                          _bfd_aarch64_erratum_843419_branch_to_stub, &data);
5027     }
5028
5029   return FALSE;
5030 }
5031
5032 /* Return TRUE if RELOC is a relocation against the base of GOT table.  */
5033
5034 static bfd_boolean
5035 aarch64_relocation_aginst_gp_p (bfd_reloc_code_real_type reloc)
5036 {
5037   return (reloc == BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14
5038           || reloc == BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15
5039           || reloc == BFD_RELOC_AARCH64_LD64_GOTOFF_LO15
5040           || reloc == BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC
5041           || reloc == BFD_RELOC_AARCH64_MOVW_GOTOFF_G1);
5042 }
5043
5044 /* Perform a relocation as part of a final link.  The input relocation type
5045    should be TLS relaxed.  */
5046
5047 static bfd_reloc_status_type
5048 elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
5049                                    bfd *input_bfd,
5050                                    bfd *output_bfd,
5051                                    asection *input_section,
5052                                    bfd_byte *contents,
5053                                    Elf_Internal_Rela *rel,
5054                                    bfd_vma value,
5055                                    struct bfd_link_info *info,
5056                                    asection *sym_sec,
5057                                    struct elf_link_hash_entry *h,
5058                                    bfd_boolean *unresolved_reloc_p,
5059                                    bfd_boolean save_addend,
5060                                    bfd_vma *saved_addend,
5061                                    Elf_Internal_Sym *sym)
5062 {
5063   Elf_Internal_Shdr *symtab_hdr;
5064   unsigned int r_type = howto->type;
5065   bfd_reloc_code_real_type bfd_r_type
5066     = elfNN_aarch64_bfd_reloc_from_howto (howto);
5067   unsigned long r_symndx;
5068   bfd_byte *hit_data = contents + rel->r_offset;
5069   bfd_vma place, off, got_entry_addr = 0;
5070   bfd_signed_vma signed_addend;
5071   struct elf_aarch64_link_hash_table *globals;
5072   bfd_boolean weak_undef_p;
5073   bfd_boolean relative_reloc;
5074   asection *base_got;
5075   bfd_vma orig_value = value;
5076   bfd_boolean resolved_to_zero;
5077   bfd_boolean abs_symbol_p;
5078
5079   globals = elf_aarch64_hash_table (info);
5080
5081   symtab_hdr = &elf_symtab_hdr (input_bfd);
5082
5083   BFD_ASSERT (is_aarch64_elf (input_bfd));
5084
5085   r_symndx = ELFNN_R_SYM (rel->r_info);
5086
5087   place = input_section->output_section->vma
5088     + input_section->output_offset + rel->r_offset;
5089
5090   /* Get addend, accumulating the addend for consecutive relocs
5091      which refer to the same offset.  */
5092   signed_addend = saved_addend ? *saved_addend : 0;
5093   signed_addend += rel->r_addend;
5094
5095   weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
5096                   : bfd_is_und_section (sym_sec));
5097   abs_symbol_p = (h !=NULL && h->root.type == bfd_link_hash_defined
5098                   && bfd_is_abs_section (h->root.u.def.section));
5099
5100
5101   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
5102      it here if it is defined in a non-shared object.  */
5103   if (h != NULL
5104       && h->type == STT_GNU_IFUNC
5105       && h->def_regular)
5106     {
5107       asection *plt;
5108       const char *name;
5109       bfd_vma addend = 0;
5110
5111       if ((input_section->flags & SEC_ALLOC) == 0)
5112         {
5113           /* If this is a SHT_NOTE section without SHF_ALLOC, treat
5114              STT_GNU_IFUNC symbol as STT_FUNC.  */
5115           if (elf_section_type (input_section) == SHT_NOTE)
5116             goto skip_ifunc;
5117
5118           /* Dynamic relocs are not propagated for SEC_DEBUGGING
5119              sections because such sections are not SEC_ALLOC and
5120              thus ld.so will not process them.  */
5121           if ((input_section->flags & SEC_DEBUGGING) != 0)
5122             return bfd_reloc_ok;
5123
5124           if (h->root.root.string)
5125             name = h->root.root.string;
5126           else
5127             name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, NULL);
5128           _bfd_error_handler
5129             /* xgettext:c-format */
5130             (_("%pB(%pA+%#" PRIx64 "): "
5131                "unresolvable %s relocation against symbol `%s'"),
5132              input_bfd, input_section, (uint64_t) rel->r_offset,
5133              howto->name, name);
5134           bfd_set_error (bfd_error_bad_value);
5135           return bfd_reloc_notsupported;
5136         }
5137       else if (h->plt.offset == (bfd_vma) -1)
5138         goto bad_ifunc_reloc;
5139
5140       /* STT_GNU_IFUNC symbol must go through PLT.  */
5141       plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
5142       value = (plt->output_section->vma + plt->output_offset + h->plt.offset);
5143
5144       switch (bfd_r_type)
5145         {
5146         default:
5147 bad_ifunc_reloc:
5148           if (h->root.root.string)
5149             name = h->root.root.string;
5150           else
5151             name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
5152                                      NULL);
5153           _bfd_error_handler
5154             /* xgettext:c-format */
5155             (_("%pB: relocation %s against STT_GNU_IFUNC "
5156                "symbol `%s' isn't handled by %s"), input_bfd,
5157              howto->name, name, __FUNCTION__);
5158           bfd_set_error (bfd_error_bad_value);
5159           return bfd_reloc_notsupported;
5160
5161         case BFD_RELOC_AARCH64_NN:
5162           if (rel->r_addend != 0)
5163             {
5164               if (h->root.root.string)
5165                 name = h->root.root.string;
5166               else
5167                 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
5168                                          sym, NULL);
5169               _bfd_error_handler
5170                 /* xgettext:c-format */
5171                 (_("%pB: relocation %s against STT_GNU_IFUNC "
5172                    "symbol `%s' has non-zero addend: %" PRId64),
5173                  input_bfd, howto->name, name, (int64_t) rel->r_addend);
5174               bfd_set_error (bfd_error_bad_value);
5175               return bfd_reloc_notsupported;
5176             }
5177
5178           /* Generate dynamic relocation only when there is a
5179              non-GOT reference in a shared object.  */
5180           if (bfd_link_pic (info) && h->non_got_ref)
5181             {
5182               Elf_Internal_Rela outrel;
5183               asection *sreloc;
5184
5185               /* Need a dynamic relocation to get the real function
5186                  address.  */
5187               outrel.r_offset = _bfd_elf_section_offset (output_bfd,
5188                                                          info,
5189                                                          input_section,
5190                                                          rel->r_offset);
5191               if (outrel.r_offset == (bfd_vma) -1
5192                   || outrel.r_offset == (bfd_vma) -2)
5193                 abort ();
5194
5195               outrel.r_offset += (input_section->output_section->vma
5196                                   + input_section->output_offset);
5197
5198               if (h->dynindx == -1
5199                   || h->forced_local
5200                   || bfd_link_executable (info))
5201                 {
5202                   /* This symbol is resolved locally.  */
5203                   outrel.r_info = ELFNN_R_INFO (0, AARCH64_R (IRELATIVE));
5204                   outrel.r_addend = (h->root.u.def.value
5205                                      + h->root.u.def.section->output_section->vma
5206                                      + h->root.u.def.section->output_offset);
5207                 }
5208               else
5209                 {
5210                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
5211                   outrel.r_addend = 0;
5212                 }
5213
5214               sreloc = globals->root.irelifunc;
5215               elf_append_rela (output_bfd, sreloc, &outrel);
5216
5217               /* If this reloc is against an external symbol, we
5218                  do not want to fiddle with the addend.  Otherwise,
5219                  we need to include the symbol value so that it
5220                  becomes an addend for the dynamic reloc.  For an
5221                  internal symbol, we have updated addend.  */
5222               return bfd_reloc_ok;
5223             }
5224           /* FALLTHROUGH */
5225         case BFD_RELOC_AARCH64_CALL26:
5226         case BFD_RELOC_AARCH64_JUMP26:
5227           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5228                                                        signed_addend,
5229                                                        weak_undef_p);
5230           return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type,
5231                                               howto, value);
5232         case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
5233         case BFD_RELOC_AARCH64_GOT_LD_PREL19:
5234         case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
5235         case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
5236         case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
5237         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
5238         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
5239         case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
5240         case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
5241           base_got = globals->root.sgot;
5242           off = h->got.offset;
5243
5244           if (base_got == NULL)
5245             abort ();
5246
5247           if (off == (bfd_vma) -1)
5248             {
5249               bfd_vma plt_index;
5250
5251               /* We can't use h->got.offset here to save state, or
5252                  even just remember the offset, as finish_dynamic_symbol
5253                  would use that as offset into .got.  */
5254
5255               if (globals->root.splt != NULL)
5256                 {
5257                   plt_index = ((h->plt.offset - globals->plt_header_size) /
5258                                globals->plt_entry_size);
5259                   off = (plt_index + 3) * GOT_ENTRY_SIZE;
5260                   base_got = globals->root.sgotplt;
5261                 }
5262               else
5263                 {
5264                   plt_index = h->plt.offset / globals->plt_entry_size;
5265                   off = plt_index * GOT_ENTRY_SIZE;
5266                   base_got = globals->root.igotplt;
5267                 }
5268
5269               if (h->dynindx == -1
5270                   || h->forced_local
5271                   || info->symbolic)
5272                 {
5273                   /* This references the local definition.  We must
5274                      initialize this entry in the global offset table.
5275                      Since the offset must always be a multiple of 8,
5276                      we use the least significant bit to record
5277                      whether we have initialized it already.
5278
5279                      When doing a dynamic link, we create a .rela.got
5280                      relocation entry to initialize the value.  This
5281                      is done in the finish_dynamic_symbol routine.       */
5282                   if ((off & 1) != 0)
5283                     off &= ~1;
5284                   else
5285                     {
5286                       bfd_put_NN (output_bfd, value,
5287                                   base_got->contents + off);
5288                       /* Note that this is harmless as -1 | 1 still is -1.  */
5289                       h->got.offset |= 1;
5290                     }
5291                 }
5292               value = (base_got->output_section->vma
5293                        + base_got->output_offset + off);
5294             }
5295           else
5296             value = aarch64_calculate_got_entry_vma (h, globals, info,
5297                                                      value, output_bfd,
5298                                                      unresolved_reloc_p);
5299
5300           if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5301             addend = (globals->root.sgot->output_section->vma
5302                       + globals->root.sgot->output_offset);
5303
5304           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5305                                                        addend, weak_undef_p);
5306           return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type, howto, value);
5307         case BFD_RELOC_AARCH64_ADD_LO12:
5308         case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
5309           break;
5310         }
5311     }
5312
5313  skip_ifunc:
5314   resolved_to_zero = (h != NULL
5315                       && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
5316
5317   switch (bfd_r_type)
5318     {
5319     case BFD_RELOC_AARCH64_NONE:
5320     case BFD_RELOC_AARCH64_TLSDESC_ADD:
5321     case BFD_RELOC_AARCH64_TLSDESC_CALL:
5322     case BFD_RELOC_AARCH64_TLSDESC_LDR:
5323       *unresolved_reloc_p = FALSE;
5324       return bfd_reloc_ok;
5325
5326     case BFD_RELOC_AARCH64_NN:
5327
5328       /* When generating a shared object or relocatable executable, these
5329          relocations are copied into the output file to be resolved at
5330          run time.  */
5331       if (((bfd_link_pic (info)
5332             || globals->root.is_relocatable_executable)
5333            && (input_section->flags & SEC_ALLOC)
5334            && (h == NULL
5335                || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5336                    && !resolved_to_zero)
5337                || h->root.type != bfd_link_hash_undefweak))
5338           /* Or we are creating an executable, we may need to keep relocations
5339              for symbols satisfied by a dynamic library if we manage to avoid
5340              copy relocs for the symbol.  */
5341           || (ELIMINATE_COPY_RELOCS
5342               && !bfd_link_pic (info)
5343               && h != NULL
5344               && (input_section->flags & SEC_ALLOC)
5345               && h->dynindx != -1
5346               && !h->non_got_ref
5347               && ((h->def_dynamic
5348                    && !h->def_regular)
5349                   || h->root.type == bfd_link_hash_undefweak
5350                   || h->root.type == bfd_link_hash_undefined)))
5351         {
5352           Elf_Internal_Rela outrel;
5353           bfd_byte *loc;
5354           bfd_boolean skip, relocate;
5355           asection *sreloc;
5356
5357           *unresolved_reloc_p = FALSE;
5358
5359           skip = FALSE;
5360           relocate = FALSE;
5361
5362           outrel.r_addend = signed_addend;
5363           outrel.r_offset =
5364             _bfd_elf_section_offset (output_bfd, info, input_section,
5365                                      rel->r_offset);
5366           if (outrel.r_offset == (bfd_vma) - 1)
5367             skip = TRUE;
5368           else if (outrel.r_offset == (bfd_vma) - 2)
5369             {
5370               skip = TRUE;
5371               relocate = TRUE;
5372             }
5373           else if (abs_symbol_p)
5374             {
5375               /* Local absolute symbol.  */
5376               skip = (h->forced_local || (h->dynindx == -1));
5377               relocate = skip;
5378             }
5379
5380           outrel.r_offset += (input_section->output_section->vma
5381                               + input_section->output_offset);
5382
5383           if (skip)
5384             memset (&outrel, 0, sizeof outrel);
5385           else if (h != NULL
5386                    && h->dynindx != -1
5387                    && (!bfd_link_pic (info)
5388                        || !(bfd_link_pie (info) || SYMBOLIC_BIND (info, h))
5389                        || !h->def_regular))
5390             outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
5391           else
5392             {
5393               int symbol;
5394
5395               /* On SVR4-ish systems, the dynamic loader cannot
5396                  relocate the text and data segments independently,
5397                  so the symbol does not matter.  */
5398               symbol = 0;
5399               relocate = globals->no_apply_dynamic_relocs ? FALSE : TRUE;
5400               outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE));
5401               outrel.r_addend += value;
5402             }
5403
5404           sreloc = elf_section_data (input_section)->sreloc;
5405           if (sreloc == NULL || sreloc->contents == NULL)
5406             return bfd_reloc_notsupported;
5407
5408           loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (globals);
5409           bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
5410
5411           if (sreloc->reloc_count * RELOC_SIZE (globals) > sreloc->size)
5412             {
5413               /* Sanity to check that we have previously allocated
5414                  sufficient space in the relocation section for the
5415                  number of relocations we actually want to emit.  */
5416               abort ();
5417             }
5418
5419           /* If this reloc is against an external symbol, we do not want to
5420              fiddle with the addend.  Otherwise, we need to include the symbol
5421              value so that it becomes an addend for the dynamic reloc.  */
5422           if (!relocate)
5423             return bfd_reloc_ok;
5424
5425           return _bfd_final_link_relocate (howto, input_bfd, input_section,
5426                                            contents, rel->r_offset, value,
5427                                            signed_addend);
5428         }
5429       else
5430         value += signed_addend;
5431       break;
5432
5433     case BFD_RELOC_AARCH64_CALL26:
5434     case BFD_RELOC_AARCH64_JUMP26:
5435       {
5436         asection *splt = globals->root.splt;
5437         bfd_boolean via_plt_p =
5438           splt != NULL && h != NULL && h->plt.offset != (bfd_vma) - 1;
5439
5440         /* A call to an undefined weak symbol is converted to a jump to
5441            the next instruction unless a PLT entry will be created.
5442            The jump to the next instruction is optimized as a NOP.
5443            Do the same for local undefined symbols.  */
5444         if (weak_undef_p && ! via_plt_p)
5445           {
5446             bfd_putl32 (INSN_NOP, hit_data);
5447             return bfd_reloc_ok;
5448           }
5449
5450         /* If the call goes through a PLT entry, make sure to
5451            check distance to the right destination address.  */
5452         if (via_plt_p)
5453           value = (splt->output_section->vma
5454                    + splt->output_offset + h->plt.offset);
5455
5456         /* Check if a stub has to be inserted because the destination
5457            is too far away.  */
5458         struct elf_aarch64_stub_hash_entry *stub_entry = NULL;
5459
5460         /* If the branch destination is directed to plt stub, "value" will be
5461            the final destination, otherwise we should plus signed_addend, it may
5462            contain non-zero value, for example call to local function symbol
5463            which are turned into "sec_sym + sec_off", and sec_off is kept in
5464            signed_addend.  */
5465         if (! aarch64_valid_branch_p (via_plt_p ? value : value + signed_addend,
5466                                       place))
5467           /* The target is out of reach, so redirect the branch to
5468              the local stub for this function.  */
5469         stub_entry = elfNN_aarch64_get_stub_entry (input_section, sym_sec, h,
5470                                                    rel, globals);
5471         if (stub_entry != NULL)
5472           {
5473             value = (stub_entry->stub_offset
5474                      + stub_entry->stub_sec->output_offset
5475                      + stub_entry->stub_sec->output_section->vma);
5476
5477             /* We have redirected the destination to stub entry address,
5478                so ignore any addend record in the original rela entry.  */
5479             signed_addend = 0;
5480           }
5481       }
5482       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5483                                                    signed_addend, weak_undef_p);
5484       *unresolved_reloc_p = FALSE;
5485       break;
5486
5487     case BFD_RELOC_AARCH64_16_PCREL:
5488     case BFD_RELOC_AARCH64_32_PCREL:
5489     case BFD_RELOC_AARCH64_64_PCREL:
5490     case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
5491     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
5492     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
5493     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
5494     case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5495     case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
5496     case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5497     case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
5498     case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5499     case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
5500     case BFD_RELOC_AARCH64_MOVW_PREL_G3:
5501       if (bfd_link_pic (info)
5502           && (input_section->flags & SEC_ALLOC) != 0
5503           && (input_section->flags & SEC_READONLY) != 0
5504           && !SYMBOL_REFERENCES_LOCAL (info, h))
5505         {
5506           int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
5507
5508           _bfd_error_handler
5509             /* xgettext:c-format */
5510             (_("%pB: relocation %s against symbol `%s' which may bind "
5511                "externally can not be used when making a shared object; "
5512                "recompile with -fPIC"),
5513              input_bfd, elfNN_aarch64_howto_table[howto_index].name,
5514              h->root.root.string);
5515           bfd_set_error (bfd_error_bad_value);
5516           return bfd_reloc_notsupported;
5517         }
5518       /* Fall through.  */
5519
5520     case BFD_RELOC_AARCH64_16:
5521 #if ARCH_SIZE == 64
5522     case BFD_RELOC_AARCH64_32:
5523 #endif
5524     case BFD_RELOC_AARCH64_ADD_LO12:
5525     case BFD_RELOC_AARCH64_BRANCH19:
5526     case BFD_RELOC_AARCH64_LDST128_LO12:
5527     case BFD_RELOC_AARCH64_LDST16_LO12:
5528     case BFD_RELOC_AARCH64_LDST32_LO12:
5529     case BFD_RELOC_AARCH64_LDST64_LO12:
5530     case BFD_RELOC_AARCH64_LDST8_LO12:
5531     case BFD_RELOC_AARCH64_MOVW_G0:
5532     case BFD_RELOC_AARCH64_MOVW_G0_NC:
5533     case BFD_RELOC_AARCH64_MOVW_G0_S:
5534     case BFD_RELOC_AARCH64_MOVW_G1:
5535     case BFD_RELOC_AARCH64_MOVW_G1_NC:
5536     case BFD_RELOC_AARCH64_MOVW_G1_S:
5537     case BFD_RELOC_AARCH64_MOVW_G2:
5538     case BFD_RELOC_AARCH64_MOVW_G2_NC:
5539     case BFD_RELOC_AARCH64_MOVW_G2_S:
5540     case BFD_RELOC_AARCH64_MOVW_G3:
5541     case BFD_RELOC_AARCH64_TSTBR14:
5542       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5543                                                    signed_addend, weak_undef_p);
5544       break;
5545
5546     case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
5547     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
5548     case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
5549     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
5550     case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
5551     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
5552     case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
5553     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
5554     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
5555       if (globals->root.sgot == NULL)
5556         BFD_ASSERT (h != NULL);
5557
5558       relative_reloc = FALSE;
5559       if (h != NULL)
5560         {
5561           bfd_vma addend = 0;
5562
5563           /* If a symbol is not dynamic and is not undefined weak, bind it
5564              locally and generate a RELATIVE relocation under PIC mode.
5565
5566              NOTE: one symbol may be referenced by several relocations, we
5567              should only generate one RELATIVE relocation for that symbol.
5568              Therefore, check GOT offset mark first.  */
5569           if (h->dynindx == -1
5570               && !h->forced_local
5571               && h->root.type != bfd_link_hash_undefweak
5572               && bfd_link_pic (info)
5573               && !symbol_got_offset_mark_p (input_bfd, h, r_symndx))
5574             relative_reloc = TRUE;
5575
5576           value = aarch64_calculate_got_entry_vma (h, globals, info, value,
5577                                                    output_bfd,
5578                                                    unresolved_reloc_p);
5579           /* Record the GOT entry address which will be used when generating
5580              RELATIVE relocation.  */
5581           if (relative_reloc)
5582             got_entry_addr = value;
5583
5584           if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5585             addend = (globals->root.sgot->output_section->vma
5586                       + globals->root.sgot->output_offset);
5587           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5588                                                        addend, weak_undef_p);
5589         }
5590       else
5591       {
5592         bfd_vma addend = 0;
5593         struct elf_aarch64_local_symbol *locals
5594           = elf_aarch64_locals (input_bfd);
5595
5596         if (locals == NULL)
5597           {
5598             int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
5599             _bfd_error_handler
5600               /* xgettext:c-format */
5601               (_("%pB: local symbol descriptor table be NULL when applying "
5602                  "relocation %s against local symbol"),
5603                input_bfd, elfNN_aarch64_howto_table[howto_index].name);
5604             abort ();
5605           }
5606
5607         off = symbol_got_offset (input_bfd, h, r_symndx);
5608         base_got = globals->root.sgot;
5609         got_entry_addr = (base_got->output_section->vma
5610                           + base_got->output_offset + off);
5611
5612         if (!symbol_got_offset_mark_p (input_bfd, h, r_symndx))
5613           {
5614             bfd_put_64 (output_bfd, value, base_got->contents + off);
5615
5616             /* For local symbol, we have done absolute relocation in static
5617                linking stage.  While for shared library, we need to update the
5618                content of GOT entry according to the shared object's runtime
5619                base address.  So, we need to generate a R_AARCH64_RELATIVE reloc
5620                for dynamic linker.  */
5621             if (bfd_link_pic (info))
5622               relative_reloc = TRUE;
5623
5624             symbol_got_offset_mark (input_bfd, h, r_symndx);
5625           }
5626
5627         /* Update the relocation value to GOT entry addr as we have transformed
5628            the direct data access into indirect data access through GOT.  */
5629         value = got_entry_addr;
5630
5631         if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5632           addend = base_got->output_section->vma + base_got->output_offset;
5633
5634         value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5635                                                      addend, weak_undef_p);
5636       }
5637
5638       if (relative_reloc)
5639         {
5640           asection *s;
5641           Elf_Internal_Rela outrel;
5642
5643           s = globals->root.srelgot;
5644           if (s == NULL)
5645             abort ();
5646
5647           outrel.r_offset = got_entry_addr;
5648           outrel.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE));
5649           outrel.r_addend = orig_value;
5650           elf_append_rela (output_bfd, s, &outrel);
5651         }
5652       break;
5653
5654     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
5655     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
5656     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
5657     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
5658     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
5659     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
5660     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
5661     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
5662     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
5663     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
5664       if (globals->root.sgot == NULL)
5665         return bfd_reloc_notsupported;
5666
5667       value = (symbol_got_offset (input_bfd, h, r_symndx)
5668                + globals->root.sgot->output_section->vma
5669                + globals->root.sgot->output_offset);
5670
5671       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5672                                                    0, weak_undef_p);
5673       *unresolved_reloc_p = FALSE;
5674       break;
5675
5676     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
5677     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
5678     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
5679     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
5680       if (globals->root.sgot == NULL)
5681         return bfd_reloc_notsupported;
5682
5683       value = symbol_got_offset (input_bfd, h, r_symndx);
5684       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5685                                                    0, weak_undef_p);
5686       *unresolved_reloc_p = FALSE;
5687       break;
5688
5689     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
5690     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
5691     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
5692     case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
5693     case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
5694     case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
5695     case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
5696     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
5697     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
5698     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
5699     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
5700     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
5701     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
5702     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
5703     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
5704     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
5705       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5706                                                    signed_addend - dtpoff_base (info),
5707                                                    weak_undef_p);
5708       break;
5709
5710     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
5711     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
5712     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
5713     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
5714     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
5715     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
5716     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
5717     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5718       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5719                                                    signed_addend - tpoff_base (info),
5720                                                    weak_undef_p);
5721       *unresolved_reloc_p = FALSE;
5722       break;
5723
5724     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
5725     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
5726     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
5727     case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
5728     case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
5729     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
5730       if (globals->root.sgot == NULL)
5731         return bfd_reloc_notsupported;
5732       value = (symbol_tlsdesc_got_offset (input_bfd, h, r_symndx)
5733                + globals->root.sgotplt->output_section->vma
5734                + globals->root.sgotplt->output_offset
5735                + globals->sgotplt_jump_table_size);
5736
5737       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5738                                                    0, weak_undef_p);
5739       *unresolved_reloc_p = FALSE;
5740       break;
5741
5742     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
5743     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
5744       if (globals->root.sgot == NULL)
5745         return bfd_reloc_notsupported;
5746
5747       value = (symbol_tlsdesc_got_offset (input_bfd, h, r_symndx)
5748                + globals->root.sgotplt->output_section->vma
5749                + globals->root.sgotplt->output_offset
5750                + globals->sgotplt_jump_table_size);
5751
5752       value -= (globals->root.sgot->output_section->vma
5753                 + globals->root.sgot->output_offset);
5754
5755       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5756                                                    0, weak_undef_p);
5757       *unresolved_reloc_p = FALSE;
5758       break;
5759
5760     default:
5761       return bfd_reloc_notsupported;
5762     }
5763
5764   if (saved_addend)
5765     *saved_addend = value;
5766
5767   /* Only apply the final relocation in a sequence.  */
5768   if (save_addend)
5769     return bfd_reloc_continue;
5770
5771   return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type,
5772                                       howto, value);
5773 }
5774
5775 /* LP64 and ILP32 operates on x- and w-registers respectively.
5776    Next definitions take into account the difference between
5777    corresponding machine codes. R means x-register if the target
5778    arch is LP64, and w-register if the target is ILP32.  */
5779
5780 #if ARCH_SIZE == 64
5781 # define add_R0_R0      (0x91000000)
5782 # define add_R0_R0_R1   (0x8b000020)
5783 # define add_R0_R1      (0x91400020)
5784 # define ldr_R0         (0x58000000)
5785 # define ldr_R0_mask(i) (i & 0xffffffe0)
5786 # define ldr_R0_x0      (0xf9400000)
5787 # define ldr_hw_R0      (0xf2a00000)
5788 # define movk_R0        (0xf2800000)
5789 # define movz_R0        (0xd2a00000)
5790 # define movz_hw_R0     (0xd2c00000)
5791 #else /*ARCH_SIZE == 32 */
5792 # define add_R0_R0      (0x11000000)
5793 # define add_R0_R0_R1   (0x0b000020)
5794 # define add_R0_R1      (0x11400020)
5795 # define ldr_R0         (0x18000000)
5796 # define ldr_R0_mask(i) (i & 0xbfffffe0)
5797 # define ldr_R0_x0      (0xb9400000)
5798 # define ldr_hw_R0      (0x72a00000)
5799 # define movk_R0        (0x72800000)
5800 # define movz_R0        (0x52a00000)
5801 # define movz_hw_R0     (0x52c00000)
5802 #endif
5803
5804 /* Handle TLS relaxations.  Relaxing is possible for symbols that use
5805    R_AARCH64_TLSDESC_ADR_{PAGE, LD64_LO12_NC, ADD_LO12_NC} during a static
5806    link.
5807
5808    Return bfd_reloc_ok if we're done, bfd_reloc_continue if the caller
5809    is to then call final_link_relocate.  Return other values in the
5810    case of error.  */
5811
5812 static bfd_reloc_status_type
5813 elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
5814                          bfd *input_bfd, bfd_byte *contents,
5815                          Elf_Internal_Rela *rel, struct elf_link_hash_entry *h)
5816 {
5817   bfd_boolean is_local = h == NULL;
5818   unsigned int r_type = ELFNN_R_TYPE (rel->r_info);
5819   unsigned long insn;
5820
5821   BFD_ASSERT (globals && input_bfd && contents && rel);
5822
5823   switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
5824     {
5825     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
5826     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
5827       if (is_local)
5828         {
5829           /* GD->LE relaxation:
5830              adrp x0, :tlsgd:var     =>   movz R0, :tprel_g1:var
5831              or
5832              adrp x0, :tlsdesc:var   =>   movz R0, :tprel_g1:var
5833
5834              Where R is x for LP64, and w for ILP32.  */
5835           bfd_putl32 (movz_R0, contents + rel->r_offset);
5836           return bfd_reloc_continue;
5837         }
5838       else
5839         {
5840           /* GD->IE relaxation:
5841              adrp x0, :tlsgd:var     =>   adrp x0, :gottprel:var
5842              or
5843              adrp x0, :tlsdesc:var   =>   adrp x0, :gottprel:var
5844            */
5845           return bfd_reloc_continue;
5846         }
5847
5848     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
5849       BFD_ASSERT (0);
5850       break;
5851
5852     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
5853       if (is_local)
5854         {
5855           /* Tiny TLSDESC->LE relaxation:
5856              ldr   x1, :tlsdesc:var      =>  movz  R0, #:tprel_g1:var
5857              adr   x0, :tlsdesc:var      =>  movk  R0, #:tprel_g0_nc:var
5858              .tlsdesccall var
5859              blr   x1                    =>  nop
5860
5861              Where R is x for LP64, and w for ILP32.  */
5862           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSDESC_ADR_PREL21));
5863           BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (TLSDESC_CALL));
5864
5865           rel[1].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5866                                         AARCH64_R (TLSLE_MOVW_TPREL_G0_NC));
5867           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5868
5869           bfd_putl32 (movz_R0, contents + rel->r_offset);
5870           bfd_putl32 (movk_R0, contents + rel->r_offset + 4);
5871           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 8);
5872           return bfd_reloc_continue;
5873         }
5874       else
5875         {
5876           /* Tiny TLSDESC->IE relaxation:
5877              ldr   x1, :tlsdesc:var      =>  ldr   x0, :gottprel:var
5878              adr   x0, :tlsdesc:var      =>  nop
5879              .tlsdesccall var
5880              blr   x1                    =>  nop
5881            */
5882           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSDESC_ADR_PREL21));
5883           BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (TLSDESC_CALL));
5884
5885           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5886           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5887
5888           bfd_putl32 (ldr_R0, contents + rel->r_offset);
5889           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 4);
5890           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 8);
5891           return bfd_reloc_continue;
5892         }
5893
5894     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
5895       if (is_local)
5896         {
5897           /* Tiny GD->LE relaxation:
5898              adr x0, :tlsgd:var      =>   mrs  x1, tpidr_el0
5899              bl   __tls_get_addr     =>   add  R0, R1, #:tprel_hi12:x, lsl #12
5900              nop                     =>   add  R0, R0, #:tprel_lo12_nc:x
5901
5902              Where R is x for LP64, and x for Ilp32.  */
5903
5904           /* First kill the tls_get_addr reloc on the bl instruction.  */
5905           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
5906
5907           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 0);
5908           bfd_putl32 (add_R0_R1, contents + rel->r_offset + 4);
5909           bfd_putl32 (add_R0_R0, contents + rel->r_offset + 8);
5910
5911           rel[1].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5912                                         AARCH64_R (TLSLE_ADD_TPREL_LO12_NC));
5913           rel[1].r_offset = rel->r_offset + 8;
5914
5915           /* Move the current relocation to the second instruction in
5916              the sequence.  */
5917           rel->r_offset += 4;
5918           rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5919                                       AARCH64_R (TLSLE_ADD_TPREL_HI12));
5920           return bfd_reloc_continue;
5921         }
5922       else
5923         {
5924           /* Tiny GD->IE relaxation:
5925              adr x0, :tlsgd:var      =>   ldr  R0, :gottprel:var
5926              bl   __tls_get_addr     =>   mrs  x1, tpidr_el0
5927              nop                     =>   add  R0, R0, R1
5928
5929              Where R is x for LP64, and w for Ilp32.  */
5930
5931           /* First kill the tls_get_addr reloc on the bl instruction.  */
5932           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
5933           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5934
5935           bfd_putl32 (ldr_R0, contents + rel->r_offset);
5936           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 4);
5937           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 8);
5938           return bfd_reloc_continue;
5939         }
5940
5941 #if ARCH_SIZE == 64
5942     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
5943       BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSGD_MOVW_G0_NC));
5944       BFD_ASSERT (rel->r_offset + 12 == rel[2].r_offset);
5945       BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (CALL26));
5946
5947       if (is_local)
5948         {
5949           /* Large GD->LE relaxation:
5950              movz x0, #:tlsgd_g1:var    => movz x0, #:tprel_g2:var, lsl #32
5951              movk x0, #:tlsgd_g0_nc:var => movk x0, #:tprel_g1_nc:var, lsl #16
5952              add x0, gp, x0             => movk x0, #:tprel_g0_nc:var
5953              bl __tls_get_addr          => mrs x1, tpidr_el0
5954              nop                        => add x0, x0, x1
5955            */
5956           rel[2].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5957                                         AARCH64_R (TLSLE_MOVW_TPREL_G0_NC));
5958           rel[2].r_offset = rel->r_offset + 8;
5959
5960           bfd_putl32 (movz_hw_R0, contents + rel->r_offset + 0);
5961           bfd_putl32 (ldr_hw_R0, contents + rel->r_offset + 4);
5962           bfd_putl32 (movk_R0, contents + rel->r_offset + 8);
5963           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 12);
5964           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 16);
5965         }
5966       else
5967         {
5968           /* Large GD->IE relaxation:
5969              movz x0, #:tlsgd_g1:var    => movz x0, #:gottprel_g1:var, lsl #16
5970              movk x0, #:tlsgd_g0_nc:var => movk x0, #:gottprel_g0_nc:var
5971              add x0, gp, x0             => ldr x0, [gp, x0]
5972              bl __tls_get_addr          => mrs x1, tpidr_el0
5973              nop                        => add x0, x0, x1
5974            */
5975           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5976           bfd_putl32 (0xd2a80000, contents + rel->r_offset + 0);
5977           bfd_putl32 (ldr_R0, contents + rel->r_offset + 8);
5978           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 12);
5979           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 16);
5980         }
5981       return bfd_reloc_continue;
5982
5983     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
5984       return bfd_reloc_continue;
5985 #endif
5986
5987     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
5988       return bfd_reloc_continue;
5989
5990     case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
5991       if (is_local)
5992         {
5993           /* GD->LE relaxation:
5994              ldr xd, [x0, #:tlsdesc_lo12:var]   =>   movk x0, :tprel_g0_nc:var
5995
5996              Where R is x for lp64 mode, and w for ILP32 mode.  */
5997           bfd_putl32 (movk_R0, contents + rel->r_offset);
5998           return bfd_reloc_continue;
5999         }
6000       else
6001         {
6002           /* GD->IE relaxation:
6003              ldr xd, [x0, #:tlsdesc_lo12:var] => ldr R0, [x0, #:gottprel_lo12:var]
6004
6005              Where R is x for lp64 mode, and w for ILP32 mode.  */
6006           insn = bfd_getl32 (contents + rel->r_offset);
6007           bfd_putl32 (ldr_R0_mask (insn), contents + rel->r_offset);
6008           return bfd_reloc_continue;
6009         }
6010
6011     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6012       if (is_local)
6013         {
6014           /* GD->LE relaxation
6015              add  x0, #:tlsgd_lo12:var  => movk R0, :tprel_g0_nc:var
6016              bl   __tls_get_addr        => mrs  x1, tpidr_el0
6017              nop                        => add  R0, R1, R0
6018
6019              Where R is x for lp64 mode, and w for ILP32 mode.  */
6020
6021           /* First kill the tls_get_addr reloc on the bl instruction.  */
6022           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6023           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6024
6025           bfd_putl32 (movk_R0, contents + rel->r_offset);
6026           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 4);
6027           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 8);
6028           return bfd_reloc_continue;
6029         }
6030       else
6031         {
6032           /* GD->IE relaxation
6033              ADD  x0, #:tlsgd_lo12:var  => ldr  R0, [x0, #:gottprel_lo12:var]
6034              BL   __tls_get_addr        => mrs  x1, tpidr_el0
6035                R_AARCH64_CALL26
6036              NOP                        => add  R0, R1, R0
6037
6038              Where R is x for lp64 mode, and w for ilp32 mode.  */
6039
6040           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6041
6042           /* Remove the relocation on the BL instruction.  */
6043           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6044
6045           /* We choose to fixup the BL and NOP instructions using the
6046              offset from the second relocation to allow flexibility in
6047              scheduling instructions between the ADD and BL.  */
6048           bfd_putl32 (ldr_R0_x0, contents + rel->r_offset);
6049           bfd_putl32 (0xd53bd041, contents + rel[1].r_offset);
6050           bfd_putl32 (add_R0_R0_R1, contents + rel[1].r_offset + 4);
6051           return bfd_reloc_continue;
6052         }
6053
6054     case BFD_RELOC_AARCH64_TLSDESC_ADD:
6055     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
6056     case BFD_RELOC_AARCH64_TLSDESC_CALL:
6057       /* GD->IE/LE relaxation:
6058          add x0, x0, #:tlsdesc_lo12:var   =>   nop
6059          blr xd                           =>   nop
6060        */
6061       bfd_putl32 (INSN_NOP, contents + rel->r_offset);
6062       return bfd_reloc_ok;
6063
6064     case BFD_RELOC_AARCH64_TLSDESC_LDR:
6065       if (is_local)
6066         {
6067           /* GD->LE relaxation:
6068              ldr xd, [gp, xn]   =>   movk R0, #:tprel_g0_nc:var
6069
6070              Where R is x for lp64 mode, and w for ILP32 mode.  */
6071           bfd_putl32 (movk_R0, contents + rel->r_offset);
6072           return bfd_reloc_continue;
6073         }
6074       else
6075         {
6076           /* GD->IE relaxation:
6077              ldr xd, [gp, xn]   =>   ldr R0, [gp, xn]
6078
6079              Where R is x for lp64 mode, and w for ILP32 mode.  */
6080           insn = bfd_getl32 (contents + rel->r_offset);
6081           bfd_putl32 (ldr_R0_mask (insn), contents + rel->r_offset);
6082           return bfd_reloc_ok;
6083         }
6084
6085     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
6086       /* GD->LE relaxation:
6087          movk xd, #:tlsdesc_off_g0_nc:var => movk R0, #:tprel_g1_nc:var, lsl #16
6088          GD->IE relaxation:
6089          movk xd, #:tlsdesc_off_g0_nc:var => movk Rd, #:gottprel_g0_nc:var
6090
6091          Where R is x for lp64 mode, and w for ILP32 mode.  */
6092       if (is_local)
6093         bfd_putl32 (ldr_hw_R0, contents + rel->r_offset);
6094       return bfd_reloc_continue;
6095
6096     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
6097       if (is_local)
6098         {
6099           /* GD->LE relaxation:
6100              movz xd, #:tlsdesc_off_g1:var => movz R0, #:tprel_g2:var, lsl #32
6101
6102              Where R is x for lp64 mode, and w for ILP32 mode.  */
6103           bfd_putl32 (movz_hw_R0, contents + rel->r_offset);
6104           return bfd_reloc_continue;
6105         }
6106       else
6107         {
6108           /*  GD->IE relaxation:
6109               movz xd, #:tlsdesc_off_g1:var => movz Rd, #:gottprel_g1:var, lsl #16
6110
6111              Where R is x for lp64 mode, and w for ILP32 mode.  */
6112           insn = bfd_getl32 (contents + rel->r_offset);
6113           bfd_putl32 (movz_R0 | (insn & 0x1f), contents + rel->r_offset);
6114           return bfd_reloc_continue;
6115         }
6116
6117     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6118       /* IE->LE relaxation:
6119          adrp xd, :gottprel:var   =>   movz Rd, :tprel_g1:var
6120
6121          Where R is x for lp64 mode, and w for ILP32 mode.  */
6122       if (is_local)
6123         {
6124           insn = bfd_getl32 (contents + rel->r_offset);
6125           bfd_putl32 (movz_R0 | (insn & 0x1f), contents + rel->r_offset);
6126         }
6127       return bfd_reloc_continue;
6128
6129     case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
6130       /* IE->LE relaxation:
6131          ldr  xd, [xm, #:gottprel_lo12:var]   =>   movk Rd, :tprel_g0_nc:var
6132
6133          Where R is x for lp64 mode, and w for ILP32 mode.  */
6134       if (is_local)
6135         {
6136           insn = bfd_getl32 (contents + rel->r_offset);
6137           bfd_putl32 (movk_R0 | (insn & 0x1f), contents + rel->r_offset);
6138         }
6139       return bfd_reloc_continue;
6140
6141     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
6142       /* LD->LE relaxation (tiny):
6143          adr  x0, :tlsldm:x  => mrs x0, tpidr_el0
6144          bl   __tls_get_addr => add R0, R0, TCB_SIZE
6145
6146          Where R is x for lp64 mode, and w for ilp32 mode.  */
6147       if (is_local)
6148         {
6149           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6150           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6151           /* No need of CALL26 relocation for tls_get_addr.  */
6152           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6153           bfd_putl32 (0xd53bd040, contents + rel->r_offset + 0);
6154           bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10),
6155                       contents + rel->r_offset + 4);
6156           return bfd_reloc_ok;
6157         }
6158       return bfd_reloc_continue;
6159
6160     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6161       /* LD->LE relaxation (small):
6162          adrp  x0, :tlsldm:x       => mrs x0, tpidr_el0
6163        */
6164       if (is_local)
6165         {
6166           bfd_putl32 (0xd53bd040, contents + rel->r_offset);
6167           return bfd_reloc_ok;
6168         }
6169       return bfd_reloc_continue;
6170
6171     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
6172       /* LD->LE relaxation (small):
6173          add   x0, #:tlsldm_lo12:x => add R0, R0, TCB_SIZE
6174          bl   __tls_get_addr       => nop
6175
6176          Where R is x for lp64 mode, and w for ilp32 mode.  */
6177       if (is_local)
6178         {
6179           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6180           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6181           /* No need of CALL26 relocation for tls_get_addr.  */
6182           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6183           bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10),
6184                       contents + rel->r_offset + 0);
6185           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 4);
6186           return bfd_reloc_ok;
6187         }
6188       return bfd_reloc_continue;
6189
6190     default:
6191       return bfd_reloc_continue;
6192     }
6193
6194   return bfd_reloc_ok;
6195 }
6196
6197 /* Relocate an AArch64 ELF section.  */
6198
6199 static bfd_boolean
6200 elfNN_aarch64_relocate_section (bfd *output_bfd,
6201                                 struct bfd_link_info *info,
6202                                 bfd *input_bfd,
6203                                 asection *input_section,
6204                                 bfd_byte *contents,
6205                                 Elf_Internal_Rela *relocs,
6206                                 Elf_Internal_Sym *local_syms,
6207                                 asection **local_sections)
6208 {
6209   Elf_Internal_Shdr *symtab_hdr;
6210   struct elf_link_hash_entry **sym_hashes;
6211   Elf_Internal_Rela *rel;
6212   Elf_Internal_Rela *relend;
6213   const char *name;
6214   struct elf_aarch64_link_hash_table *globals;
6215   bfd_boolean save_addend = FALSE;
6216   bfd_vma addend = 0;
6217
6218   globals = elf_aarch64_hash_table (info);
6219
6220   symtab_hdr = &elf_symtab_hdr (input_bfd);
6221   sym_hashes = elf_sym_hashes (input_bfd);
6222
6223   rel = relocs;
6224   relend = relocs + input_section->reloc_count;
6225   for (; rel < relend; rel++)
6226     {
6227       unsigned int r_type;
6228       bfd_reloc_code_real_type bfd_r_type;
6229       bfd_reloc_code_real_type relaxed_bfd_r_type;
6230       reloc_howto_type *howto;
6231       unsigned long r_symndx;
6232       Elf_Internal_Sym *sym;
6233       asection *sec;
6234       struct elf_link_hash_entry *h;
6235       bfd_vma relocation;
6236       bfd_reloc_status_type r;
6237       arelent bfd_reloc;
6238       char sym_type;
6239       bfd_boolean unresolved_reloc = FALSE;
6240       char *error_message = NULL;
6241
6242       r_symndx = ELFNN_R_SYM (rel->r_info);
6243       r_type = ELFNN_R_TYPE (rel->r_info);
6244
6245       bfd_reloc.howto = elfNN_aarch64_howto_from_type (input_bfd, r_type);
6246       howto = bfd_reloc.howto;
6247
6248       if (howto == NULL)
6249         return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
6250
6251       bfd_r_type = elfNN_aarch64_bfd_reloc_from_howto (howto);
6252
6253       h = NULL;
6254       sym = NULL;
6255       sec = NULL;
6256
6257       if (r_symndx < symtab_hdr->sh_info)
6258         {
6259           sym = local_syms + r_symndx;
6260           sym_type = ELFNN_ST_TYPE (sym->st_info);
6261           sec = local_sections[r_symndx];
6262
6263           /* An object file might have a reference to a local
6264              undefined symbol.  This is a daft object file, but we
6265              should at least do something about it.  */
6266           if (r_type != R_AARCH64_NONE && r_type != R_AARCH64_NULL
6267               && bfd_is_und_section (sec)
6268               && ELF_ST_BIND (sym->st_info) != STB_WEAK)
6269             (*info->callbacks->undefined_symbol)
6270               (info, bfd_elf_string_from_elf_section
6271                (input_bfd, symtab_hdr->sh_link, sym->st_name),
6272                input_bfd, input_section, rel->r_offset, TRUE);
6273
6274           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
6275
6276           /* Relocate against local STT_GNU_IFUNC symbol.  */
6277           if (!bfd_link_relocatable (info)
6278               && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
6279             {
6280               h = elfNN_aarch64_get_local_sym_hash (globals, input_bfd,
6281                                                     rel, FALSE);
6282               if (h == NULL)
6283                 abort ();
6284
6285               /* Set STT_GNU_IFUNC symbol value.  */
6286               h->root.u.def.value = sym->st_value;
6287               h->root.u.def.section = sec;
6288             }
6289         }
6290       else
6291         {
6292           bfd_boolean warned, ignored;
6293
6294           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
6295                                    r_symndx, symtab_hdr, sym_hashes,
6296                                    h, sec, relocation,
6297                                    unresolved_reloc, warned, ignored);
6298
6299           sym_type = h->type;
6300         }
6301
6302       if (sec != NULL && discarded_section (sec))
6303         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
6304                                          rel, 1, relend, howto, 0, contents);
6305
6306       if (bfd_link_relocatable (info))
6307         continue;
6308
6309       if (h != NULL)
6310         name = h->root.root.string;
6311       else
6312         {
6313           name = (bfd_elf_string_from_elf_section
6314                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
6315           if (name == NULL || *name == '\0')
6316             name = bfd_section_name (input_bfd, sec);
6317         }
6318
6319       if (r_symndx != 0
6320           && r_type != R_AARCH64_NONE
6321           && r_type != R_AARCH64_NULL
6322           && (h == NULL
6323               || h->root.type == bfd_link_hash_defined
6324               || h->root.type == bfd_link_hash_defweak)
6325           && IS_AARCH64_TLS_RELOC (bfd_r_type) != (sym_type == STT_TLS))
6326         {
6327           _bfd_error_handler
6328             ((sym_type == STT_TLS
6329               /* xgettext:c-format */
6330               ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
6331               /* xgettext:c-format */
6332               : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
6333              input_bfd,
6334              input_section, (uint64_t) rel->r_offset, howto->name, name);
6335         }
6336
6337       /* We relax only if we can see that there can be a valid transition
6338          from a reloc type to another.
6339          We call elfNN_aarch64_final_link_relocate unless we're completely
6340          done, i.e., the relaxation produced the final output we want.  */
6341
6342       relaxed_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type,
6343                                                    h, r_symndx);
6344       if (relaxed_bfd_r_type != bfd_r_type)
6345         {
6346           bfd_r_type = relaxed_bfd_r_type;
6347           howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type);
6348           BFD_ASSERT (howto != NULL);
6349           r_type = howto->type;
6350           r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h);
6351           unresolved_reloc = 0;
6352         }
6353       else
6354         r = bfd_reloc_continue;
6355
6356       /* There may be multiple consecutive relocations for the
6357          same offset.  In that case we are supposed to treat the
6358          output of each relocation as the addend for the next.  */
6359       if (rel + 1 < relend
6360           && rel->r_offset == rel[1].r_offset
6361           && ELFNN_R_TYPE (rel[1].r_info) != R_AARCH64_NONE
6362           && ELFNN_R_TYPE (rel[1].r_info) != R_AARCH64_NULL)
6363         save_addend = TRUE;
6364       else
6365         save_addend = FALSE;
6366
6367       if (r == bfd_reloc_continue)
6368         r = elfNN_aarch64_final_link_relocate (howto, input_bfd, output_bfd,
6369                                                input_section, contents, rel,
6370                                                relocation, info, sec,
6371                                                h, &unresolved_reloc,
6372                                                save_addend, &addend, sym);
6373
6374       switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
6375         {
6376         case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6377         case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
6378         case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
6379         case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
6380         case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
6381         case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
6382         case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6383         case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
6384           if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
6385             {
6386               bfd_boolean need_relocs = FALSE;
6387               bfd_byte *loc;
6388               int indx;
6389               bfd_vma off;
6390
6391               off = symbol_got_offset (input_bfd, h, r_symndx);
6392               indx = h && h->dynindx != -1 ? h->dynindx : 0;
6393
6394               need_relocs =
6395                 (!bfd_link_executable (info) || indx != 0) &&
6396                 (h == NULL
6397                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6398                  || h->root.type != bfd_link_hash_undefweak);
6399
6400               BFD_ASSERT (globals->root.srelgot != NULL);
6401
6402               if (need_relocs)
6403                 {
6404                   Elf_Internal_Rela rela;
6405                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPMOD));
6406                   rela.r_addend = 0;
6407                   rela.r_offset = globals->root.sgot->output_section->vma +
6408                     globals->root.sgot->output_offset + off;
6409
6410
6411                   loc = globals->root.srelgot->contents;
6412                   loc += globals->root.srelgot->reloc_count++
6413                     * RELOC_SIZE (htab);
6414                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6415
6416                   bfd_reloc_code_real_type real_type =
6417                     elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
6418
6419                   if (real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21
6420                       || real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21
6421                       || real_type == BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC)
6422                     {
6423                       /* For local dynamic, don't generate DTPREL in any case.
6424                          Initialize the DTPREL slot into zero, so we get module
6425                          base address when invoke runtime TLS resolver.  */
6426                       bfd_put_NN (output_bfd, 0,
6427                                   globals->root.sgot->contents + off
6428                                   + GOT_ENTRY_SIZE);
6429                     }
6430                   else if (indx == 0)
6431                     {
6432                       bfd_put_NN (output_bfd,
6433                                   relocation - dtpoff_base (info),
6434                                   globals->root.sgot->contents + off
6435                                   + GOT_ENTRY_SIZE);
6436                     }
6437                   else
6438                     {
6439                       /* This TLS symbol is global. We emit a
6440                          relocation to fixup the tls offset at load
6441                          time.  */
6442                       rela.r_info =
6443                         ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPREL));
6444                       rela.r_addend = 0;
6445                       rela.r_offset =
6446                         (globals->root.sgot->output_section->vma
6447                          + globals->root.sgot->output_offset + off
6448                          + GOT_ENTRY_SIZE);
6449
6450                       loc = globals->root.srelgot->contents;
6451                       loc += globals->root.srelgot->reloc_count++
6452                         * RELOC_SIZE (globals);
6453                       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6454                       bfd_put_NN (output_bfd, (bfd_vma) 0,
6455                                   globals->root.sgot->contents + off
6456                                   + GOT_ENTRY_SIZE);
6457                     }
6458                 }
6459               else
6460                 {
6461                   bfd_put_NN (output_bfd, (bfd_vma) 1,
6462                               globals->root.sgot->contents + off);
6463                   bfd_put_NN (output_bfd,
6464                               relocation - dtpoff_base (info),
6465                               globals->root.sgot->contents + off
6466                               + GOT_ENTRY_SIZE);
6467                 }
6468
6469               symbol_got_offset_mark (input_bfd, h, r_symndx);
6470             }
6471           break;
6472
6473         case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6474         case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
6475         case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
6476         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
6477         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
6478           if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
6479             {
6480               bfd_boolean need_relocs = FALSE;
6481               bfd_byte *loc;
6482               int indx;
6483               bfd_vma off;
6484
6485               off = symbol_got_offset (input_bfd, h, r_symndx);
6486
6487               indx = h && h->dynindx != -1 ? h->dynindx : 0;
6488
6489               need_relocs =
6490                 (!bfd_link_executable (info) || indx != 0) &&
6491                 (h == NULL
6492                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6493                  || h->root.type != bfd_link_hash_undefweak);
6494
6495               BFD_ASSERT (globals->root.srelgot != NULL);
6496
6497               if (need_relocs)
6498                 {
6499                   Elf_Internal_Rela rela;
6500
6501                   if (indx == 0)
6502                     rela.r_addend = relocation - dtpoff_base (info);
6503                   else
6504                     rela.r_addend = 0;
6505
6506                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_TPREL));
6507                   rela.r_offset = globals->root.sgot->output_section->vma +
6508                     globals->root.sgot->output_offset + off;
6509
6510                   loc = globals->root.srelgot->contents;
6511                   loc += globals->root.srelgot->reloc_count++
6512                     * RELOC_SIZE (htab);
6513
6514                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6515
6516                   bfd_put_NN (output_bfd, rela.r_addend,
6517                               globals->root.sgot->contents + off);
6518                 }
6519               else
6520                 bfd_put_NN (output_bfd, relocation - tpoff_base (info),
6521                             globals->root.sgot->contents + off);
6522
6523               symbol_got_offset_mark (input_bfd, h, r_symndx);
6524             }
6525           break;
6526
6527         case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
6528         case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
6529         case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
6530         case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
6531         case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
6532         case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
6533         case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
6534           if (! symbol_tlsdesc_got_offset_mark_p (input_bfd, h, r_symndx))
6535             {
6536               bfd_boolean need_relocs = FALSE;
6537               int indx = h && h->dynindx != -1 ? h->dynindx : 0;
6538               bfd_vma off = symbol_tlsdesc_got_offset (input_bfd, h, r_symndx);
6539
6540               need_relocs = (h == NULL
6541                              || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6542                              || h->root.type != bfd_link_hash_undefweak);
6543
6544               BFD_ASSERT (globals->root.srelgot != NULL);
6545               BFD_ASSERT (globals->root.sgot != NULL);
6546
6547               if (need_relocs)
6548                 {
6549                   bfd_byte *loc;
6550                   Elf_Internal_Rela rela;
6551                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLSDESC));
6552
6553                   rela.r_addend = 0;
6554                   rela.r_offset = (globals->root.sgotplt->output_section->vma
6555                                    + globals->root.sgotplt->output_offset
6556                                    + off + globals->sgotplt_jump_table_size);
6557
6558                   if (indx == 0)
6559                     rela.r_addend = relocation - dtpoff_base (info);
6560
6561                   /* Allocate the next available slot in the PLT reloc
6562                      section to hold our R_AARCH64_TLSDESC, the next
6563                      available slot is determined from reloc_count,
6564                      which we step. But note, reloc_count was
6565                      artifically moved down while allocating slots for
6566                      real PLT relocs such that all of the PLT relocs
6567                      will fit above the initial reloc_count and the
6568                      extra stuff will fit below.  */
6569                   loc = globals->root.srelplt->contents;
6570                   loc += globals->root.srelplt->reloc_count++
6571                     * RELOC_SIZE (globals);
6572
6573                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6574
6575                   bfd_put_NN (output_bfd, (bfd_vma) 0,
6576                               globals->root.sgotplt->contents + off +
6577                               globals->sgotplt_jump_table_size);
6578                   bfd_put_NN (output_bfd, (bfd_vma) 0,
6579                               globals->root.sgotplt->contents + off +
6580                               globals->sgotplt_jump_table_size +
6581                               GOT_ENTRY_SIZE);
6582                 }
6583
6584               symbol_tlsdesc_got_offset_mark (input_bfd, h, r_symndx);
6585             }
6586           break;
6587         default:
6588           break;
6589         }
6590
6591       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
6592          because such sections are not SEC_ALLOC and thus ld.so will
6593          not process them.  */
6594       if (unresolved_reloc
6595           && !((input_section->flags & SEC_DEBUGGING) != 0
6596                && h->def_dynamic)
6597           && _bfd_elf_section_offset (output_bfd, info, input_section,
6598                                       +rel->r_offset) != (bfd_vma) - 1)
6599         {
6600           _bfd_error_handler
6601             /* xgettext:c-format */
6602             (_("%pB(%pA+%#" PRIx64 "): "
6603                "unresolvable %s relocation against symbol `%s'"),
6604              input_bfd, input_section, (uint64_t) rel->r_offset, howto->name,
6605              h->root.root.string);
6606           return FALSE;
6607         }
6608
6609       if (r != bfd_reloc_ok && r != bfd_reloc_continue)
6610         {
6611           bfd_reloc_code_real_type real_r_type
6612             = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
6613
6614           switch (r)
6615             {
6616             case bfd_reloc_overflow:
6617               (*info->callbacks->reloc_overflow)
6618                 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
6619                  input_bfd, input_section, rel->r_offset);
6620               if (real_r_type == BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15
6621                   || real_r_type == BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14)
6622                 {
6623                   (*info->callbacks->warning)
6624                     (info,
6625                      _("too many GOT entries for -fpic, "
6626                        "please recompile with -fPIC"),
6627                      name, input_bfd, input_section, rel->r_offset);
6628                   return FALSE;
6629                 }
6630               /* Overflow can occur when a variable is referenced with a type
6631                  that has a larger alignment than the type with which it was
6632                  declared. eg:
6633                    file1.c: extern int foo; int a (void) { return foo; }
6634                    file2.c: char bar, foo, baz;
6635                  If the variable is placed into a data section at an offset
6636                  that is incompatible with the larger alignment requirement
6637                  overflow will occur.  (Strictly speaking this is not overflow
6638                  but rather an alignment problem, but the bfd_reloc_ error
6639                  enum does not have a value to cover that situation).
6640
6641                  Try to catch this situation here and provide a more helpful
6642                  error message to the user.  */
6643               if (addend & ((1 << howto->rightshift) - 1)
6644                   /* FIXME: Are we testing all of the appropriate reloc
6645                      types here ?  */
6646                   && (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL
6647                       || real_r_type == BFD_RELOC_AARCH64_LDST16_LO12
6648                       || real_r_type == BFD_RELOC_AARCH64_LDST32_LO12
6649                       || real_r_type == BFD_RELOC_AARCH64_LDST64_LO12
6650                       || real_r_type == BFD_RELOC_AARCH64_LDST128_LO12))
6651                 {
6652                   info->callbacks->warning
6653                     (info, _("one possible cause of this error is that the \
6654 symbol is being referenced in the indicated code as if it had a larger \
6655 alignment than was declared where it was defined"),
6656                      name, input_bfd, input_section, rel->r_offset);
6657                 }
6658               break;
6659
6660             case bfd_reloc_undefined:
6661               (*info->callbacks->undefined_symbol)
6662                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
6663               break;
6664
6665             case bfd_reloc_outofrange:
6666               error_message = _("out of range");
6667               goto common_error;
6668
6669             case bfd_reloc_notsupported:
6670               error_message = _("unsupported relocation");
6671               goto common_error;
6672
6673             case bfd_reloc_dangerous:
6674               /* error_message should already be set.  */
6675               goto common_error;
6676
6677             default:
6678               error_message = _("unknown error");
6679               /* Fall through.  */
6680
6681             common_error:
6682               BFD_ASSERT (error_message != NULL);
6683               (*info->callbacks->reloc_dangerous)
6684                 (info, error_message, input_bfd, input_section, rel->r_offset);
6685               break;
6686             }
6687         }
6688
6689       if (!save_addend)
6690         addend = 0;
6691     }
6692
6693   return TRUE;
6694 }
6695
6696 /* Set the right machine number.  */
6697
6698 static bfd_boolean
6699 elfNN_aarch64_object_p (bfd *abfd)
6700 {
6701 #if ARCH_SIZE == 32
6702   bfd_default_set_arch_mach (abfd, bfd_arch_aarch64, bfd_mach_aarch64_ilp32);
6703 #else
6704   bfd_default_set_arch_mach (abfd, bfd_arch_aarch64, bfd_mach_aarch64);
6705 #endif
6706   return TRUE;
6707 }
6708
6709 /* Function to keep AArch64 specific flags in the ELF header.  */
6710
6711 static bfd_boolean
6712 elfNN_aarch64_set_private_flags (bfd *abfd, flagword flags)
6713 {
6714   if (elf_flags_init (abfd) && elf_elfheader (abfd)->e_flags != flags)
6715     {
6716     }
6717   else
6718     {
6719       elf_elfheader (abfd)->e_flags = flags;
6720       elf_flags_init (abfd) = TRUE;
6721     }
6722
6723   return TRUE;
6724 }
6725
6726 /* Merge backend specific data from an object file to the output
6727    object file when linking.  */
6728
6729 static bfd_boolean
6730 elfNN_aarch64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6731 {
6732   bfd *obfd = info->output_bfd;
6733   flagword out_flags;
6734   flagword in_flags;
6735   bfd_boolean flags_compatible = TRUE;
6736   asection *sec;
6737
6738   /* Check if we have the same endianess.  */
6739   if (!_bfd_generic_verify_endian_match (ibfd, info))
6740     return FALSE;
6741
6742   if (!is_aarch64_elf (ibfd) || !is_aarch64_elf (obfd))
6743     return TRUE;
6744
6745   /* The input BFD must have had its flags initialised.  */
6746   /* The following seems bogus to me -- The flags are initialized in
6747      the assembler but I don't think an elf_flags_init field is
6748      written into the object.  */
6749   /* BFD_ASSERT (elf_flags_init (ibfd)); */
6750
6751   in_flags = elf_elfheader (ibfd)->e_flags;
6752   out_flags = elf_elfheader (obfd)->e_flags;
6753
6754   if (!elf_flags_init (obfd))
6755     {
6756       /* If the input is the default architecture and had the default
6757          flags then do not bother setting the flags for the output
6758          architecture, instead allow future merges to do this.  If no
6759          future merges ever set these flags then they will retain their
6760          uninitialised values, which surprise surprise, correspond
6761          to the default values.  */
6762       if (bfd_get_arch_info (ibfd)->the_default
6763           && elf_elfheader (ibfd)->e_flags == 0)
6764         return TRUE;
6765
6766       elf_flags_init (obfd) = TRUE;
6767       elf_elfheader (obfd)->e_flags = in_flags;
6768
6769       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6770           && bfd_get_arch_info (obfd)->the_default)
6771         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6772                                   bfd_get_mach (ibfd));
6773
6774       return TRUE;
6775     }
6776
6777   /* Identical flags must be compatible.  */
6778   if (in_flags == out_flags)
6779     return TRUE;
6780
6781   /* Check to see if the input BFD actually contains any sections.  If
6782      not, its flags may not have been initialised either, but it
6783      cannot actually cause any incompatiblity.  Do not short-circuit
6784      dynamic objects; their section list may be emptied by
6785      elf_link_add_object_symbols.
6786
6787      Also check to see if there are no code sections in the input.
6788      In this case there is no need to check for code specific flags.
6789      XXX - do we need to worry about floating-point format compatability
6790      in data sections ?  */
6791   if (!(ibfd->flags & DYNAMIC))
6792     {
6793       bfd_boolean null_input_bfd = TRUE;
6794       bfd_boolean only_data_sections = TRUE;
6795
6796       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6797         {
6798           if ((bfd_get_section_flags (ibfd, sec)
6799                & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6800               == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6801             only_data_sections = FALSE;
6802
6803           null_input_bfd = FALSE;
6804           break;
6805         }
6806
6807       if (null_input_bfd || only_data_sections)
6808         return TRUE;
6809     }
6810
6811   return flags_compatible;
6812 }
6813
6814 /* Display the flags field.  */
6815
6816 static bfd_boolean
6817 elfNN_aarch64_print_private_bfd_data (bfd *abfd, void *ptr)
6818 {
6819   FILE *file = (FILE *) ptr;
6820   unsigned long flags;
6821
6822   BFD_ASSERT (abfd != NULL && ptr != NULL);
6823
6824   /* Print normal ELF private data.  */
6825   _bfd_elf_print_private_bfd_data (abfd, ptr);
6826
6827   flags = elf_elfheader (abfd)->e_flags;
6828   /* Ignore init flag - it may not be set, despite the flags field
6829      containing valid data.  */
6830
6831   /* xgettext:c-format */
6832   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
6833
6834   if (flags)
6835     fprintf (file, _("<Unrecognised flag bits set>"));
6836
6837   fputc ('\n', file);
6838
6839   return TRUE;
6840 }
6841
6842 /* Find dynamic relocs for H that apply to read-only sections.  */
6843
6844 static asection *
6845 readonly_dynrelocs (struct elf_link_hash_entry *h)
6846 {
6847   struct elf_dyn_relocs *p;
6848
6849   for (p = elf_aarch64_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
6850     {
6851       asection *s = p->sec->output_section;
6852
6853       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6854         return p->sec;
6855     }
6856   return NULL;
6857 }
6858
6859 /* Return true if we need copy relocation against EH.  */
6860
6861 static bfd_boolean
6862 need_copy_relocation_p (struct elf_aarch64_link_hash_entry *eh)
6863 {
6864   struct elf_dyn_relocs *p;
6865   asection *s;
6866
6867   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6868     {
6869       /* If there is any pc-relative reference, we need to keep copy relocation
6870          to avoid propagating the relocation into runtime that current glibc
6871          does not support.  */
6872       if (p->pc_count)
6873         return TRUE;
6874
6875       s = p->sec->output_section;
6876       /* Need copy relocation if it's against read-only section.  */
6877       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6878         return TRUE;
6879     }
6880
6881   return FALSE;
6882 }
6883
6884 /* Adjust a symbol defined by a dynamic object and referenced by a
6885    regular object.  The current definition is in some section of the
6886    dynamic object, but we're not including those sections.  We have to
6887    change the definition to something the rest of the link can
6888    understand.  */
6889
6890 static bfd_boolean
6891 elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info,
6892                                      struct elf_link_hash_entry *h)
6893 {
6894   struct elf_aarch64_link_hash_table *htab;
6895   asection *s, *srel;
6896
6897   /* If this is a function, put it in the procedure linkage table.  We
6898      will fill in the contents of the procedure linkage table later,
6899      when we know the address of the .got section.  */
6900   if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
6901     {
6902       if (h->plt.refcount <= 0
6903           || (h->type != STT_GNU_IFUNC
6904               && (SYMBOL_CALLS_LOCAL (info, h)
6905                   || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6906                       && h->root.type == bfd_link_hash_undefweak))))
6907         {
6908           /* This case can occur if we saw a CALL26 reloc in
6909              an input file, but the symbol wasn't referred to
6910              by a dynamic object or all references were
6911              garbage collected. In which case we can end up
6912              resolving.  */
6913           h->plt.offset = (bfd_vma) - 1;
6914           h->needs_plt = 0;
6915         }
6916
6917       return TRUE;
6918     }
6919   else
6920     /* Otherwise, reset to -1.  */
6921     h->plt.offset = (bfd_vma) - 1;
6922
6923
6924   /* If this is a weak symbol, and there is a real definition, the
6925      processor independent code will have arranged for us to see the
6926      real definition first, and we can just use the same value.  */
6927   if (h->is_weakalias)
6928     {
6929       struct elf_link_hash_entry *def = weakdef (h);
6930       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6931       h->root.u.def.section = def->root.u.def.section;
6932       h->root.u.def.value = def->root.u.def.value;
6933       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
6934         h->non_got_ref = def->non_got_ref;
6935       return TRUE;
6936     }
6937
6938   /* If we are creating a shared library, we must presume that the
6939      only references to the symbol are via the global offset table.
6940      For such cases we need not do anything here; the relocations will
6941      be handled correctly by relocate_section.  */
6942   if (bfd_link_pic (info))
6943     return TRUE;
6944
6945   /* If there are no references to this symbol that do not use the
6946      GOT, we don't need to generate a copy reloc.  */
6947   if (!h->non_got_ref)
6948     return TRUE;
6949
6950   /* If -z nocopyreloc was given, we won't generate them either.  */
6951   if (info->nocopyreloc)
6952     {
6953       h->non_got_ref = 0;
6954       return TRUE;
6955     }
6956
6957   if (ELIMINATE_COPY_RELOCS)
6958     {
6959       struct elf_aarch64_link_hash_entry *eh;
6960       /* If we don't find any dynamic relocs in read-only sections, then
6961          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
6962       eh = (struct elf_aarch64_link_hash_entry *) h;
6963       if (!need_copy_relocation_p (eh))
6964         {
6965           h->non_got_ref = 0;
6966           return TRUE;
6967         }
6968     }
6969
6970   /* We must allocate the symbol in our .dynbss section, which will
6971      become part of the .bss section of the executable.  There will be
6972      an entry for this symbol in the .dynsym section.  The dynamic
6973      object will contain position independent code, so all references
6974      from the dynamic object to this symbol will go through the global
6975      offset table.  The dynamic linker will use the .dynsym entry to
6976      determine the address it must put in the global offset table, so
6977      both the dynamic object and the regular object will refer to the
6978      same memory location for the variable.  */
6979
6980   htab = elf_aarch64_hash_table (info);
6981
6982   /* We must generate a R_AARCH64_COPY reloc to tell the dynamic linker
6983      to copy the initial value out of the dynamic object and into the
6984      runtime process image.  */
6985   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6986     {
6987       s = htab->root.sdynrelro;
6988       srel = htab->root.sreldynrelro;
6989     }
6990   else
6991     {
6992       s = htab->root.sdynbss;
6993       srel = htab->root.srelbss;
6994     }
6995   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
6996     {
6997       srel->size += RELOC_SIZE (htab);
6998       h->needs_copy = 1;
6999     }
7000
7001   return _bfd_elf_adjust_dynamic_copy (info, h, s);
7002
7003 }
7004
7005 static bfd_boolean
7006 elfNN_aarch64_allocate_local_symbols (bfd *abfd, unsigned number)
7007 {
7008   struct elf_aarch64_local_symbol *locals;
7009   locals = elf_aarch64_locals (abfd);
7010   if (locals == NULL)
7011     {
7012       locals = (struct elf_aarch64_local_symbol *)
7013         bfd_zalloc (abfd, number * sizeof (struct elf_aarch64_local_symbol));
7014       if (locals == NULL)
7015         return FALSE;
7016       elf_aarch64_locals (abfd) = locals;
7017     }
7018   return TRUE;
7019 }
7020
7021 /* Create the .got section to hold the global offset table.  */
7022
7023 static bfd_boolean
7024 aarch64_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
7025 {
7026   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7027   flagword flags;
7028   asection *s;
7029   struct elf_link_hash_entry *h;
7030   struct elf_link_hash_table *htab = elf_hash_table (info);
7031
7032   /* This function may be called more than once.  */
7033   if (htab->sgot != NULL)
7034     return TRUE;
7035
7036   flags = bed->dynamic_sec_flags;
7037
7038   s = bfd_make_section_anyway_with_flags (abfd,
7039                                           (bed->rela_plts_and_copies_p
7040                                            ? ".rela.got" : ".rel.got"),
7041                                           (bed->dynamic_sec_flags
7042                                            | SEC_READONLY));
7043   if (s == NULL
7044       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
7045     return FALSE;
7046   htab->srelgot = s;
7047
7048   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
7049   if (s == NULL
7050       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
7051     return FALSE;
7052   htab->sgot = s;
7053   htab->sgot->size += GOT_ENTRY_SIZE;
7054
7055   if (bed->want_got_sym)
7056     {
7057       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
7058          (or .got.plt) section.  We don't do this in the linker script
7059          because we don't want to define the symbol if we are not creating
7060          a global offset table.  */
7061       h = _bfd_elf_define_linkage_sym (abfd, info, s,
7062                                        "_GLOBAL_OFFSET_TABLE_");
7063       elf_hash_table (info)->hgot = h;
7064       if (h == NULL)
7065         return FALSE;
7066     }
7067
7068   if (bed->want_got_plt)
7069     {
7070       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
7071       if (s == NULL
7072           || !bfd_set_section_alignment (abfd, s,
7073                                          bed->s->log_file_align))
7074         return FALSE;
7075       htab->sgotplt = s;
7076     }
7077
7078   /* The first bit of the global offset table is the header.  */
7079   s->size += bed->got_header_size;
7080
7081   return TRUE;
7082 }
7083
7084 /* Look through the relocs for a section during the first phase.  */
7085
7086 static bfd_boolean
7087 elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
7088                             asection *sec, const Elf_Internal_Rela *relocs)
7089 {
7090   Elf_Internal_Shdr *symtab_hdr;
7091   struct elf_link_hash_entry **sym_hashes;
7092   const Elf_Internal_Rela *rel;
7093   const Elf_Internal_Rela *rel_end;
7094   asection *sreloc;
7095
7096   struct elf_aarch64_link_hash_table *htab;
7097
7098   if (bfd_link_relocatable (info))
7099     return TRUE;
7100
7101   BFD_ASSERT (is_aarch64_elf (abfd));
7102
7103   htab = elf_aarch64_hash_table (info);
7104   sreloc = NULL;
7105
7106   symtab_hdr = &elf_symtab_hdr (abfd);
7107   sym_hashes = elf_sym_hashes (abfd);
7108
7109   rel_end = relocs + sec->reloc_count;
7110   for (rel = relocs; rel < rel_end; rel++)
7111     {
7112       struct elf_link_hash_entry *h;
7113       unsigned int r_symndx;
7114       unsigned int r_type;
7115       bfd_reloc_code_real_type bfd_r_type;
7116       Elf_Internal_Sym *isym;
7117
7118       r_symndx = ELFNN_R_SYM (rel->r_info);
7119       r_type = ELFNN_R_TYPE (rel->r_info);
7120
7121       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
7122         {
7123           /* xgettext:c-format */
7124           _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
7125           return FALSE;
7126         }
7127
7128       if (r_symndx < symtab_hdr->sh_info)
7129         {
7130           /* A local symbol.  */
7131           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
7132                                         abfd, r_symndx);
7133           if (isym == NULL)
7134             return FALSE;
7135
7136           /* Check relocation against local STT_GNU_IFUNC symbol.  */
7137           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
7138             {
7139               h = elfNN_aarch64_get_local_sym_hash (htab, abfd, rel,
7140                                                     TRUE);
7141               if (h == NULL)
7142                 return FALSE;
7143
7144               /* Fake a STT_GNU_IFUNC symbol.  */
7145               h->type = STT_GNU_IFUNC;
7146               h->def_regular = 1;
7147               h->ref_regular = 1;
7148               h->forced_local = 1;
7149               h->root.type = bfd_link_hash_defined;
7150             }
7151           else
7152             h = NULL;
7153         }
7154       else
7155         {
7156           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7157           while (h->root.type == bfd_link_hash_indirect
7158                  || h->root.type == bfd_link_hash_warning)
7159             h = (struct elf_link_hash_entry *) h->root.u.i.link;
7160         }
7161
7162       /* Could be done earlier, if h were already available.  */
7163       bfd_r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);
7164
7165       if (h != NULL)
7166         {
7167           /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
7168              This shows up in particular in an R_AARCH64_PREL64 in large model
7169              when calculating the pc-relative address to .got section which is
7170              used to initialize the gp register.  */
7171           if (h->root.root.string
7172               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
7173             {
7174               if (htab->root.dynobj == NULL)
7175                 htab->root.dynobj = abfd;
7176
7177               if (! aarch64_elf_create_got_section (htab->root.dynobj, info))
7178                 return FALSE;
7179
7180               BFD_ASSERT (h == htab->root.hgot);
7181             }
7182
7183           /* Create the ifunc sections for static executables.  If we
7184              never see an indirect function symbol nor we are building
7185              a static executable, those sections will be empty and
7186              won't appear in output.  */
7187           switch (bfd_r_type)
7188             {
7189             default:
7190               break;
7191
7192             case BFD_RELOC_AARCH64_ADD_LO12:
7193             case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
7194             case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
7195             case BFD_RELOC_AARCH64_CALL26:
7196             case BFD_RELOC_AARCH64_GOT_LD_PREL19:
7197             case BFD_RELOC_AARCH64_JUMP26:
7198             case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
7199             case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
7200             case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
7201             case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
7202             case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
7203             case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
7204             case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
7205             case BFD_RELOC_AARCH64_NN:
7206               if (htab->root.dynobj == NULL)
7207                 htab->root.dynobj = abfd;
7208               if (!_bfd_elf_create_ifunc_sections (htab->root.dynobj, info))
7209                 return FALSE;
7210               break;
7211             }
7212
7213           /* It is referenced by a non-shared object.  */
7214           h->ref_regular = 1;
7215         }
7216
7217       switch (bfd_r_type)
7218         {
7219         case BFD_RELOC_AARCH64_16:
7220 #if ARCH_SIZE == 64
7221         case BFD_RELOC_AARCH64_32:
7222 #endif
7223           if (bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0)
7224             {
7225               if (h != NULL
7226                   /* This is an absolute symbol.  It represents a value instead
7227                      of an address.  */
7228                   && ((h->root.type == bfd_link_hash_defined
7229                        && bfd_is_abs_section (h->root.u.def.section))
7230                       /* This is an undefined symbol.  */
7231                       || h->root.type == bfd_link_hash_undefined))
7232                 break;
7233
7234               /* For local symbols, defined global symbols in a non-ABS section,
7235                  it is assumed that the value is an address.  */
7236               int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7237               _bfd_error_handler
7238                 /* xgettext:c-format */
7239                 (_("%pB: relocation %s against `%s' can not be used when making "
7240                    "a shared object"),
7241                  abfd, elfNN_aarch64_howto_table[howto_index].name,
7242                  (h) ? h->root.root.string : "a local symbol");
7243               bfd_set_error (bfd_error_bad_value);
7244               return FALSE;
7245             }
7246           else
7247             break;
7248
7249         case BFD_RELOC_AARCH64_MOVW_G0_NC:
7250         case BFD_RELOC_AARCH64_MOVW_G1_NC:
7251         case BFD_RELOC_AARCH64_MOVW_G2_NC:
7252         case BFD_RELOC_AARCH64_MOVW_G3:
7253           if (bfd_link_pic (info))
7254             {
7255               int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7256               _bfd_error_handler
7257                 /* xgettext:c-format */
7258                 (_("%pB: relocation %s against `%s' can not be used when making "
7259                    "a shared object; recompile with -fPIC"),
7260                  abfd, elfNN_aarch64_howto_table[howto_index].name,
7261                  (h) ? h->root.root.string : "a local symbol");
7262               bfd_set_error (bfd_error_bad_value);
7263               return FALSE;
7264             }
7265           /* Fall through.  */
7266
7267         case BFD_RELOC_AARCH64_16_PCREL:
7268         case BFD_RELOC_AARCH64_32_PCREL:
7269         case BFD_RELOC_AARCH64_64_PCREL:
7270         case BFD_RELOC_AARCH64_ADD_LO12:
7271         case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
7272         case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
7273         case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
7274         case BFD_RELOC_AARCH64_LDST128_LO12:
7275         case BFD_RELOC_AARCH64_LDST16_LO12:
7276         case BFD_RELOC_AARCH64_LDST32_LO12:
7277         case BFD_RELOC_AARCH64_LDST64_LO12:
7278         case BFD_RELOC_AARCH64_LDST8_LO12:
7279         case BFD_RELOC_AARCH64_LD_LO19_PCREL:
7280           if (h == NULL || bfd_link_pic (info))
7281             break;
7282           /* Fall through.  */
7283
7284         case BFD_RELOC_AARCH64_NN:
7285
7286           /* We don't need to handle relocs into sections not going into
7287              the "real" output.  */
7288           if ((sec->flags & SEC_ALLOC) == 0)
7289             break;
7290
7291           if (h != NULL)
7292             {
7293               if (!bfd_link_pic (info))
7294                 h->non_got_ref = 1;
7295
7296               h->plt.refcount += 1;
7297               h->pointer_equality_needed = 1;
7298             }
7299
7300           /* No need to do anything if we're not creating a shared
7301              object.  */
7302           if (!(bfd_link_pic (info)
7303                 /* If on the other hand, we are creating an executable, we
7304                    may need to keep relocations for symbols satisfied by a
7305                    dynamic library if we manage to avoid copy relocs for the
7306                    symbol.
7307
7308                    NOTE: Currently, there is no support of copy relocs
7309                    elimination on pc-relative relocation types, because there is
7310                    no dynamic relocation support for them in glibc.  We still
7311                    record the dynamic symbol reference for them.  This is
7312                    because one symbol may be referenced by both absolute
7313                    relocation (for example, BFD_RELOC_AARCH64_NN) and
7314                    pc-relative relocation.  We need full symbol reference
7315                    information to make correct decision later in
7316                    elfNN_aarch64_adjust_dynamic_symbol.  */
7317                 || (ELIMINATE_COPY_RELOCS
7318                     && !bfd_link_pic (info)
7319                     && h != NULL
7320                     && (h->root.type == bfd_link_hash_defweak
7321                         || !h->def_regular))))
7322             break;
7323
7324           {
7325             struct elf_dyn_relocs *p;
7326             struct elf_dyn_relocs **head;
7327             int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7328
7329             /* We must copy these reloc types into the output file.
7330                Create a reloc section in dynobj and make room for
7331                this reloc.  */
7332             if (sreloc == NULL)
7333               {
7334                 if (htab->root.dynobj == NULL)
7335                   htab->root.dynobj = abfd;
7336
7337                 sreloc = _bfd_elf_make_dynamic_reloc_section
7338                   (sec, htab->root.dynobj, LOG_FILE_ALIGN, abfd, /*rela? */ TRUE);
7339
7340                 if (sreloc == NULL)
7341                   return FALSE;
7342               }
7343
7344             /* If this is a global symbol, we count the number of
7345                relocations we need for this symbol.  */
7346             if (h != NULL)
7347               {
7348                 struct elf_aarch64_link_hash_entry *eh;
7349                 eh = (struct elf_aarch64_link_hash_entry *) h;
7350                 head = &eh->dyn_relocs;
7351               }
7352             else
7353               {
7354                 /* Track dynamic relocs needed for local syms too.
7355                    We really need local syms available to do this
7356                    easily.  Oh well.  */
7357
7358                 asection *s;
7359                 void **vpp;
7360
7361                 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
7362                                               abfd, r_symndx);
7363                 if (isym == NULL)
7364                   return FALSE;
7365
7366                 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
7367                 if (s == NULL)
7368                   s = sec;
7369
7370                 /* Beware of type punned pointers vs strict aliasing
7371                    rules.  */
7372                 vpp = &(elf_section_data (s)->local_dynrel);
7373                 head = (struct elf_dyn_relocs **) vpp;
7374               }
7375
7376             p = *head;
7377             if (p == NULL || p->sec != sec)
7378               {
7379                 bfd_size_type amt = sizeof *p;
7380                 p = ((struct elf_dyn_relocs *)
7381                      bfd_zalloc (htab->root.dynobj, amt));
7382                 if (p == NULL)
7383                   return FALSE;
7384                 p->next = *head;
7385                 *head = p;
7386                 p->sec = sec;
7387               }
7388
7389             p->count += 1;
7390
7391             if (elfNN_aarch64_howto_table[howto_index].pc_relative)
7392               p->pc_count += 1;
7393           }
7394           break;
7395
7396           /* RR: We probably want to keep a consistency check that
7397              there are no dangling GOT_PAGE relocs.  */
7398         case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
7399         case BFD_RELOC_AARCH64_GOT_LD_PREL19:
7400         case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
7401         case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
7402         case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
7403         case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
7404         case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
7405         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
7406         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
7407         case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
7408         case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
7409         case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
7410         case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
7411         case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
7412         case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
7413         case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
7414         case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
7415         case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
7416         case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
7417         case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
7418         case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
7419         case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
7420         case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
7421         case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
7422         case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
7423         case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
7424         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
7425         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
7426         case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
7427         case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
7428         case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
7429         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
7430         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
7431         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
7432           {
7433             unsigned got_type;
7434             unsigned old_got_type;
7435
7436             got_type = aarch64_reloc_got_type (bfd_r_type);
7437
7438             if (h)
7439               {
7440                 h->got.refcount += 1;
7441                 old_got_type = elf_aarch64_hash_entry (h)->got_type;
7442               }
7443             else
7444               {
7445                 struct elf_aarch64_local_symbol *locals;
7446
7447                 if (!elfNN_aarch64_allocate_local_symbols
7448                     (abfd, symtab_hdr->sh_info))
7449                   return FALSE;
7450
7451                 locals = elf_aarch64_locals (abfd);
7452                 BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7453                 locals[r_symndx].got_refcount += 1;
7454                 old_got_type = locals[r_symndx].got_type;
7455               }
7456
7457             /* If a variable is accessed with both general dynamic TLS
7458                methods, two slots may be created.  */
7459             if (GOT_TLS_GD_ANY_P (old_got_type) && GOT_TLS_GD_ANY_P (got_type))
7460               got_type |= old_got_type;
7461
7462             /* We will already have issued an error message if there
7463                is a TLS/non-TLS mismatch, based on the symbol type.
7464                So just combine any TLS types needed.  */
7465             if (old_got_type != GOT_UNKNOWN && old_got_type != GOT_NORMAL
7466                 && got_type != GOT_NORMAL)
7467               got_type |= old_got_type;
7468
7469             /* If the symbol is accessed by both IE and GD methods, we
7470                are able to relax.  Turn off the GD flag, without
7471                messing up with any other kind of TLS types that may be
7472                involved.  */
7473             if ((got_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (got_type))
7474               got_type &= ~ (GOT_TLSDESC_GD | GOT_TLS_GD);
7475
7476             if (old_got_type != got_type)
7477               {
7478                 if (h != NULL)
7479                   elf_aarch64_hash_entry (h)->got_type = got_type;
7480                 else
7481                   {
7482                     struct elf_aarch64_local_symbol *locals;
7483                     locals = elf_aarch64_locals (abfd);
7484                     BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7485                     locals[r_symndx].got_type = got_type;
7486                   }
7487               }
7488
7489             if (htab->root.dynobj == NULL)
7490               htab->root.dynobj = abfd;
7491             if (! aarch64_elf_create_got_section (htab->root.dynobj, info))
7492               return FALSE;
7493             break;
7494           }
7495
7496         case BFD_RELOC_AARCH64_CALL26:
7497         case BFD_RELOC_AARCH64_JUMP26:
7498           /* If this is a local symbol then we resolve it
7499              directly without creating a PLT entry.  */
7500           if (h == NULL)
7501             continue;
7502
7503           h->needs_plt = 1;
7504           if (h->plt.refcount <= 0)
7505             h->plt.refcount = 1;
7506           else
7507             h->plt.refcount += 1;
7508           break;
7509
7510         default:
7511           break;
7512         }
7513     }
7514
7515   return TRUE;
7516 }
7517
7518 /* Treat mapping symbols as special target symbols.  */
7519
7520 static bfd_boolean
7521 elfNN_aarch64_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED,
7522                                         asymbol *sym)
7523 {
7524   return bfd_is_aarch64_special_symbol_name (sym->name,
7525                                              BFD_AARCH64_SPECIAL_SYM_TYPE_ANY);
7526 }
7527
7528 /* This is a copy of elf_find_function () from elf.c except that
7529    AArch64 mapping symbols are ignored when looking for function names.  */
7530
7531 static bfd_boolean
7532 aarch64_elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
7533                            asymbol **symbols,
7534                            asection *section,
7535                            bfd_vma offset,
7536                            const char **filename_ptr,
7537                            const char **functionname_ptr)
7538 {
7539   const char *filename = NULL;
7540   asymbol *func = NULL;
7541   bfd_vma low_func = 0;
7542   asymbol **p;
7543
7544   for (p = symbols; *p != NULL; p++)
7545     {
7546       elf_symbol_type *q;
7547
7548       q = (elf_symbol_type *) * p;
7549
7550       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
7551         {
7552         default:
7553           break;
7554         case STT_FILE:
7555           filename = bfd_asymbol_name (&q->symbol);
7556           break;
7557         case STT_FUNC:
7558         case STT_NOTYPE:
7559           /* Skip mapping symbols.  */
7560           if ((q->symbol.flags & BSF_LOCAL)
7561               && (bfd_is_aarch64_special_symbol_name
7562                   (q->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY)))
7563             continue;
7564           /* Fall through.  */
7565           if (bfd_get_section (&q->symbol) == section
7566               && q->symbol.value >= low_func && q->symbol.value <= offset)
7567             {
7568               func = (asymbol *) q;
7569               low_func = q->symbol.value;
7570             }
7571           break;
7572         }
7573     }
7574
7575   if (func == NULL)
7576     return FALSE;
7577
7578   if (filename_ptr)
7579     *filename_ptr = filename;
7580   if (functionname_ptr)
7581     *functionname_ptr = bfd_asymbol_name (func);
7582
7583   return TRUE;
7584 }
7585
7586
7587 /* Find the nearest line to a particular section and offset, for error
7588    reporting.   This code is a duplicate of the code in elf.c, except
7589    that it uses aarch64_elf_find_function.  */
7590
7591 static bfd_boolean
7592 elfNN_aarch64_find_nearest_line (bfd *abfd,
7593                                  asymbol **symbols,
7594                                  asection *section,
7595                                  bfd_vma offset,
7596                                  const char **filename_ptr,
7597                                  const char **functionname_ptr,
7598                                  unsigned int *line_ptr,
7599                                  unsigned int *discriminator_ptr)
7600 {
7601   bfd_boolean found = FALSE;
7602
7603   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
7604                                      filename_ptr, functionname_ptr,
7605                                      line_ptr, discriminator_ptr,
7606                                      dwarf_debug_sections, 0,
7607                                      &elf_tdata (abfd)->dwarf2_find_line_info))
7608     {
7609       if (!*functionname_ptr)
7610         aarch64_elf_find_function (abfd, symbols, section, offset,
7611                                    *filename_ptr ? NULL : filename_ptr,
7612                                    functionname_ptr);
7613
7614       return TRUE;
7615     }
7616
7617   /* Skip _bfd_dwarf1_find_nearest_line since no known AArch64
7618      toolchain uses DWARF1.  */
7619
7620   if (!_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
7621                                             &found, filename_ptr,
7622                                             functionname_ptr, line_ptr,
7623                                             &elf_tdata (abfd)->line_info))
7624     return FALSE;
7625
7626   if (found && (*functionname_ptr || *line_ptr))
7627     return TRUE;
7628
7629   if (symbols == NULL)
7630     return FALSE;
7631
7632   if (!aarch64_elf_find_function (abfd, symbols, section, offset,
7633                                   filename_ptr, functionname_ptr))
7634     return FALSE;
7635
7636   *line_ptr = 0;
7637   return TRUE;
7638 }
7639
7640 static bfd_boolean
7641 elfNN_aarch64_find_inliner_info (bfd *abfd,
7642                                  const char **filename_ptr,
7643                                  const char **functionname_ptr,
7644                                  unsigned int *line_ptr)
7645 {
7646   bfd_boolean found;
7647   found = _bfd_dwarf2_find_inliner_info
7648     (abfd, filename_ptr,
7649      functionname_ptr, line_ptr, &elf_tdata (abfd)->dwarf2_find_line_info);
7650   return found;
7651 }
7652
7653
7654 static void
7655 elfNN_aarch64_post_process_headers (bfd *abfd,
7656                                     struct bfd_link_info *link_info)
7657 {
7658   Elf_Internal_Ehdr *i_ehdrp;   /* ELF file header, internal form.  */
7659
7660   i_ehdrp = elf_elfheader (abfd);
7661   i_ehdrp->e_ident[EI_ABIVERSION] = AARCH64_ELF_ABI_VERSION;
7662
7663   _bfd_elf_post_process_headers (abfd, link_info);
7664 }
7665
7666 static enum elf_reloc_type_class
7667 elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
7668                                 const asection *rel_sec ATTRIBUTE_UNUSED,
7669                                 const Elf_Internal_Rela *rela)
7670 {
7671   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
7672
7673   if (htab->root.dynsym != NULL
7674       && htab->root.dynsym->contents != NULL)
7675     {
7676       /* Check relocation against STT_GNU_IFUNC symbol if there are
7677          dynamic symbols.  */
7678       bfd *abfd = info->output_bfd;
7679       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7680       unsigned long r_symndx = ELFNN_R_SYM (rela->r_info);
7681       if (r_symndx != STN_UNDEF)
7682         {
7683           Elf_Internal_Sym sym;
7684           if (!bed->s->swap_symbol_in (abfd,
7685                                        (htab->root.dynsym->contents
7686                                         + r_symndx * bed->s->sizeof_sym),
7687                                        0, &sym))
7688             {
7689               /* xgettext:c-format */
7690               _bfd_error_handler (_("%pB symbol number %lu references"
7691                                     " nonexistent SHT_SYMTAB_SHNDX section"),
7692                                     abfd, r_symndx);
7693               /* Ideally an error class should be returned here.  */
7694             }
7695           else if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
7696             return reloc_class_ifunc;
7697         }
7698     }
7699
7700   switch ((int) ELFNN_R_TYPE (rela->r_info))
7701     {
7702     case AARCH64_R (IRELATIVE):
7703       return reloc_class_ifunc;
7704     case AARCH64_R (RELATIVE):
7705       return reloc_class_relative;
7706     case AARCH64_R (JUMP_SLOT):
7707       return reloc_class_plt;
7708     case AARCH64_R (COPY):
7709       return reloc_class_copy;
7710     default:
7711       return reloc_class_normal;
7712     }
7713 }
7714
7715 /* Handle an AArch64 specific section when reading an object file.  This is
7716    called when bfd_section_from_shdr finds a section with an unknown
7717    type.  */
7718
7719 static bfd_boolean
7720 elfNN_aarch64_section_from_shdr (bfd *abfd,
7721                                  Elf_Internal_Shdr *hdr,
7722                                  const char *name, int shindex)
7723 {
7724   /* There ought to be a place to keep ELF backend specific flags, but
7725      at the moment there isn't one.  We just keep track of the
7726      sections by their name, instead.  Fortunately, the ABI gives
7727      names for all the AArch64 specific sections, so we will probably get
7728      away with this.  */
7729   switch (hdr->sh_type)
7730     {
7731     case SHT_AARCH64_ATTRIBUTES:
7732       break;
7733
7734     default:
7735       return FALSE;
7736     }
7737
7738   if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7739     return FALSE;
7740
7741   return TRUE;
7742 }
7743
7744 /* A structure used to record a list of sections, independently
7745    of the next and prev fields in the asection structure.  */
7746 typedef struct section_list
7747 {
7748   asection *sec;
7749   struct section_list *next;
7750   struct section_list *prev;
7751 }
7752 section_list;
7753
7754 /* Unfortunately we need to keep a list of sections for which
7755    an _aarch64_elf_section_data structure has been allocated.  This
7756    is because it is possible for functions like elfNN_aarch64_write_section
7757    to be called on a section which has had an elf_data_structure
7758    allocated for it (and so the used_by_bfd field is valid) but
7759    for which the AArch64 extended version of this structure - the
7760    _aarch64_elf_section_data structure - has not been allocated.  */
7761 static section_list *sections_with_aarch64_elf_section_data = NULL;
7762
7763 static void
7764 record_section_with_aarch64_elf_section_data (asection *sec)
7765 {
7766   struct section_list *entry;
7767
7768   entry = bfd_malloc (sizeof (*entry));
7769   if (entry == NULL)
7770     return;
7771   entry->sec = sec;
7772   entry->next = sections_with_aarch64_elf_section_data;
7773   entry->prev = NULL;
7774   if (entry->next != NULL)
7775     entry->next->prev = entry;
7776   sections_with_aarch64_elf_section_data = entry;
7777 }
7778
7779 static struct section_list *
7780 find_aarch64_elf_section_entry (asection *sec)
7781 {
7782   struct section_list *entry;
7783   static struct section_list *last_entry = NULL;
7784
7785   /* This is a short cut for the typical case where the sections are added
7786      to the sections_with_aarch64_elf_section_data list in forward order and
7787      then looked up here in backwards order.  This makes a real difference
7788      to the ld-srec/sec64k.exp linker test.  */
7789   entry = sections_with_aarch64_elf_section_data;
7790   if (last_entry != NULL)
7791     {
7792       if (last_entry->sec == sec)
7793         entry = last_entry;
7794       else if (last_entry->next != NULL && last_entry->next->sec == sec)
7795         entry = last_entry->next;
7796     }
7797
7798   for (; entry; entry = entry->next)
7799     if (entry->sec == sec)
7800       break;
7801
7802   if (entry)
7803     /* Record the entry prior to this one - it is the entry we are
7804        most likely to want to locate next time.  Also this way if we
7805        have been called from
7806        unrecord_section_with_aarch64_elf_section_data () we will not
7807        be caching a pointer that is about to be freed.  */
7808     last_entry = entry->prev;
7809
7810   return entry;
7811 }
7812
7813 static void
7814 unrecord_section_with_aarch64_elf_section_data (asection *sec)
7815 {
7816   struct section_list *entry;
7817
7818   entry = find_aarch64_elf_section_entry (sec);
7819
7820   if (entry)
7821     {
7822       if (entry->prev != NULL)
7823         entry->prev->next = entry->next;
7824       if (entry->next != NULL)
7825         entry->next->prev = entry->prev;
7826       if (entry == sections_with_aarch64_elf_section_data)
7827         sections_with_aarch64_elf_section_data = entry->next;
7828       free (entry);
7829     }
7830 }
7831
7832
7833 typedef struct
7834 {
7835   void *finfo;
7836   struct bfd_link_info *info;
7837   asection *sec;
7838   int sec_shndx;
7839   int (*func) (void *, const char *, Elf_Internal_Sym *,
7840                asection *, struct elf_link_hash_entry *);
7841 } output_arch_syminfo;
7842
7843 enum map_symbol_type
7844 {
7845   AARCH64_MAP_INSN,
7846   AARCH64_MAP_DATA
7847 };
7848
7849
7850 /* Output a single mapping symbol.  */
7851
7852 static bfd_boolean
7853 elfNN_aarch64_output_map_sym (output_arch_syminfo *osi,
7854                               enum map_symbol_type type, bfd_vma offset)
7855 {
7856   static const char *names[2] = { "$x", "$d" };
7857   Elf_Internal_Sym sym;
7858
7859   sym.st_value = (osi->sec->output_section->vma
7860                   + osi->sec->output_offset + offset);
7861   sym.st_size = 0;
7862   sym.st_other = 0;
7863   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7864   sym.st_shndx = osi->sec_shndx;
7865   return osi->func (osi->finfo, names[type], &sym, osi->sec, NULL) == 1;
7866 }
7867
7868 /* Output a single local symbol for a generated stub.  */
7869
7870 static bfd_boolean
7871 elfNN_aarch64_output_stub_sym (output_arch_syminfo *osi, const char *name,
7872                                bfd_vma offset, bfd_vma size)
7873 {
7874   Elf_Internal_Sym sym;
7875
7876   sym.st_value = (osi->sec->output_section->vma
7877                   + osi->sec->output_offset + offset);
7878   sym.st_size = size;
7879   sym.st_other = 0;
7880   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7881   sym.st_shndx = osi->sec_shndx;
7882   return osi->func (osi->finfo, name, &sym, osi->sec, NULL) == 1;
7883 }
7884
7885 static bfd_boolean
7886 aarch64_map_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7887 {
7888   struct elf_aarch64_stub_hash_entry *stub_entry;
7889   asection *stub_sec;
7890   bfd_vma addr;
7891   char *stub_name;
7892   output_arch_syminfo *osi;
7893
7894   /* Massage our args to the form they really have.  */
7895   stub_entry = (struct elf_aarch64_stub_hash_entry *) gen_entry;
7896   osi = (output_arch_syminfo *) in_arg;
7897
7898   stub_sec = stub_entry->stub_sec;
7899
7900   /* Ensure this stub is attached to the current section being
7901      processed.  */
7902   if (stub_sec != osi->sec)
7903     return TRUE;
7904
7905   addr = (bfd_vma) stub_entry->stub_offset;
7906
7907   stub_name = stub_entry->output_name;
7908
7909   switch (stub_entry->stub_type)
7910     {
7911     case aarch64_stub_adrp_branch:
7912       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7913                                           sizeof (aarch64_adrp_branch_stub)))
7914         return FALSE;
7915       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7916         return FALSE;
7917       break;
7918     case aarch64_stub_long_branch:
7919       if (!elfNN_aarch64_output_stub_sym
7920           (osi, stub_name, addr, sizeof (aarch64_long_branch_stub)))
7921         return FALSE;
7922       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7923         return FALSE;
7924       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_DATA, addr + 16))
7925         return FALSE;
7926       break;
7927     case aarch64_stub_erratum_835769_veneer:
7928       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7929                                           sizeof (aarch64_erratum_835769_stub)))
7930         return FALSE;
7931       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7932         return FALSE;
7933       break;
7934     case aarch64_stub_erratum_843419_veneer:
7935       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7936                                           sizeof (aarch64_erratum_843419_stub)))
7937         return FALSE;
7938       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7939         return FALSE;
7940       break;
7941
7942     default:
7943       abort ();
7944     }
7945
7946   return TRUE;
7947 }
7948
7949 /* Output mapping symbols for linker generated sections.  */
7950
7951 static bfd_boolean
7952 elfNN_aarch64_output_arch_local_syms (bfd *output_bfd,
7953                                       struct bfd_link_info *info,
7954                                       void *finfo,
7955                                       int (*func) (void *, const char *,
7956                                                    Elf_Internal_Sym *,
7957                                                    asection *,
7958                                                    struct elf_link_hash_entry
7959                                                    *))
7960 {
7961   output_arch_syminfo osi;
7962   struct elf_aarch64_link_hash_table *htab;
7963
7964   htab = elf_aarch64_hash_table (info);
7965
7966   osi.finfo = finfo;
7967   osi.info = info;
7968   osi.func = func;
7969
7970   /* Long calls stubs.  */
7971   if (htab->stub_bfd && htab->stub_bfd->sections)
7972     {
7973       asection *stub_sec;
7974
7975       for (stub_sec = htab->stub_bfd->sections;
7976            stub_sec != NULL; stub_sec = stub_sec->next)
7977         {
7978           /* Ignore non-stub sections.  */
7979           if (!strstr (stub_sec->name, STUB_SUFFIX))
7980             continue;
7981
7982           osi.sec = stub_sec;
7983
7984           osi.sec_shndx = _bfd_elf_section_from_bfd_section
7985             (output_bfd, osi.sec->output_section);
7986
7987           /* The first instruction in a stub is always a branch.  */
7988           if (!elfNN_aarch64_output_map_sym (&osi, AARCH64_MAP_INSN, 0))
7989             return FALSE;
7990
7991           bfd_hash_traverse (&htab->stub_hash_table, aarch64_map_one_stub,
7992                              &osi);
7993         }
7994     }
7995
7996   /* Finally, output mapping symbols for the PLT.  */
7997   if (!htab->root.splt || htab->root.splt->size == 0)
7998     return TRUE;
7999
8000   osi.sec_shndx = _bfd_elf_section_from_bfd_section
8001     (output_bfd, htab->root.splt->output_section);
8002   osi.sec = htab->root.splt;
8003
8004   elfNN_aarch64_output_map_sym (&osi, AARCH64_MAP_INSN, 0);
8005
8006   return TRUE;
8007
8008 }
8009
8010 /* Allocate target specific section data.  */
8011
8012 static bfd_boolean
8013 elfNN_aarch64_new_section_hook (bfd *abfd, asection *sec)
8014 {
8015   if (!sec->used_by_bfd)
8016     {
8017       _aarch64_elf_section_data *sdata;
8018       bfd_size_type amt = sizeof (*sdata);
8019
8020       sdata = bfd_zalloc (abfd, amt);
8021       if (sdata == NULL)
8022         return FALSE;
8023       sec->used_by_bfd = sdata;
8024     }
8025
8026   record_section_with_aarch64_elf_section_data (sec);
8027
8028   return _bfd_elf_new_section_hook (abfd, sec);
8029 }
8030
8031
8032 static void
8033 unrecord_section_via_map_over_sections (bfd *abfd ATTRIBUTE_UNUSED,
8034                                         asection *sec,
8035                                         void *ignore ATTRIBUTE_UNUSED)
8036 {
8037   unrecord_section_with_aarch64_elf_section_data (sec);
8038 }
8039
8040 static bfd_boolean
8041 elfNN_aarch64_close_and_cleanup (bfd *abfd)
8042 {
8043   if (abfd->sections)
8044     bfd_map_over_sections (abfd,
8045                            unrecord_section_via_map_over_sections, NULL);
8046
8047   return _bfd_elf_close_and_cleanup (abfd);
8048 }
8049
8050 static bfd_boolean
8051 elfNN_aarch64_bfd_free_cached_info (bfd *abfd)
8052 {
8053   if (abfd->sections)
8054     bfd_map_over_sections (abfd,
8055                            unrecord_section_via_map_over_sections, NULL);
8056
8057   return _bfd_free_cached_info (abfd);
8058 }
8059
8060 /* Create dynamic sections. This is different from the ARM backend in that
8061    the got, plt, gotplt and their relocation sections are all created in the
8062    standard part of the bfd elf backend.  */
8063
8064 static bfd_boolean
8065 elfNN_aarch64_create_dynamic_sections (bfd *dynobj,
8066                                        struct bfd_link_info *info)
8067 {
8068   /* We need to create .got section.  */
8069   if (!aarch64_elf_create_got_section (dynobj, info))
8070     return FALSE;
8071
8072   return _bfd_elf_create_dynamic_sections (dynobj, info);
8073 }
8074
8075
8076 /* Allocate space in .plt, .got and associated reloc sections for
8077    dynamic relocs.  */
8078
8079 static bfd_boolean
8080 elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8081 {
8082   struct bfd_link_info *info;
8083   struct elf_aarch64_link_hash_table *htab;
8084   struct elf_aarch64_link_hash_entry *eh;
8085   struct elf_dyn_relocs *p;
8086
8087   /* An example of a bfd_link_hash_indirect symbol is versioned
8088      symbol. For example: __gxx_personality_v0(bfd_link_hash_indirect)
8089      -> __gxx_personality_v0(bfd_link_hash_defined)
8090
8091      There is no need to process bfd_link_hash_indirect symbols here
8092      because we will also be presented with the concrete instance of
8093      the symbol and elfNN_aarch64_copy_indirect_symbol () will have been
8094      called to copy all relevant data from the generic to the concrete
8095      symbol instance.  */
8096   if (h->root.type == bfd_link_hash_indirect)
8097     return TRUE;
8098
8099   if (h->root.type == bfd_link_hash_warning)
8100     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8101
8102   info = (struct bfd_link_info *) inf;
8103   htab = elf_aarch64_hash_table (info);
8104
8105   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
8106      here if it is defined and referenced in a non-shared object.  */
8107   if (h->type == STT_GNU_IFUNC
8108       && h->def_regular)
8109     return TRUE;
8110   else if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
8111     {
8112       /* Make sure this symbol is output as a dynamic symbol.
8113          Undefined weak syms won't yet be marked as dynamic.  */
8114       if (h->dynindx == -1 && !h->forced_local
8115           && h->root.type == bfd_link_hash_undefweak)
8116         {
8117           if (!bfd_elf_link_record_dynamic_symbol (info, h))
8118             return FALSE;
8119         }
8120
8121       if (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
8122         {
8123           asection *s = htab->root.splt;
8124
8125           /* If this is the first .plt entry, make room for the special
8126              first entry.  */
8127           if (s->size == 0)
8128             s->size += htab->plt_header_size;
8129
8130           h->plt.offset = s->size;
8131
8132           /* If this symbol is not defined in a regular file, and we are
8133              not generating a shared library, then set the symbol to this
8134              location in the .plt.  This is required to make function
8135              pointers compare as equal between the normal executable and
8136              the shared library.  */
8137           if (!bfd_link_pic (info) && !h->def_regular)
8138             {
8139               h->root.u.def.section = s;
8140               h->root.u.def.value = h->plt.offset;
8141             }
8142
8143           /* Make room for this entry. For now we only create the
8144              small model PLT entries. We later need to find a way
8145              of relaxing into these from the large model PLT entries.  */
8146           s->size += PLT_SMALL_ENTRY_SIZE;
8147
8148           /* We also need to make an entry in the .got.plt section, which
8149              will be placed in the .got section by the linker script.  */
8150           htab->root.sgotplt->size += GOT_ENTRY_SIZE;
8151
8152           /* We also need to make an entry in the .rela.plt section.  */
8153           htab->root.srelplt->size += RELOC_SIZE (htab);
8154
8155           /* We need to ensure that all GOT entries that serve the PLT
8156              are consecutive with the special GOT slots [0] [1] and
8157              [2]. Any addtional relocations, such as
8158              R_AARCH64_TLSDESC, must be placed after the PLT related
8159              entries.  We abuse the reloc_count such that during
8160              sizing we adjust reloc_count to indicate the number of
8161              PLT related reserved entries.  In subsequent phases when
8162              filling in the contents of the reloc entries, PLT related
8163              entries are placed by computing their PLT index (0
8164              .. reloc_count). While other none PLT relocs are placed
8165              at the slot indicated by reloc_count and reloc_count is
8166              updated.  */
8167
8168           htab->root.srelplt->reloc_count++;
8169         }
8170       else
8171         {
8172           h->plt.offset = (bfd_vma) - 1;
8173           h->needs_plt = 0;
8174         }
8175     }
8176   else
8177     {
8178       h->plt.offset = (bfd_vma) - 1;
8179       h->needs_plt = 0;
8180     }
8181
8182   eh = (struct elf_aarch64_link_hash_entry *) h;
8183   eh->tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
8184
8185   if (h->got.refcount > 0)
8186     {
8187       bfd_boolean dyn;
8188       unsigned got_type = elf_aarch64_hash_entry (h)->got_type;
8189
8190       h->got.offset = (bfd_vma) - 1;
8191
8192       dyn = htab->root.dynamic_sections_created;
8193
8194       /* Make sure this symbol is output as a dynamic symbol.
8195          Undefined weak syms won't yet be marked as dynamic.  */
8196       if (dyn && h->dynindx == -1 && !h->forced_local
8197           && h->root.type == bfd_link_hash_undefweak)
8198         {
8199           if (!bfd_elf_link_record_dynamic_symbol (info, h))
8200             return FALSE;
8201         }
8202
8203       if (got_type == GOT_UNKNOWN)
8204         {
8205         }
8206       else if (got_type == GOT_NORMAL)
8207         {
8208           h->got.offset = htab->root.sgot->size;
8209           htab->root.sgot->size += GOT_ENTRY_SIZE;
8210           if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8211                || h->root.type != bfd_link_hash_undefweak)
8212               && (bfd_link_pic (info)
8213                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
8214               /* Undefined weak symbol in static PIE resolves to 0 without
8215                  any dynamic relocations.  */
8216               && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8217             {
8218               htab->root.srelgot->size += RELOC_SIZE (htab);
8219             }
8220         }
8221       else
8222         {
8223           int indx;
8224           if (got_type & GOT_TLSDESC_GD)
8225             {
8226               eh->tlsdesc_got_jump_table_offset =
8227                 (htab->root.sgotplt->size
8228                  - aarch64_compute_jump_table_size (htab));
8229               htab->root.sgotplt->size += GOT_ENTRY_SIZE * 2;
8230               h->got.offset = (bfd_vma) - 2;
8231             }
8232
8233           if (got_type & GOT_TLS_GD)
8234             {
8235               h->got.offset = htab->root.sgot->size;
8236               htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
8237             }
8238
8239           if (got_type & GOT_TLS_IE)
8240             {
8241               h->got.offset = htab->root.sgot->size;
8242               htab->root.sgot->size += GOT_ENTRY_SIZE;
8243             }
8244
8245           indx = h && h->dynindx != -1 ? h->dynindx : 0;
8246           if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8247                || h->root.type != bfd_link_hash_undefweak)
8248               && (!bfd_link_executable (info)
8249                   || indx != 0
8250                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
8251             {
8252               if (got_type & GOT_TLSDESC_GD)
8253                 {
8254                   htab->root.srelplt->size += RELOC_SIZE (htab);
8255                   /* Note reloc_count not incremented here!  We have
8256                      already adjusted reloc_count for this relocation
8257                      type.  */
8258
8259                   /* TLSDESC PLT is now needed, but not yet determined.  */
8260                   htab->tlsdesc_plt = (bfd_vma) - 1;
8261                 }
8262
8263               if (got_type & GOT_TLS_GD)
8264                 htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
8265
8266               if (got_type & GOT_TLS_IE)
8267                 htab->root.srelgot->size += RELOC_SIZE (htab);
8268             }
8269         }
8270     }
8271   else
8272     {
8273       h->got.offset = (bfd_vma) - 1;
8274     }
8275
8276   if (eh->dyn_relocs == NULL)
8277     return TRUE;
8278
8279   /* In the shared -Bsymbolic case, discard space allocated for
8280      dynamic pc-relative relocs against symbols which turn out to be
8281      defined in regular objects.  For the normal shared case, discard
8282      space for pc-relative relocs that have become local due to symbol
8283      visibility changes.  */
8284
8285   if (bfd_link_pic (info))
8286     {
8287       /* Relocs that use pc_count are those that appear on a call
8288          insn, or certain REL relocs that can generated via assembly.
8289          We want calls to protected symbols to resolve directly to the
8290          function rather than going via the plt.  If people want
8291          function pointer comparisons to work as expected then they
8292          should avoid writing weird assembly.  */
8293       if (SYMBOL_CALLS_LOCAL (info, h))
8294         {
8295           struct elf_dyn_relocs **pp;
8296
8297           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
8298             {
8299               p->count -= p->pc_count;
8300               p->pc_count = 0;
8301               if (p->count == 0)
8302                 *pp = p->next;
8303               else
8304                 pp = &p->next;
8305             }
8306         }
8307
8308       /* Also discard relocs on undefined weak syms with non-default
8309          visibility.  */
8310       if (eh->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak)
8311         {
8312           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
8313               || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8314             eh->dyn_relocs = NULL;
8315
8316           /* Make sure undefined weak symbols are output as a dynamic
8317              symbol in PIEs.  */
8318           else if (h->dynindx == -1
8319                    && !h->forced_local
8320                    && h->root.type == bfd_link_hash_undefweak
8321                    && !bfd_elf_link_record_dynamic_symbol (info, h))
8322             return FALSE;
8323         }
8324
8325     }
8326   else if (ELIMINATE_COPY_RELOCS)
8327     {
8328       /* For the non-shared case, discard space for relocs against
8329          symbols which turn out to need copy relocs or are not
8330          dynamic.  */
8331
8332       if (!h->non_got_ref
8333           && ((h->def_dynamic
8334                && !h->def_regular)
8335               || (htab->root.dynamic_sections_created
8336                   && (h->root.type == bfd_link_hash_undefweak
8337                       || h->root.type == bfd_link_hash_undefined))))
8338         {
8339           /* Make sure this symbol is output as a dynamic symbol.
8340              Undefined weak syms won't yet be marked as dynamic.  */
8341           if (h->dynindx == -1
8342               && !h->forced_local
8343               && h->root.type == bfd_link_hash_undefweak
8344               && !bfd_elf_link_record_dynamic_symbol (info, h))
8345             return FALSE;
8346
8347           /* If that succeeded, we know we'll be keeping all the
8348              relocs.  */
8349           if (h->dynindx != -1)
8350             goto keep;
8351         }
8352
8353       eh->dyn_relocs = NULL;
8354
8355     keep:;
8356     }
8357
8358   /* Finally, allocate space.  */
8359   for (p = eh->dyn_relocs; p != NULL; p = p->next)
8360     {
8361       asection *sreloc;
8362
8363       sreloc = elf_section_data (p->sec)->sreloc;
8364
8365       BFD_ASSERT (sreloc != NULL);
8366
8367       sreloc->size += p->count * RELOC_SIZE (htab);
8368     }
8369
8370   return TRUE;
8371 }
8372
8373 /* Allocate space in .plt, .got and associated reloc sections for
8374    ifunc dynamic relocs.  */
8375
8376 static bfd_boolean
8377 elfNN_aarch64_allocate_ifunc_dynrelocs (struct elf_link_hash_entry *h,
8378                                         void *inf)
8379 {
8380   struct bfd_link_info *info;
8381   struct elf_aarch64_link_hash_table *htab;
8382   struct elf_aarch64_link_hash_entry *eh;
8383
8384   /* An example of a bfd_link_hash_indirect symbol is versioned
8385      symbol. For example: __gxx_personality_v0(bfd_link_hash_indirect)
8386      -> __gxx_personality_v0(bfd_link_hash_defined)
8387
8388      There is no need to process bfd_link_hash_indirect symbols here
8389      because we will also be presented with the concrete instance of
8390      the symbol and elfNN_aarch64_copy_indirect_symbol () will have been
8391      called to copy all relevant data from the generic to the concrete
8392      symbol instance.  */
8393   if (h->root.type == bfd_link_hash_indirect)
8394     return TRUE;
8395
8396   if (h->root.type == bfd_link_hash_warning)
8397     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8398
8399   info = (struct bfd_link_info *) inf;
8400   htab = elf_aarch64_hash_table (info);
8401
8402   eh = (struct elf_aarch64_link_hash_entry *) h;
8403
8404   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
8405      here if it is defined and referenced in a non-shared object.  */
8406   if (h->type == STT_GNU_IFUNC
8407       && h->def_regular)
8408     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
8409                                                &eh->dyn_relocs,
8410                                                NULL,
8411                                                htab->plt_entry_size,
8412                                                htab->plt_header_size,
8413                                                GOT_ENTRY_SIZE,
8414                                                FALSE);
8415   return TRUE;
8416 }
8417
8418 /* Allocate space in .plt, .got and associated reloc sections for
8419    local dynamic relocs.  */
8420
8421 static bfd_boolean
8422 elfNN_aarch64_allocate_local_dynrelocs (void **slot, void *inf)
8423 {
8424   struct elf_link_hash_entry *h
8425     = (struct elf_link_hash_entry *) *slot;
8426
8427   if (h->type != STT_GNU_IFUNC
8428       || !h->def_regular
8429       || !h->ref_regular
8430       || !h->forced_local
8431       || h->root.type != bfd_link_hash_defined)
8432     abort ();
8433
8434   return elfNN_aarch64_allocate_dynrelocs (h, inf);
8435 }
8436
8437 /* Allocate space in .plt, .got and associated reloc sections for
8438    local ifunc dynamic relocs.  */
8439
8440 static bfd_boolean
8441 elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf)
8442 {
8443   struct elf_link_hash_entry *h
8444     = (struct elf_link_hash_entry *) *slot;
8445
8446   if (h->type != STT_GNU_IFUNC
8447       || !h->def_regular
8448       || !h->ref_regular
8449       || !h->forced_local
8450       || h->root.type != bfd_link_hash_defined)
8451     abort ();
8452
8453   return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf);
8454 }
8455
8456 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
8457    read-only sections.  */
8458
8459 static bfd_boolean
8460 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
8461 {
8462   asection *sec;
8463
8464   if (h->root.type == bfd_link_hash_indirect)
8465     return TRUE;
8466
8467   sec = readonly_dynrelocs (h);
8468   if (sec != NULL)
8469     {
8470       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
8471
8472       info->flags |= DF_TEXTREL;
8473       info->callbacks->minfo
8474         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
8475          sec->owner, h->root.root.string, sec);
8476
8477       /* Not an error, just cut short the traversal.  */
8478       return FALSE;
8479     }
8480   return TRUE;
8481 }
8482
8483 /* This is the most important function of all . Innocuosly named
8484    though !  */
8485
8486 static bfd_boolean
8487 elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
8488                                      struct bfd_link_info *info)
8489 {
8490   struct elf_aarch64_link_hash_table *htab;
8491   bfd *dynobj;
8492   asection *s;
8493   bfd_boolean relocs;
8494   bfd *ibfd;
8495
8496   htab = elf_aarch64_hash_table ((info));
8497   dynobj = htab->root.dynobj;
8498
8499   BFD_ASSERT (dynobj != NULL);
8500
8501   if (htab->root.dynamic_sections_created)
8502     {
8503       if (bfd_link_executable (info) && !info->nointerp)
8504         {
8505           s = bfd_get_linker_section (dynobj, ".interp");
8506           if (s == NULL)
8507             abort ();
8508           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
8509           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
8510         }
8511     }
8512
8513   /* Set up .got offsets for local syms, and space for local dynamic
8514      relocs.  */
8515   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8516     {
8517       struct elf_aarch64_local_symbol *locals = NULL;
8518       Elf_Internal_Shdr *symtab_hdr;
8519       asection *srel;
8520       unsigned int i;
8521
8522       if (!is_aarch64_elf (ibfd))
8523         continue;
8524
8525       for (s = ibfd->sections; s != NULL; s = s->next)
8526         {
8527           struct elf_dyn_relocs *p;
8528
8529           for (p = (struct elf_dyn_relocs *)
8530                (elf_section_data (s)->local_dynrel); p != NULL; p = p->next)
8531             {
8532               if (!bfd_is_abs_section (p->sec)
8533                   && bfd_is_abs_section (p->sec->output_section))
8534                 {
8535                   /* Input section has been discarded, either because
8536                      it is a copy of a linkonce section or due to
8537                      linker script /DISCARD/, so we'll be discarding
8538                      the relocs too.  */
8539                 }
8540               else if (p->count != 0)
8541                 {
8542                   srel = elf_section_data (p->sec)->sreloc;
8543                   srel->size += p->count * RELOC_SIZE (htab);
8544                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
8545                     info->flags |= DF_TEXTREL;
8546                 }
8547             }
8548         }
8549
8550       locals = elf_aarch64_locals (ibfd);
8551       if (!locals)
8552         continue;
8553
8554       symtab_hdr = &elf_symtab_hdr (ibfd);
8555       srel = htab->root.srelgot;
8556       for (i = 0; i < symtab_hdr->sh_info; i++)
8557         {
8558           locals[i].got_offset = (bfd_vma) - 1;
8559           locals[i].tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
8560           if (locals[i].got_refcount > 0)
8561             {
8562               unsigned got_type = locals[i].got_type;
8563               if (got_type & GOT_TLSDESC_GD)
8564                 {
8565                   locals[i].tlsdesc_got_jump_table_offset =
8566                     (htab->root.sgotplt->size
8567                      - aarch64_compute_jump_table_size (htab));
8568                   htab->root.sgotplt->size += GOT_ENTRY_SIZE * 2;
8569                   locals[i].got_offset = (bfd_vma) - 2;
8570                 }
8571
8572               if (got_type & GOT_TLS_GD)
8573                 {
8574                   locals[i].got_offset = htab->root.sgot->size;
8575                   htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
8576                 }
8577
8578               if (got_type & GOT_TLS_IE
8579                   || got_type & GOT_NORMAL)
8580                 {
8581                   locals[i].got_offset = htab->root.sgot->size;
8582                   htab->root.sgot->size += GOT_ENTRY_SIZE;
8583                 }
8584
8585               if (got_type == GOT_UNKNOWN)
8586                 {
8587                 }
8588
8589               if (bfd_link_pic (info))
8590                 {
8591                   if (got_type & GOT_TLSDESC_GD)
8592                     {
8593                       htab->root.srelplt->size += RELOC_SIZE (htab);
8594                       /* Note RELOC_COUNT not incremented here! */
8595                       htab->tlsdesc_plt = (bfd_vma) - 1;
8596                     }
8597
8598                   if (got_type & GOT_TLS_GD)
8599                     htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
8600
8601                   if (got_type & GOT_TLS_IE
8602                       || got_type & GOT_NORMAL)
8603                     htab->root.srelgot->size += RELOC_SIZE (htab);
8604                 }
8605             }
8606           else
8607             {
8608               locals[i].got_refcount = (bfd_vma) - 1;
8609             }
8610         }
8611     }
8612
8613
8614   /* Allocate global sym .plt and .got entries, and space for global
8615      sym dynamic relocs.  */
8616   elf_link_hash_traverse (&htab->root, elfNN_aarch64_allocate_dynrelocs,
8617                           info);
8618
8619   /* Allocate global ifunc sym .plt and .got entries, and space for global
8620      ifunc sym dynamic relocs.  */
8621   elf_link_hash_traverse (&htab->root, elfNN_aarch64_allocate_ifunc_dynrelocs,
8622                           info);
8623
8624   /* Allocate .plt and .got entries, and space for local symbols.  */
8625   htab_traverse (htab->loc_hash_table,
8626                  elfNN_aarch64_allocate_local_dynrelocs,
8627                  info);
8628
8629   /* Allocate .plt and .got entries, and space for local ifunc symbols.  */
8630   htab_traverse (htab->loc_hash_table,
8631                  elfNN_aarch64_allocate_local_ifunc_dynrelocs,
8632                  info);
8633
8634   /* For every jump slot reserved in the sgotplt, reloc_count is
8635      incremented.  However, when we reserve space for TLS descriptors,
8636      it's not incremented, so in order to compute the space reserved
8637      for them, it suffices to multiply the reloc count by the jump
8638      slot size.  */
8639
8640   if (htab->root.srelplt)
8641     htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);
8642
8643   if (htab->tlsdesc_plt)
8644     {
8645       if (htab->root.splt->size == 0)
8646         htab->root.splt->size += PLT_ENTRY_SIZE;
8647
8648       htab->tlsdesc_plt = htab->root.splt->size;
8649       htab->root.splt->size += PLT_TLSDESC_ENTRY_SIZE;
8650
8651       /* If we're not using lazy TLS relocations, don't generate the
8652          GOT entry required.  */
8653       if (!(info->flags & DF_BIND_NOW))
8654         {
8655           htab->dt_tlsdesc_got = htab->root.sgot->size;
8656           htab->root.sgot->size += GOT_ENTRY_SIZE;
8657         }
8658     }
8659
8660   /* Init mapping symbols information to use later to distingush between
8661      code and data while scanning for errata.  */
8662   if (htab->fix_erratum_835769 || htab->fix_erratum_843419)
8663     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8664       {
8665         if (!is_aarch64_elf (ibfd))
8666           continue;
8667         bfd_elfNN_aarch64_init_maps (ibfd);
8668       }
8669
8670   /* We now have determined the sizes of the various dynamic sections.
8671      Allocate memory for them.  */
8672   relocs = FALSE;
8673   for (s = dynobj->sections; s != NULL; s = s->next)
8674     {
8675       if ((s->flags & SEC_LINKER_CREATED) == 0)
8676         continue;
8677
8678       if (s == htab->root.splt
8679           || s == htab->root.sgot
8680           || s == htab->root.sgotplt
8681           || s == htab->root.iplt
8682           || s == htab->root.igotplt
8683           || s == htab->root.sdynbss
8684           || s == htab->root.sdynrelro)
8685         {
8686           /* Strip this section if we don't need it; see the
8687              comment below.  */
8688         }
8689       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
8690         {
8691           if (s->size != 0 && s != htab->root.srelplt)
8692             relocs = TRUE;
8693
8694           /* We use the reloc_count field as a counter if we need
8695              to copy relocs into the output file.  */
8696           if (s != htab->root.srelplt)
8697             s->reloc_count = 0;
8698         }
8699       else
8700         {
8701           /* It's not one of our sections, so don't allocate space.  */
8702           continue;
8703         }
8704
8705       if (s->size == 0)
8706         {
8707           /* If we don't need this section, strip it from the
8708              output file.  This is mostly to handle .rela.bss and
8709              .rela.plt.  We must create both sections in
8710              create_dynamic_sections, because they must be created
8711              before the linker maps input sections to output
8712              sections.  The linker does that before
8713              adjust_dynamic_symbol is called, and it is that
8714              function which decides whether anything needs to go
8715              into these sections.  */
8716           s->flags |= SEC_EXCLUDE;
8717           continue;
8718         }
8719
8720       if ((s->flags & SEC_HAS_CONTENTS) == 0)
8721         continue;
8722
8723       /* Allocate memory for the section contents.  We use bfd_zalloc
8724          here in case unused entries are not reclaimed before the
8725          section's contents are written out.  This should not happen,
8726          but this way if it does, we get a R_AARCH64_NONE reloc instead
8727          of garbage.  */
8728       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
8729       if (s->contents == NULL)
8730         return FALSE;
8731     }
8732
8733   if (htab->root.dynamic_sections_created)
8734     {
8735       /* Add some entries to the .dynamic section.  We fill in the
8736          values later, in elfNN_aarch64_finish_dynamic_sections, but we
8737          must add the entries now so that we get the correct size for
8738          the .dynamic section.  The DT_DEBUG entry is filled in by the
8739          dynamic linker and used by the debugger.  */
8740 #define add_dynamic_entry(TAG, VAL)                     \
8741       _bfd_elf_add_dynamic_entry (info, TAG, VAL)
8742
8743       if (bfd_link_executable (info))
8744         {
8745           if (!add_dynamic_entry (DT_DEBUG, 0))
8746             return FALSE;
8747         }
8748
8749       if (htab->root.splt->size != 0)
8750         {
8751           if (!add_dynamic_entry (DT_PLTGOT, 0)
8752               || !add_dynamic_entry (DT_PLTRELSZ, 0)
8753               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
8754               || !add_dynamic_entry (DT_JMPREL, 0))
8755             return FALSE;
8756
8757           if (htab->tlsdesc_plt
8758               && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
8759                   || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
8760             return FALSE;
8761         }
8762
8763       if (relocs)
8764         {
8765           if (!add_dynamic_entry (DT_RELA, 0)
8766               || !add_dynamic_entry (DT_RELASZ, 0)
8767               || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
8768             return FALSE;
8769
8770           /* If any dynamic relocs apply to a read-only section,
8771              then we need a DT_TEXTREL entry.  */
8772           if ((info->flags & DF_TEXTREL) == 0)
8773             elf_link_hash_traverse (&htab->root, maybe_set_textrel, info);
8774
8775           if ((info->flags & DF_TEXTREL) != 0)
8776             {
8777               if (!add_dynamic_entry (DT_TEXTREL, 0))
8778                 return FALSE;
8779             }
8780         }
8781     }
8782 #undef add_dynamic_entry
8783
8784   return TRUE;
8785 }
8786
8787 static inline void
8788 elf_aarch64_update_plt_entry (bfd *output_bfd,
8789                               bfd_reloc_code_real_type r_type,
8790                               bfd_byte *plt_entry, bfd_vma value)
8791 {
8792   reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (r_type);
8793
8794   /* FIXME: We should check the return value from this function call.  */
8795   (void) _bfd_aarch64_elf_put_addend (output_bfd, plt_entry, r_type, howto, value);
8796 }
8797
8798 static void
8799 elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
8800                                        struct elf_aarch64_link_hash_table
8801                                        *htab, bfd *output_bfd,
8802                                        struct bfd_link_info *info)
8803 {
8804   bfd_byte *plt_entry;
8805   bfd_vma plt_index;
8806   bfd_vma got_offset;
8807   bfd_vma gotplt_entry_address;
8808   bfd_vma plt_entry_address;
8809   Elf_Internal_Rela rela;
8810   bfd_byte *loc;
8811   asection *plt, *gotplt, *relplt;
8812
8813   /* When building a static executable, use .iplt, .igot.plt and
8814      .rela.iplt sections for STT_GNU_IFUNC symbols.  */
8815   if (htab->root.splt != NULL)
8816     {
8817       plt = htab->root.splt;
8818       gotplt = htab->root.sgotplt;
8819       relplt = htab->root.srelplt;
8820     }
8821   else
8822     {
8823       plt = htab->root.iplt;
8824       gotplt = htab->root.igotplt;
8825       relplt = htab->root.irelplt;
8826     }
8827
8828   /* Get the index in the procedure linkage table which
8829      corresponds to this symbol.  This is the index of this symbol
8830      in all the symbols for which we are making plt entries.  The
8831      first entry in the procedure linkage table is reserved.
8832
8833      Get the offset into the .got table of the entry that
8834      corresponds to this function.      Each .got entry is GOT_ENTRY_SIZE
8835      bytes. The first three are reserved for the dynamic linker.
8836
8837      For static executables, we don't reserve anything.  */
8838
8839   if (plt == htab->root.splt)
8840     {
8841       plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
8842       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
8843     }
8844   else
8845     {
8846       plt_index = h->plt.offset / htab->plt_entry_size;
8847       got_offset = plt_index * GOT_ENTRY_SIZE;
8848     }
8849
8850   plt_entry = plt->contents + h->plt.offset;
8851   plt_entry_address = plt->output_section->vma
8852     + plt->output_offset + h->plt.offset;
8853   gotplt_entry_address = gotplt->output_section->vma +
8854     gotplt->output_offset + got_offset;
8855
8856   /* Copy in the boiler-plate for the PLTn entry.  */
8857   memcpy (plt_entry, elfNN_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
8858
8859   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
8860      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
8861   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADR_HI21_PCREL,
8862                                 plt_entry,
8863                                 PG (gotplt_entry_address) -
8864                                 PG (plt_entry_address));
8865
8866   /* Fill in the lo12 bits for the load from the pltgot.  */
8867   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12,
8868                                 plt_entry + 4,
8869                                 PG_OFFSET (gotplt_entry_address));
8870
8871   /* Fill in the lo12 bits for the add from the pltgot entry.  */
8872   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12,
8873                                 plt_entry + 8,
8874                                 PG_OFFSET (gotplt_entry_address));
8875
8876   /* All the GOTPLT Entries are essentially initialized to PLT0.  */
8877   bfd_put_NN (output_bfd,
8878               plt->output_section->vma + plt->output_offset,
8879               gotplt->contents + got_offset);
8880
8881   rela.r_offset = gotplt_entry_address;
8882
8883   if (h->dynindx == -1
8884       || ((bfd_link_executable (info)
8885            || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8886           && h->def_regular
8887           && h->type == STT_GNU_IFUNC))
8888     {
8889       /* If an STT_GNU_IFUNC symbol is locally defined, generate
8890          R_AARCH64_IRELATIVE instead of R_AARCH64_JUMP_SLOT.  */
8891       rela.r_info = ELFNN_R_INFO (0, AARCH64_R (IRELATIVE));
8892       rela.r_addend = (h->root.u.def.value
8893                        + h->root.u.def.section->output_section->vma
8894                        + h->root.u.def.section->output_offset);
8895     }
8896   else
8897     {
8898       /* Fill in the entry in the .rela.plt section.  */
8899       rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (JUMP_SLOT));
8900       rela.r_addend = 0;
8901     }
8902
8903   /* Compute the relocation entry to used based on PLT index and do
8904      not adjust reloc_count. The reloc_count has already been adjusted
8905      to account for this entry.  */
8906   loc = relplt->contents + plt_index * RELOC_SIZE (htab);
8907   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
8908 }
8909
8910 /* Size sections even though they're not dynamic.  We use it to setup
8911    _TLS_MODULE_BASE_, if needed.  */
8912
8913 static bfd_boolean
8914 elfNN_aarch64_always_size_sections (bfd *output_bfd,
8915                                     struct bfd_link_info *info)
8916 {
8917   asection *tls_sec;
8918
8919   if (bfd_link_relocatable (info))
8920     return TRUE;
8921
8922   tls_sec = elf_hash_table (info)->tls_sec;
8923
8924   if (tls_sec)
8925     {
8926       struct elf_link_hash_entry *tlsbase;
8927
8928       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
8929                                       "_TLS_MODULE_BASE_", TRUE, TRUE, FALSE);
8930
8931       if (tlsbase)
8932         {
8933           struct bfd_link_hash_entry *h = NULL;
8934           const struct elf_backend_data *bed =
8935             get_elf_backend_data (output_bfd);
8936
8937           if (!(_bfd_generic_link_add_one_symbol
8938                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
8939                  tls_sec, 0, NULL, FALSE, bed->collect, &h)))
8940             return FALSE;
8941
8942           tlsbase->type = STT_TLS;
8943           tlsbase = (struct elf_link_hash_entry *) h;
8944           tlsbase->def_regular = 1;
8945           tlsbase->other = STV_HIDDEN;
8946           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
8947         }
8948     }
8949
8950   return TRUE;
8951 }
8952
8953 /* Finish up dynamic symbol handling.  We set the contents of various
8954    dynamic sections here.  */
8955
8956 static bfd_boolean
8957 elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
8958                                      struct bfd_link_info *info,
8959                                      struct elf_link_hash_entry *h,
8960                                      Elf_Internal_Sym *sym)
8961 {
8962   struct elf_aarch64_link_hash_table *htab;
8963   htab = elf_aarch64_hash_table (info);
8964
8965   if (h->plt.offset != (bfd_vma) - 1)
8966     {
8967       asection *plt, *gotplt, *relplt;
8968
8969       /* This symbol has an entry in the procedure linkage table.  Set
8970          it up.  */
8971
8972       /* When building a static executable, use .iplt, .igot.plt and
8973          .rela.iplt sections for STT_GNU_IFUNC symbols.  */
8974       if (htab->root.splt != NULL)
8975         {
8976           plt = htab->root.splt;
8977           gotplt = htab->root.sgotplt;
8978           relplt = htab->root.srelplt;
8979         }
8980       else
8981         {
8982           plt = htab->root.iplt;
8983           gotplt = htab->root.igotplt;
8984           relplt = htab->root.irelplt;
8985         }
8986
8987       /* This symbol has an entry in the procedure linkage table.  Set
8988          it up.  */
8989       if ((h->dynindx == -1
8990            && !((h->forced_local || bfd_link_executable (info))
8991                 && h->def_regular
8992                 && h->type == STT_GNU_IFUNC))
8993           || plt == NULL
8994           || gotplt == NULL
8995           || relplt == NULL)
8996         return FALSE;
8997
8998       elfNN_aarch64_create_small_pltn_entry (h, htab, output_bfd, info);
8999       if (!h->def_regular)
9000         {
9001           /* Mark the symbol as undefined, rather than as defined in
9002              the .plt section.  */
9003           sym->st_shndx = SHN_UNDEF;
9004           /* If the symbol is weak we need to clear the value.
9005              Otherwise, the PLT entry would provide a definition for
9006              the symbol even if the symbol wasn't defined anywhere,
9007              and so the symbol would never be NULL.  Leave the value if
9008              there were any relocations where pointer equality matters
9009              (this is a clue for the dynamic linker, to make function
9010              pointer comparisons work between an application and shared
9011              library).  */
9012           if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
9013             sym->st_value = 0;
9014         }
9015     }
9016
9017   if (h->got.offset != (bfd_vma) - 1
9018       && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL
9019       /* Undefined weak symbol in static PIE resolves to 0 without
9020          any dynamic relocations.  */
9021       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9022     {
9023       Elf_Internal_Rela rela;
9024       bfd_byte *loc;
9025
9026       /* This symbol has an entry in the global offset table.  Set it
9027          up.  */
9028       if (htab->root.sgot == NULL || htab->root.srelgot == NULL)
9029         abort ();
9030
9031       rela.r_offset = (htab->root.sgot->output_section->vma
9032                        + htab->root.sgot->output_offset
9033                        + (h->got.offset & ~(bfd_vma) 1));
9034
9035       if (h->def_regular
9036           && h->type == STT_GNU_IFUNC)
9037         {
9038           if (bfd_link_pic (info))
9039             {
9040               /* Generate R_AARCH64_GLOB_DAT.  */
9041               goto do_glob_dat;
9042             }
9043           else
9044             {
9045               asection *plt;
9046
9047               if (!h->pointer_equality_needed)
9048                 abort ();
9049
9050               /* For non-shared object, we can't use .got.plt, which
9051                  contains the real function address if we need pointer
9052                  equality.  We load the GOT entry with the PLT entry.  */
9053               plt = htab->root.splt ? htab->root.splt : htab->root.iplt;
9054               bfd_put_NN (output_bfd, (plt->output_section->vma
9055                                        + plt->output_offset
9056                                        + h->plt.offset),
9057                           htab->root.sgot->contents
9058                           + (h->got.offset & ~(bfd_vma) 1));
9059               return TRUE;
9060             }
9061         }
9062       else if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
9063         {
9064           if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
9065             return FALSE;
9066
9067           BFD_ASSERT ((h->got.offset & 1) != 0);
9068           rela.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE));
9069           rela.r_addend = (h->root.u.def.value
9070                            + h->root.u.def.section->output_section->vma
9071                            + h->root.u.def.section->output_offset);
9072         }
9073       else
9074         {
9075 do_glob_dat:
9076           BFD_ASSERT ((h->got.offset & 1) == 0);
9077           bfd_put_NN (output_bfd, (bfd_vma) 0,
9078                       htab->root.sgot->contents + h->got.offset);
9079           rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT));
9080           rela.r_addend = 0;
9081         }
9082
9083       loc = htab->root.srelgot->contents;
9084       loc += htab->root.srelgot->reloc_count++ * RELOC_SIZE (htab);
9085       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
9086     }
9087
9088   if (h->needs_copy)
9089     {
9090       Elf_Internal_Rela rela;
9091       asection *s;
9092       bfd_byte *loc;
9093
9094       /* This symbol needs a copy reloc.  Set it up.  */
9095       if (h->dynindx == -1
9096           || (h->root.type != bfd_link_hash_defined
9097               && h->root.type != bfd_link_hash_defweak)
9098           || htab->root.srelbss == NULL)
9099         abort ();
9100
9101       rela.r_offset = (h->root.u.def.value
9102                        + h->root.u.def.section->output_section->vma
9103                        + h->root.u.def.section->output_offset);
9104       rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY));
9105       rela.r_addend = 0;
9106       if (h->root.u.def.section == htab->root.sdynrelro)
9107         s = htab->root.sreldynrelro;
9108       else
9109         s = htab->root.srelbss;
9110       loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
9111       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
9112     }
9113
9114   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  SYM may
9115      be NULL for local symbols.  */
9116   if (sym != NULL
9117       && (h == elf_hash_table (info)->hdynamic
9118           || h == elf_hash_table (info)->hgot))
9119     sym->st_shndx = SHN_ABS;
9120
9121   return TRUE;
9122 }
9123
9124 /* Finish up local dynamic symbol handling.  We set the contents of
9125    various dynamic sections here.  */
9126
9127 static bfd_boolean
9128 elfNN_aarch64_finish_local_dynamic_symbol (void **slot, void *inf)
9129 {
9130   struct elf_link_hash_entry *h
9131     = (struct elf_link_hash_entry *) *slot;
9132   struct bfd_link_info *info
9133     = (struct bfd_link_info *) inf;
9134
9135   return elfNN_aarch64_finish_dynamic_symbol (info->output_bfd,
9136                                               info, h, NULL);
9137 }
9138
9139 static void
9140 elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
9141                                      struct elf_aarch64_link_hash_table
9142                                      *htab)
9143 {
9144   /* Fill in PLT0. Fixme:RR Note this doesn't distinguish between
9145      small and large plts and at the minute just generates
9146      the small PLT.  */
9147
9148   /* PLT0 of the small PLT looks like this in ELF64 -
9149      stp x16, x30, [sp, #-16]!          // Save the reloc and lr on stack.
9150      adrp x16, PLT_GOT + 16             // Get the page base of the GOTPLT
9151      ldr  x17, [x16, #:lo12:PLT_GOT+16] // Load the address of the
9152                                         // symbol resolver
9153      add  x16, x16, #:lo12:PLT_GOT+16   // Load the lo12 bits of the
9154                                         // GOTPLT entry for this.
9155      br   x17
9156      PLT0 will be slightly different in ELF32 due to different got entry
9157      size.  */
9158   bfd_vma plt_got_2nd_ent;      /* Address of GOT[2].  */
9159   bfd_vma plt_base;
9160
9161
9162   memcpy (htab->root.splt->contents, elfNN_aarch64_small_plt0_entry,
9163           PLT_ENTRY_SIZE);
9164   elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize =
9165     PLT_ENTRY_SIZE;
9166
9167   plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma
9168                   + htab->root.sgotplt->output_offset
9169                   + GOT_ENTRY_SIZE * 2);
9170
9171   plt_base = htab->root.splt->output_section->vma +
9172     htab->root.splt->output_offset;
9173
9174   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
9175      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
9176   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9177                                 htab->root.splt->contents + 4,
9178                                 PG (plt_got_2nd_ent) - PG (plt_base + 4));
9179
9180   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12,
9181                                 htab->root.splt->contents + 8,
9182                                 PG_OFFSET (plt_got_2nd_ent));
9183
9184   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12,
9185                                 htab->root.splt->contents + 12,
9186                                 PG_OFFSET (plt_got_2nd_ent));
9187 }
9188
9189 static bfd_boolean
9190 elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
9191                                        struct bfd_link_info *info)
9192 {
9193   struct elf_aarch64_link_hash_table *htab;
9194   bfd *dynobj;
9195   asection *sdyn;
9196
9197   htab = elf_aarch64_hash_table (info);
9198   dynobj = htab->root.dynobj;
9199   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
9200
9201   if (htab->root.dynamic_sections_created)
9202     {
9203       ElfNN_External_Dyn *dyncon, *dynconend;
9204
9205       if (sdyn == NULL || htab->root.sgot == NULL)
9206         abort ();
9207
9208       dyncon = (ElfNN_External_Dyn *) sdyn->contents;
9209       dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
9210       for (; dyncon < dynconend; dyncon++)
9211         {
9212           Elf_Internal_Dyn dyn;
9213           asection *s;
9214
9215           bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
9216
9217           switch (dyn.d_tag)
9218             {
9219             default:
9220               continue;
9221
9222             case DT_PLTGOT:
9223               s = htab->root.sgotplt;
9224               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9225               break;
9226
9227             case DT_JMPREL:
9228               s = htab->root.srelplt;
9229               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9230               break;
9231
9232             case DT_PLTRELSZ:
9233               s = htab->root.srelplt;
9234               dyn.d_un.d_val = s->size;
9235               break;
9236
9237             case DT_TLSDESC_PLT:
9238               s = htab->root.splt;
9239               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
9240                 + htab->tlsdesc_plt;
9241               break;
9242
9243             case DT_TLSDESC_GOT:
9244               s = htab->root.sgot;
9245               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
9246                 + htab->dt_tlsdesc_got;
9247               break;
9248             }
9249
9250           bfd_elfNN_swap_dyn_out (output_bfd, &dyn, dyncon);
9251         }
9252
9253     }
9254
9255   /* Fill in the special first entry in the procedure linkage table.  */
9256   if (htab->root.splt && htab->root.splt->size > 0)
9257     {
9258       elfNN_aarch64_init_small_plt0_entry (output_bfd, htab);
9259
9260       elf_section_data (htab->root.splt->output_section)->
9261         this_hdr.sh_entsize = htab->plt_entry_size;
9262
9263
9264       if (htab->tlsdesc_plt)
9265         {
9266           bfd_put_NN (output_bfd, (bfd_vma) 0,
9267                       htab->root.sgot->contents + htab->dt_tlsdesc_got);
9268
9269           memcpy (htab->root.splt->contents + htab->tlsdesc_plt,
9270                   elfNN_aarch64_tlsdesc_small_plt_entry,
9271                   sizeof (elfNN_aarch64_tlsdesc_small_plt_entry));
9272
9273           {
9274             bfd_vma adrp1_addr =
9275               htab->root.splt->output_section->vma
9276               + htab->root.splt->output_offset + htab->tlsdesc_plt + 4;
9277
9278             bfd_vma adrp2_addr = adrp1_addr + 4;
9279
9280             bfd_vma got_addr =
9281               htab->root.sgot->output_section->vma
9282               + htab->root.sgot->output_offset;
9283
9284             bfd_vma pltgot_addr =
9285               htab->root.sgotplt->output_section->vma
9286               + htab->root.sgotplt->output_offset;
9287
9288             bfd_vma dt_tlsdesc_got = got_addr + htab->dt_tlsdesc_got;
9289
9290             bfd_byte *plt_entry =
9291               htab->root.splt->contents + htab->tlsdesc_plt;
9292
9293             /* adrp x2, DT_TLSDESC_GOT */
9294             elf_aarch64_update_plt_entry (output_bfd,
9295                                           BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9296                                           plt_entry + 4,
9297                                           (PG (dt_tlsdesc_got)
9298                                            - PG (adrp1_addr)));
9299
9300             /* adrp x3, 0 */
9301             elf_aarch64_update_plt_entry (output_bfd,
9302                                           BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9303                                           plt_entry + 8,
9304                                           (PG (pltgot_addr)
9305                                            - PG (adrp2_addr)));
9306
9307             /* ldr x2, [x2, #0] */
9308             elf_aarch64_update_plt_entry (output_bfd,
9309                                           BFD_RELOC_AARCH64_LDSTNN_LO12,
9310                                           plt_entry + 12,
9311                                           PG_OFFSET (dt_tlsdesc_got));
9312
9313             /* add x3, x3, 0 */
9314             elf_aarch64_update_plt_entry (output_bfd,
9315                                           BFD_RELOC_AARCH64_ADD_LO12,
9316                                           plt_entry + 16,
9317                                           PG_OFFSET (pltgot_addr));
9318           }
9319         }
9320     }
9321
9322   if (htab->root.sgotplt)
9323     {
9324       if (bfd_is_abs_section (htab->root.sgotplt->output_section))
9325         {
9326           _bfd_error_handler
9327             (_("discarded output section: `%pA'"), htab->root.sgotplt);
9328           return FALSE;
9329         }
9330
9331       /* Fill in the first three entries in the global offset table.  */
9332       if (htab->root.sgotplt->size > 0)
9333         {
9334           bfd_put_NN (output_bfd, (bfd_vma) 0, htab->root.sgotplt->contents);
9335
9336           /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
9337           bfd_put_NN (output_bfd,
9338                       (bfd_vma) 0,
9339                       htab->root.sgotplt->contents + GOT_ENTRY_SIZE);
9340           bfd_put_NN (output_bfd,
9341                       (bfd_vma) 0,
9342                       htab->root.sgotplt->contents + GOT_ENTRY_SIZE * 2);
9343         }
9344
9345       if (htab->root.sgot)
9346         {
9347           if (htab->root.sgot->size > 0)
9348             {
9349               bfd_vma addr =
9350                 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0;
9351               bfd_put_NN (output_bfd, addr, htab->root.sgot->contents);
9352             }
9353         }
9354
9355       elf_section_data (htab->root.sgotplt->output_section)->
9356         this_hdr.sh_entsize = GOT_ENTRY_SIZE;
9357     }
9358
9359   if (htab->root.sgot && htab->root.sgot->size > 0)
9360     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize
9361       = GOT_ENTRY_SIZE;
9362
9363   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
9364   htab_traverse (htab->loc_hash_table,
9365                  elfNN_aarch64_finish_local_dynamic_symbol,
9366                  info);
9367
9368   return TRUE;
9369 }
9370
9371 /* Return address for Ith PLT stub in section PLT, for relocation REL
9372    or (bfd_vma) -1 if it should not be included.  */
9373
9374 static bfd_vma
9375 elfNN_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
9376                            const arelent *rel ATTRIBUTE_UNUSED)
9377 {
9378   return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
9379 }
9380
9381 /* Returns TRUE if NAME is an AArch64 mapping symbol.
9382    The ARM ELF standard defines $x (for A64 code) and $d (for data).
9383    It also allows a period initiated suffix to be added to the symbol, ie:
9384    "$[adtx]\.[:sym_char]+".  */
9385
9386 static bfd_boolean
9387 is_aarch64_mapping_symbol (const char * name)
9388 {
9389   return name != NULL /* Paranoia.  */
9390     && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
9391                          the mapping symbols could have acquired a prefix.
9392                          We do not support this here, since such symbols no
9393                          longer conform to the ARM ELF ABI.  */
9394     && (name[1] == 'd' || name[1] == 'x')
9395     && (name[2] == 0 || name[2] == '.');
9396   /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
9397      any characters that follow the period are legal characters for the body
9398      of a symbol's name.  For now we just assume that this is the case.  */
9399 }
9400
9401 /* Make sure that mapping symbols in object files are not removed via the
9402    "strip --strip-unneeded" tool.  These symbols might needed in order to
9403    correctly generate linked files.  Once an object file has been linked,
9404    it should be safe to remove them.  */
9405
9406 static void
9407 elfNN_aarch64_backend_symbol_processing (bfd *abfd, asymbol *sym)
9408 {
9409   if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
9410       && sym->section != bfd_abs_section_ptr
9411       && is_aarch64_mapping_symbol (sym->name))
9412     sym->flags |= BSF_KEEP;
9413 }
9414
9415
9416 /* We use this so we can override certain functions
9417    (though currently we don't).  */
9418
9419 const struct elf_size_info elfNN_aarch64_size_info =
9420 {
9421   sizeof (ElfNN_External_Ehdr),
9422   sizeof (ElfNN_External_Phdr),
9423   sizeof (ElfNN_External_Shdr),
9424   sizeof (ElfNN_External_Rel),
9425   sizeof (ElfNN_External_Rela),
9426   sizeof (ElfNN_External_Sym),
9427   sizeof (ElfNN_External_Dyn),
9428   sizeof (Elf_External_Note),
9429   4,                            /* Hash table entry size.  */
9430   1,                            /* Internal relocs per external relocs.  */
9431   ARCH_SIZE,                    /* Arch size.  */
9432   LOG_FILE_ALIGN,               /* Log_file_align.  */
9433   ELFCLASSNN, EV_CURRENT,
9434   bfd_elfNN_write_out_phdrs,
9435   bfd_elfNN_write_shdrs_and_ehdr,
9436   bfd_elfNN_checksum_contents,
9437   bfd_elfNN_write_relocs,
9438   bfd_elfNN_swap_symbol_in,
9439   bfd_elfNN_swap_symbol_out,
9440   bfd_elfNN_slurp_reloc_table,
9441   bfd_elfNN_slurp_symbol_table,
9442   bfd_elfNN_swap_dyn_in,
9443   bfd_elfNN_swap_dyn_out,
9444   bfd_elfNN_swap_reloc_in,
9445   bfd_elfNN_swap_reloc_out,
9446   bfd_elfNN_swap_reloca_in,
9447   bfd_elfNN_swap_reloca_out
9448 };
9449
9450 #define ELF_ARCH                        bfd_arch_aarch64
9451 #define ELF_MACHINE_CODE                EM_AARCH64
9452 #define ELF_MAXPAGESIZE                 0x10000
9453 #define ELF_MINPAGESIZE                 0x1000
9454 #define ELF_COMMONPAGESIZE              0x1000
9455
9456 #define bfd_elfNN_close_and_cleanup             \
9457   elfNN_aarch64_close_and_cleanup
9458
9459 #define bfd_elfNN_bfd_free_cached_info          \
9460   elfNN_aarch64_bfd_free_cached_info
9461
9462 #define bfd_elfNN_bfd_is_target_special_symbol  \
9463   elfNN_aarch64_is_target_special_symbol
9464
9465 #define bfd_elfNN_bfd_link_hash_table_create    \
9466   elfNN_aarch64_link_hash_table_create
9467
9468 #define bfd_elfNN_bfd_merge_private_bfd_data    \
9469   elfNN_aarch64_merge_private_bfd_data
9470
9471 #define bfd_elfNN_bfd_print_private_bfd_data    \
9472   elfNN_aarch64_print_private_bfd_data
9473
9474 #define bfd_elfNN_bfd_reloc_type_lookup         \
9475   elfNN_aarch64_reloc_type_lookup
9476
9477 #define bfd_elfNN_bfd_reloc_name_lookup         \
9478   elfNN_aarch64_reloc_name_lookup
9479
9480 #define bfd_elfNN_bfd_set_private_flags         \
9481   elfNN_aarch64_set_private_flags
9482
9483 #define bfd_elfNN_find_inliner_info             \
9484   elfNN_aarch64_find_inliner_info
9485
9486 #define bfd_elfNN_find_nearest_line             \
9487   elfNN_aarch64_find_nearest_line
9488
9489 #define bfd_elfNN_mkobject                      \
9490   elfNN_aarch64_mkobject
9491
9492 #define bfd_elfNN_new_section_hook              \
9493   elfNN_aarch64_new_section_hook
9494
9495 #define elf_backend_adjust_dynamic_symbol       \
9496   elfNN_aarch64_adjust_dynamic_symbol
9497
9498 #define elf_backend_always_size_sections        \
9499   elfNN_aarch64_always_size_sections
9500
9501 #define elf_backend_check_relocs                \
9502   elfNN_aarch64_check_relocs
9503
9504 #define elf_backend_copy_indirect_symbol        \
9505   elfNN_aarch64_copy_indirect_symbol
9506
9507 /* Create .dynbss, and .rela.bss sections in DYNOBJ, and set up shortcuts
9508    to them in our hash.  */
9509 #define elf_backend_create_dynamic_sections     \
9510   elfNN_aarch64_create_dynamic_sections
9511
9512 #define elf_backend_init_index_section          \
9513   _bfd_elf_init_2_index_sections
9514
9515 #define elf_backend_finish_dynamic_sections     \
9516   elfNN_aarch64_finish_dynamic_sections
9517
9518 #define elf_backend_finish_dynamic_symbol       \
9519   elfNN_aarch64_finish_dynamic_symbol
9520
9521 #define elf_backend_object_p                    \
9522   elfNN_aarch64_object_p
9523
9524 #define elf_backend_output_arch_local_syms      \
9525   elfNN_aarch64_output_arch_local_syms
9526
9527 #define elf_backend_plt_sym_val                 \
9528   elfNN_aarch64_plt_sym_val
9529
9530 #define elf_backend_post_process_headers        \
9531   elfNN_aarch64_post_process_headers
9532
9533 #define elf_backend_relocate_section            \
9534   elfNN_aarch64_relocate_section
9535
9536 #define elf_backend_reloc_type_class            \
9537   elfNN_aarch64_reloc_type_class
9538
9539 #define elf_backend_section_from_shdr           \
9540   elfNN_aarch64_section_from_shdr
9541
9542 #define elf_backend_size_dynamic_sections       \
9543   elfNN_aarch64_size_dynamic_sections
9544
9545 #define elf_backend_size_info                   \
9546   elfNN_aarch64_size_info
9547
9548 #define elf_backend_write_section               \
9549   elfNN_aarch64_write_section
9550
9551 #define elf_backend_symbol_processing           \
9552   elfNN_aarch64_backend_symbol_processing
9553
9554 #define elf_backend_can_refcount       1
9555 #define elf_backend_can_gc_sections    1
9556 #define elf_backend_plt_readonly       1
9557 #define elf_backend_want_got_plt       1
9558 #define elf_backend_want_plt_sym       0
9559 #define elf_backend_want_dynrelro      1
9560 #define elf_backend_may_use_rel_p      0
9561 #define elf_backend_may_use_rela_p     1
9562 #define elf_backend_default_use_rela_p 1
9563 #define elf_backend_rela_normal        1
9564 #define elf_backend_dtrel_excludes_plt 1
9565 #define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
9566 #define elf_backend_default_execstack  0
9567 #define elf_backend_extern_protected_data 1
9568 #define elf_backend_hash_symbol elf_aarch64_hash_symbol
9569
9570 #undef  elf_backend_obj_attrs_section
9571 #define elf_backend_obj_attrs_section           ".ARM.attributes"
9572
9573 #include "elfNN-target.h"
9574
9575 /* CloudABI support.  */
9576
9577 #undef  TARGET_LITTLE_SYM
9578 #define TARGET_LITTLE_SYM       aarch64_elfNN_le_cloudabi_vec
9579 #undef  TARGET_LITTLE_NAME
9580 #define TARGET_LITTLE_NAME      "elfNN-littleaarch64-cloudabi"
9581 #undef  TARGET_BIG_SYM
9582 #define TARGET_BIG_SYM          aarch64_elfNN_be_cloudabi_vec
9583 #undef  TARGET_BIG_NAME
9584 #define TARGET_BIG_NAME         "elfNN-bigaarch64-cloudabi"
9585
9586 #undef  ELF_OSABI
9587 #define ELF_OSABI               ELFOSABI_CLOUDABI
9588
9589 #undef  elfNN_bed
9590 #define elfNN_bed               elfNN_aarch64_cloudabi_bed
9591
9592 #include "elfNN-target.h"