[PR20402][LD][AARCH64]Don't emit RELATIVE relocation for absolute symbols which are...
[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           /* Dynamic relocs are not propagated for SEC_DEBUGGING
5114              sections because such sections are not SEC_ALLOC and
5115              thus ld.so will not process them.  */
5116           if ((input_section->flags & SEC_DEBUGGING) != 0)
5117             return bfd_reloc_ok;
5118
5119           if (h->root.root.string)
5120             name = h->root.root.string;
5121           else
5122             name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, NULL);
5123           _bfd_error_handler
5124             /* xgettext:c-format */
5125             (_("%pB(%pA+%#" PRIx64 "): "
5126                "unresolvable %s relocation against symbol `%s'"),
5127              input_bfd, input_section, (uint64_t) rel->r_offset,
5128              howto->name, name);
5129           bfd_set_error (bfd_error_bad_value);
5130           return bfd_reloc_notsupported;
5131         }
5132       else if (h->plt.offset == (bfd_vma) -1)
5133         goto bad_ifunc_reloc;
5134
5135       /* STT_GNU_IFUNC symbol must go through PLT.  */
5136       plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
5137       value = (plt->output_section->vma + plt->output_offset + h->plt.offset);
5138
5139       switch (bfd_r_type)
5140         {
5141         default:
5142 bad_ifunc_reloc:
5143           if (h->root.root.string)
5144             name = h->root.root.string;
5145           else
5146             name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
5147                                      NULL);
5148           _bfd_error_handler
5149             /* xgettext:c-format */
5150             (_("%pB: relocation %s against STT_GNU_IFUNC "
5151                "symbol `%s' isn't handled by %s"), input_bfd,
5152              howto->name, name, __FUNCTION__);
5153           bfd_set_error (bfd_error_bad_value);
5154           return bfd_reloc_notsupported;
5155
5156         case BFD_RELOC_AARCH64_NN:
5157           if (rel->r_addend != 0)
5158             {
5159               if (h->root.root.string)
5160                 name = h->root.root.string;
5161               else
5162                 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
5163                                          sym, NULL);
5164               _bfd_error_handler
5165                 /* xgettext:c-format */
5166                 (_("%pB: relocation %s against STT_GNU_IFUNC "
5167                    "symbol `%s' has non-zero addend: %" PRId64),
5168                  input_bfd, howto->name, name, (int64_t) rel->r_addend);
5169               bfd_set_error (bfd_error_bad_value);
5170               return bfd_reloc_notsupported;
5171             }
5172
5173           /* Generate dynamic relocation only when there is a
5174              non-GOT reference in a shared object.  */
5175           if (bfd_link_pic (info) && h->non_got_ref)
5176             {
5177               Elf_Internal_Rela outrel;
5178               asection *sreloc;
5179
5180               /* Need a dynamic relocation to get the real function
5181                  address.  */
5182               outrel.r_offset = _bfd_elf_section_offset (output_bfd,
5183                                                          info,
5184                                                          input_section,
5185                                                          rel->r_offset);
5186               if (outrel.r_offset == (bfd_vma) -1
5187                   || outrel.r_offset == (bfd_vma) -2)
5188                 abort ();
5189
5190               outrel.r_offset += (input_section->output_section->vma
5191                                   + input_section->output_offset);
5192
5193               if (h->dynindx == -1
5194                   || h->forced_local
5195                   || bfd_link_executable (info))
5196                 {
5197                   /* This symbol is resolved locally.  */
5198                   outrel.r_info = ELFNN_R_INFO (0, AARCH64_R (IRELATIVE));
5199                   outrel.r_addend = (h->root.u.def.value
5200                                      + h->root.u.def.section->output_section->vma
5201                                      + h->root.u.def.section->output_offset);
5202                 }
5203               else
5204                 {
5205                   outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
5206                   outrel.r_addend = 0;
5207                 }
5208
5209               sreloc = globals->root.irelifunc;
5210               elf_append_rela (output_bfd, sreloc, &outrel);
5211
5212               /* If this reloc is against an external symbol, we
5213                  do not want to fiddle with the addend.  Otherwise,
5214                  we need to include the symbol value so that it
5215                  becomes an addend for the dynamic reloc.  For an
5216                  internal symbol, we have updated addend.  */
5217               return bfd_reloc_ok;
5218             }
5219           /* FALLTHROUGH */
5220         case BFD_RELOC_AARCH64_CALL26:
5221         case BFD_RELOC_AARCH64_JUMP26:
5222           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5223                                                        signed_addend,
5224                                                        weak_undef_p);
5225           return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type,
5226                                               howto, value);
5227         case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
5228         case BFD_RELOC_AARCH64_GOT_LD_PREL19:
5229         case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
5230         case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
5231         case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
5232         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
5233         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
5234         case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
5235         case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
5236           base_got = globals->root.sgot;
5237           off = h->got.offset;
5238
5239           if (base_got == NULL)
5240             abort ();
5241
5242           if (off == (bfd_vma) -1)
5243             {
5244               bfd_vma plt_index;
5245
5246               /* We can't use h->got.offset here to save state, or
5247                  even just remember the offset, as finish_dynamic_symbol
5248                  would use that as offset into .got.  */
5249
5250               if (globals->root.splt != NULL)
5251                 {
5252                   plt_index = ((h->plt.offset - globals->plt_header_size) /
5253                                globals->plt_entry_size);
5254                   off = (plt_index + 3) * GOT_ENTRY_SIZE;
5255                   base_got = globals->root.sgotplt;
5256                 }
5257               else
5258                 {
5259                   plt_index = h->plt.offset / globals->plt_entry_size;
5260                   off = plt_index * GOT_ENTRY_SIZE;
5261                   base_got = globals->root.igotplt;
5262                 }
5263
5264               if (h->dynindx == -1
5265                   || h->forced_local
5266                   || info->symbolic)
5267                 {
5268                   /* This references the local definition.  We must
5269                      initialize this entry in the global offset table.
5270                      Since the offset must always be a multiple of 8,
5271                      we use the least significant bit to record
5272                      whether we have initialized it already.
5273
5274                      When doing a dynamic link, we create a .rela.got
5275                      relocation entry to initialize the value.  This
5276                      is done in the finish_dynamic_symbol routine.       */
5277                   if ((off & 1) != 0)
5278                     off &= ~1;
5279                   else
5280                     {
5281                       bfd_put_NN (output_bfd, value,
5282                                   base_got->contents + off);
5283                       /* Note that this is harmless as -1 | 1 still is -1.  */
5284                       h->got.offset |= 1;
5285                     }
5286                 }
5287               value = (base_got->output_section->vma
5288                        + base_got->output_offset + off);
5289             }
5290           else
5291             value = aarch64_calculate_got_entry_vma (h, globals, info,
5292                                                      value, output_bfd,
5293                                                      unresolved_reloc_p);
5294
5295           if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5296             addend = (globals->root.sgot->output_section->vma
5297                       + globals->root.sgot->output_offset);
5298
5299           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5300                                                        addend, weak_undef_p);
5301           return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type, howto, value);
5302         case BFD_RELOC_AARCH64_ADD_LO12:
5303         case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
5304           break;
5305         }
5306     }
5307
5308   resolved_to_zero = (h != NULL
5309                       && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
5310
5311   switch (bfd_r_type)
5312     {
5313     case BFD_RELOC_AARCH64_NONE:
5314     case BFD_RELOC_AARCH64_TLSDESC_ADD:
5315     case BFD_RELOC_AARCH64_TLSDESC_CALL:
5316     case BFD_RELOC_AARCH64_TLSDESC_LDR:
5317       *unresolved_reloc_p = FALSE;
5318       return bfd_reloc_ok;
5319
5320     case BFD_RELOC_AARCH64_NN:
5321
5322       /* When generating a shared object or relocatable executable, these
5323          relocations are copied into the output file to be resolved at
5324          run time.  */
5325       if (((bfd_link_pic (info)
5326             || globals->root.is_relocatable_executable)
5327            && (input_section->flags & SEC_ALLOC)
5328            && (h == NULL
5329                || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5330                    && !resolved_to_zero)
5331                || h->root.type != bfd_link_hash_undefweak))
5332           /* Or we are creating an executable, we may need to keep relocations
5333              for symbols satisfied by a dynamic library if we manage to avoid
5334              copy relocs for the symbol.  */
5335           || (ELIMINATE_COPY_RELOCS
5336               && !bfd_link_pic (info)
5337               && h != NULL
5338               && (input_section->flags & SEC_ALLOC)
5339               && h->dynindx != -1
5340               && !h->non_got_ref
5341               && ((h->def_dynamic
5342                    && !h->def_regular)
5343                   || h->root.type == bfd_link_hash_undefweak
5344                   || h->root.type == bfd_link_hash_undefined)))
5345         {
5346           Elf_Internal_Rela outrel;
5347           bfd_byte *loc;
5348           bfd_boolean skip, relocate;
5349           asection *sreloc;
5350
5351           *unresolved_reloc_p = FALSE;
5352
5353           skip = FALSE;
5354           relocate = FALSE;
5355
5356           outrel.r_addend = signed_addend;
5357           outrel.r_offset =
5358             _bfd_elf_section_offset (output_bfd, info, input_section,
5359                                      rel->r_offset);
5360           if (outrel.r_offset == (bfd_vma) - 1)
5361             skip = TRUE;
5362           else if (outrel.r_offset == (bfd_vma) - 2)
5363             {
5364               skip = TRUE;
5365               relocate = TRUE;
5366             }
5367           else if (abs_symbol_p)
5368             {
5369               /* Local absolute symbol.  */
5370               skip = (h->forced_local || (h->dynindx == -1));
5371               relocate = skip;
5372             }
5373
5374           outrel.r_offset += (input_section->output_section->vma
5375                               + input_section->output_offset);
5376
5377           if (skip)
5378             memset (&outrel, 0, sizeof outrel);
5379           else if (h != NULL
5380                    && h->dynindx != -1
5381                    && (!bfd_link_pic (info)
5382                        || !(bfd_link_pie (info) || SYMBOLIC_BIND (info, h))
5383                        || !h->def_regular))
5384             outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
5385           else
5386             {
5387               int symbol;
5388
5389               /* On SVR4-ish systems, the dynamic loader cannot
5390                  relocate the text and data segments independently,
5391                  so the symbol does not matter.  */
5392               symbol = 0;
5393               relocate = globals->no_apply_dynamic_relocs ? FALSE : TRUE;
5394               outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE));
5395               outrel.r_addend += value;
5396             }
5397
5398           sreloc = elf_section_data (input_section)->sreloc;
5399           if (sreloc == NULL || sreloc->contents == NULL)
5400             return bfd_reloc_notsupported;
5401
5402           loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (globals);
5403           bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
5404
5405           if (sreloc->reloc_count * RELOC_SIZE (globals) > sreloc->size)
5406             {
5407               /* Sanity to check that we have previously allocated
5408                  sufficient space in the relocation section for the
5409                  number of relocations we actually want to emit.  */
5410               abort ();
5411             }
5412
5413           /* If this reloc is against an external symbol, we do not want to
5414              fiddle with the addend.  Otherwise, we need to include the symbol
5415              value so that it becomes an addend for the dynamic reloc.  */
5416           if (!relocate)
5417             return bfd_reloc_ok;
5418
5419           return _bfd_final_link_relocate (howto, input_bfd, input_section,
5420                                            contents, rel->r_offset, value,
5421                                            signed_addend);
5422         }
5423       else
5424         value += signed_addend;
5425       break;
5426
5427     case BFD_RELOC_AARCH64_CALL26:
5428     case BFD_RELOC_AARCH64_JUMP26:
5429       {
5430         asection *splt = globals->root.splt;
5431         bfd_boolean via_plt_p =
5432           splt != NULL && h != NULL && h->plt.offset != (bfd_vma) - 1;
5433
5434         /* A call to an undefined weak symbol is converted to a jump to
5435            the next instruction unless a PLT entry will be created.
5436            The jump to the next instruction is optimized as a NOP.
5437            Do the same for local undefined symbols.  */
5438         if (weak_undef_p && ! via_plt_p)
5439           {
5440             bfd_putl32 (INSN_NOP, hit_data);
5441             return bfd_reloc_ok;
5442           }
5443
5444         /* If the call goes through a PLT entry, make sure to
5445            check distance to the right destination address.  */
5446         if (via_plt_p)
5447           value = (splt->output_section->vma
5448                    + splt->output_offset + h->plt.offset);
5449
5450         /* Check if a stub has to be inserted because the destination
5451            is too far away.  */
5452         struct elf_aarch64_stub_hash_entry *stub_entry = NULL;
5453
5454         /* If the branch destination is directed to plt stub, "value" will be
5455            the final destination, otherwise we should plus signed_addend, it may
5456            contain non-zero value, for example call to local function symbol
5457            which are turned into "sec_sym + sec_off", and sec_off is kept in
5458            signed_addend.  */
5459         if (! aarch64_valid_branch_p (via_plt_p ? value : value + signed_addend,
5460                                       place))
5461           /* The target is out of reach, so redirect the branch to
5462              the local stub for this function.  */
5463         stub_entry = elfNN_aarch64_get_stub_entry (input_section, sym_sec, h,
5464                                                    rel, globals);
5465         if (stub_entry != NULL)
5466           {
5467             value = (stub_entry->stub_offset
5468                      + stub_entry->stub_sec->output_offset
5469                      + stub_entry->stub_sec->output_section->vma);
5470
5471             /* We have redirected the destination to stub entry address,
5472                so ignore any addend record in the original rela entry.  */
5473             signed_addend = 0;
5474           }
5475       }
5476       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5477                                                    signed_addend, weak_undef_p);
5478       *unresolved_reloc_p = FALSE;
5479       break;
5480
5481     case BFD_RELOC_AARCH64_16_PCREL:
5482     case BFD_RELOC_AARCH64_32_PCREL:
5483     case BFD_RELOC_AARCH64_64_PCREL:
5484     case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
5485     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
5486     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
5487     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
5488     case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5489     case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
5490     case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5491     case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
5492     case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5493     case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
5494     case BFD_RELOC_AARCH64_MOVW_PREL_G3:
5495       if (bfd_link_pic (info)
5496           && (input_section->flags & SEC_ALLOC) != 0
5497           && (input_section->flags & SEC_READONLY) != 0
5498           && !SYMBOL_REFERENCES_LOCAL (info, h))
5499         {
5500           int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
5501
5502           _bfd_error_handler
5503             /* xgettext:c-format */
5504             (_("%pB: relocation %s against symbol `%s' which may bind "
5505                "externally can not be used when making a shared object; "
5506                "recompile with -fPIC"),
5507              input_bfd, elfNN_aarch64_howto_table[howto_index].name,
5508              h->root.root.string);
5509           bfd_set_error (bfd_error_bad_value);
5510           return bfd_reloc_notsupported;
5511         }
5512       /* Fall through.  */
5513
5514     case BFD_RELOC_AARCH64_16:
5515 #if ARCH_SIZE == 64
5516     case BFD_RELOC_AARCH64_32:
5517 #endif
5518     case BFD_RELOC_AARCH64_ADD_LO12:
5519     case BFD_RELOC_AARCH64_BRANCH19:
5520     case BFD_RELOC_AARCH64_LDST128_LO12:
5521     case BFD_RELOC_AARCH64_LDST16_LO12:
5522     case BFD_RELOC_AARCH64_LDST32_LO12:
5523     case BFD_RELOC_AARCH64_LDST64_LO12:
5524     case BFD_RELOC_AARCH64_LDST8_LO12:
5525     case BFD_RELOC_AARCH64_MOVW_G0:
5526     case BFD_RELOC_AARCH64_MOVW_G0_NC:
5527     case BFD_RELOC_AARCH64_MOVW_G0_S:
5528     case BFD_RELOC_AARCH64_MOVW_G1:
5529     case BFD_RELOC_AARCH64_MOVW_G1_NC:
5530     case BFD_RELOC_AARCH64_MOVW_G1_S:
5531     case BFD_RELOC_AARCH64_MOVW_G2:
5532     case BFD_RELOC_AARCH64_MOVW_G2_NC:
5533     case BFD_RELOC_AARCH64_MOVW_G2_S:
5534     case BFD_RELOC_AARCH64_MOVW_G3:
5535     case BFD_RELOC_AARCH64_TSTBR14:
5536       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5537                                                    signed_addend, weak_undef_p);
5538       break;
5539
5540     case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
5541     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
5542     case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
5543     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
5544     case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
5545     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
5546     case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
5547     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
5548     case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
5549       if (globals->root.sgot == NULL)
5550         BFD_ASSERT (h != NULL);
5551
5552       relative_reloc = FALSE;
5553       if (h != NULL)
5554         {
5555           bfd_vma addend = 0;
5556
5557           /* If a symbol is not dynamic and is not undefined weak, bind it
5558              locally and generate a RELATIVE relocation under PIC mode.
5559
5560              NOTE: one symbol may be referenced by several relocations, we
5561              should only generate one RELATIVE relocation for that symbol.
5562              Therefore, check GOT offset mark first.  */
5563           if (h->dynindx == -1
5564               && !h->forced_local
5565               && h->root.type != bfd_link_hash_undefweak
5566               && bfd_link_pic (info)
5567               && !symbol_got_offset_mark_p (input_bfd, h, r_symndx))
5568             relative_reloc = TRUE;
5569
5570           value = aarch64_calculate_got_entry_vma (h, globals, info, value,
5571                                                    output_bfd,
5572                                                    unresolved_reloc_p);
5573           /* Record the GOT entry address which will be used when generating
5574              RELATIVE relocation.  */
5575           if (relative_reloc)
5576             got_entry_addr = value;
5577
5578           if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5579             addend = (globals->root.sgot->output_section->vma
5580                       + globals->root.sgot->output_offset);
5581           value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5582                                                        addend, weak_undef_p);
5583         }
5584       else
5585       {
5586         bfd_vma addend = 0;
5587         struct elf_aarch64_local_symbol *locals
5588           = elf_aarch64_locals (input_bfd);
5589
5590         if (locals == NULL)
5591           {
5592             int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
5593             _bfd_error_handler
5594               /* xgettext:c-format */
5595               (_("%pB: local symbol descriptor table be NULL when applying "
5596                  "relocation %s against local symbol"),
5597                input_bfd, elfNN_aarch64_howto_table[howto_index].name);
5598             abort ();
5599           }
5600
5601         off = symbol_got_offset (input_bfd, h, r_symndx);
5602         base_got = globals->root.sgot;
5603         got_entry_addr = (base_got->output_section->vma
5604                           + base_got->output_offset + off);
5605
5606         if (!symbol_got_offset_mark_p (input_bfd, h, r_symndx))
5607           {
5608             bfd_put_64 (output_bfd, value, base_got->contents + off);
5609
5610             /* For local symbol, we have done absolute relocation in static
5611                linking stage.  While for shared library, we need to update the
5612                content of GOT entry according to the shared object's runtime
5613                base address.  So, we need to generate a R_AARCH64_RELATIVE reloc
5614                for dynamic linker.  */
5615             if (bfd_link_pic (info))
5616               relative_reloc = TRUE;
5617
5618             symbol_got_offset_mark (input_bfd, h, r_symndx);
5619           }
5620
5621         /* Update the relocation value to GOT entry addr as we have transformed
5622            the direct data access into indirect data access through GOT.  */
5623         value = got_entry_addr;
5624
5625         if (aarch64_relocation_aginst_gp_p (bfd_r_type))
5626           addend = base_got->output_section->vma + base_got->output_offset;
5627
5628         value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5629                                                      addend, weak_undef_p);
5630       }
5631
5632       if (relative_reloc)
5633         {
5634           asection *s;
5635           Elf_Internal_Rela outrel;
5636
5637           s = globals->root.srelgot;
5638           if (s == NULL)
5639             abort ();
5640
5641           outrel.r_offset = got_entry_addr;
5642           outrel.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE));
5643           outrel.r_addend = orig_value;
5644           elf_append_rela (output_bfd, s, &outrel);
5645         }
5646       break;
5647
5648     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
5649     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
5650     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
5651     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
5652     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
5653     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
5654     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
5655     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
5656     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
5657     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
5658       if (globals->root.sgot == NULL)
5659         return bfd_reloc_notsupported;
5660
5661       value = (symbol_got_offset (input_bfd, h, r_symndx)
5662                + globals->root.sgot->output_section->vma
5663                + globals->root.sgot->output_offset);
5664
5665       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5666                                                    0, weak_undef_p);
5667       *unresolved_reloc_p = FALSE;
5668       break;
5669
5670     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
5671     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
5672     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
5673     case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
5674       if (globals->root.sgot == NULL)
5675         return bfd_reloc_notsupported;
5676
5677       value = symbol_got_offset (input_bfd, h, r_symndx);
5678       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5679                                                    0, weak_undef_p);
5680       *unresolved_reloc_p = FALSE;
5681       break;
5682
5683     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
5684     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
5685     case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
5686     case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
5687     case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
5688     case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
5689     case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
5690     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
5691     case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
5692     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
5693     case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
5694     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
5695     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
5696     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
5697     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
5698     case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
5699       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5700                                                    signed_addend - dtpoff_base (info),
5701                                                    weak_undef_p);
5702       break;
5703
5704     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
5705     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
5706     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
5707     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
5708     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
5709     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
5710     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
5711     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5712       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5713                                                    signed_addend - tpoff_base (info),
5714                                                    weak_undef_p);
5715       *unresolved_reloc_p = FALSE;
5716       break;
5717
5718     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
5719     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
5720     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
5721     case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
5722     case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
5723     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
5724       if (globals->root.sgot == NULL)
5725         return bfd_reloc_notsupported;
5726       value = (symbol_tlsdesc_got_offset (input_bfd, h, r_symndx)
5727                + globals->root.sgotplt->output_section->vma
5728                + globals->root.sgotplt->output_offset
5729                + globals->sgotplt_jump_table_size);
5730
5731       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5732                                                    0, weak_undef_p);
5733       *unresolved_reloc_p = FALSE;
5734       break;
5735
5736     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
5737     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
5738       if (globals->root.sgot == NULL)
5739         return bfd_reloc_notsupported;
5740
5741       value = (symbol_tlsdesc_got_offset (input_bfd, h, r_symndx)
5742                + globals->root.sgotplt->output_section->vma
5743                + globals->root.sgotplt->output_offset
5744                + globals->sgotplt_jump_table_size);
5745
5746       value -= (globals->root.sgot->output_section->vma
5747                 + globals->root.sgot->output_offset);
5748
5749       value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
5750                                                    0, weak_undef_p);
5751       *unresolved_reloc_p = FALSE;
5752       break;
5753
5754     default:
5755       return bfd_reloc_notsupported;
5756     }
5757
5758   if (saved_addend)
5759     *saved_addend = value;
5760
5761   /* Only apply the final relocation in a sequence.  */
5762   if (save_addend)
5763     return bfd_reloc_continue;
5764
5765   return _bfd_aarch64_elf_put_addend (input_bfd, hit_data, bfd_r_type,
5766                                       howto, value);
5767 }
5768
5769 /* LP64 and ILP32 operates on x- and w-registers respectively.
5770    Next definitions take into account the difference between
5771    corresponding machine codes. R means x-register if the target
5772    arch is LP64, and w-register if the target is ILP32.  */
5773
5774 #if ARCH_SIZE == 64
5775 # define add_R0_R0      (0x91000000)
5776 # define add_R0_R0_R1   (0x8b000020)
5777 # define add_R0_R1      (0x91400020)
5778 # define ldr_R0         (0x58000000)
5779 # define ldr_R0_mask(i) (i & 0xffffffe0)
5780 # define ldr_R0_x0      (0xf9400000)
5781 # define ldr_hw_R0      (0xf2a00000)
5782 # define movk_R0        (0xf2800000)
5783 # define movz_R0        (0xd2a00000)
5784 # define movz_hw_R0     (0xd2c00000)
5785 #else /*ARCH_SIZE == 32 */
5786 # define add_R0_R0      (0x11000000)
5787 # define add_R0_R0_R1   (0x0b000020)
5788 # define add_R0_R1      (0x11400020)
5789 # define ldr_R0         (0x18000000)
5790 # define ldr_R0_mask(i) (i & 0xbfffffe0)
5791 # define ldr_R0_x0      (0xb9400000)
5792 # define ldr_hw_R0      (0x72a00000)
5793 # define movk_R0        (0x72800000)
5794 # define movz_R0        (0x52a00000)
5795 # define movz_hw_R0     (0x52c00000)
5796 #endif
5797
5798 /* Handle TLS relaxations.  Relaxing is possible for symbols that use
5799    R_AARCH64_TLSDESC_ADR_{PAGE, LD64_LO12_NC, ADD_LO12_NC} during a static
5800    link.
5801
5802    Return bfd_reloc_ok if we're done, bfd_reloc_continue if the caller
5803    is to then call final_link_relocate.  Return other values in the
5804    case of error.  */
5805
5806 static bfd_reloc_status_type
5807 elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals,
5808                          bfd *input_bfd, bfd_byte *contents,
5809                          Elf_Internal_Rela *rel, struct elf_link_hash_entry *h)
5810 {
5811   bfd_boolean is_local = h == NULL;
5812   unsigned int r_type = ELFNN_R_TYPE (rel->r_info);
5813   unsigned long insn;
5814
5815   BFD_ASSERT (globals && input_bfd && contents && rel);
5816
5817   switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
5818     {
5819     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
5820     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
5821       if (is_local)
5822         {
5823           /* GD->LE relaxation:
5824              adrp x0, :tlsgd:var     =>   movz R0, :tprel_g1:var
5825              or
5826              adrp x0, :tlsdesc:var   =>   movz R0, :tprel_g1:var
5827
5828              Where R is x for LP64, and w for ILP32.  */
5829           bfd_putl32 (movz_R0, contents + rel->r_offset);
5830           return bfd_reloc_continue;
5831         }
5832       else
5833         {
5834           /* GD->IE relaxation:
5835              adrp x0, :tlsgd:var     =>   adrp x0, :gottprel:var
5836              or
5837              adrp x0, :tlsdesc:var   =>   adrp x0, :gottprel:var
5838            */
5839           return bfd_reloc_continue;
5840         }
5841
5842     case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
5843       BFD_ASSERT (0);
5844       break;
5845
5846     case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
5847       if (is_local)
5848         {
5849           /* Tiny TLSDESC->LE relaxation:
5850              ldr   x1, :tlsdesc:var      =>  movz  R0, #:tprel_g1:var
5851              adr   x0, :tlsdesc:var      =>  movk  R0, #:tprel_g0_nc:var
5852              .tlsdesccall var
5853              blr   x1                    =>  nop
5854
5855              Where R is x for LP64, and w for ILP32.  */
5856           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSDESC_ADR_PREL21));
5857           BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (TLSDESC_CALL));
5858
5859           rel[1].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5860                                         AARCH64_R (TLSLE_MOVW_TPREL_G0_NC));
5861           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5862
5863           bfd_putl32 (movz_R0, contents + rel->r_offset);
5864           bfd_putl32 (movk_R0, contents + rel->r_offset + 4);
5865           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 8);
5866           return bfd_reloc_continue;
5867         }
5868       else
5869         {
5870           /* Tiny TLSDESC->IE relaxation:
5871              ldr   x1, :tlsdesc:var      =>  ldr   x0, :gottprel:var
5872              adr   x0, :tlsdesc:var      =>  nop
5873              .tlsdesccall var
5874              blr   x1                    =>  nop
5875            */
5876           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSDESC_ADR_PREL21));
5877           BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (TLSDESC_CALL));
5878
5879           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5880           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5881
5882           bfd_putl32 (ldr_R0, contents + rel->r_offset);
5883           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 4);
5884           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 8);
5885           return bfd_reloc_continue;
5886         }
5887
5888     case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
5889       if (is_local)
5890         {
5891           /* Tiny GD->LE relaxation:
5892              adr x0, :tlsgd:var      =>   mrs  x1, tpidr_el0
5893              bl   __tls_get_addr     =>   add  R0, R1, #:tprel_hi12:x, lsl #12
5894              nop                     =>   add  R0, R0, #:tprel_lo12_nc:x
5895
5896              Where R is x for LP64, and x for Ilp32.  */
5897
5898           /* First kill the tls_get_addr reloc on the bl instruction.  */
5899           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
5900
5901           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 0);
5902           bfd_putl32 (add_R0_R1, contents + rel->r_offset + 4);
5903           bfd_putl32 (add_R0_R0, contents + rel->r_offset + 8);
5904
5905           rel[1].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5906                                         AARCH64_R (TLSLE_ADD_TPREL_LO12_NC));
5907           rel[1].r_offset = rel->r_offset + 8;
5908
5909           /* Move the current relocation to the second instruction in
5910              the sequence.  */
5911           rel->r_offset += 4;
5912           rel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5913                                       AARCH64_R (TLSLE_ADD_TPREL_HI12));
5914           return bfd_reloc_continue;
5915         }
5916       else
5917         {
5918           /* Tiny GD->IE relaxation:
5919              adr x0, :tlsgd:var      =>   ldr  R0, :gottprel:var
5920              bl   __tls_get_addr     =>   mrs  x1, tpidr_el0
5921              nop                     =>   add  R0, R0, R1
5922
5923              Where R is x for LP64, and w for Ilp32.  */
5924
5925           /* First kill the tls_get_addr reloc on the bl instruction.  */
5926           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
5927           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5928
5929           bfd_putl32 (ldr_R0, contents + rel->r_offset);
5930           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 4);
5931           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 8);
5932           return bfd_reloc_continue;
5933         }
5934
5935 #if ARCH_SIZE == 64
5936     case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
5937       BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (TLSGD_MOVW_G0_NC));
5938       BFD_ASSERT (rel->r_offset + 12 == rel[2].r_offset);
5939       BFD_ASSERT (ELFNN_R_TYPE (rel[2].r_info) == AARCH64_R (CALL26));
5940
5941       if (is_local)
5942         {
5943           /* Large GD->LE relaxation:
5944              movz x0, #:tlsgd_g1:var    => movz x0, #:tprel_g2:var, lsl #32
5945              movk x0, #:tlsgd_g0_nc:var => movk x0, #:tprel_g1_nc:var, lsl #16
5946              add x0, gp, x0             => movk x0, #:tprel_g0_nc:var
5947              bl __tls_get_addr          => mrs x1, tpidr_el0
5948              nop                        => add x0, x0, x1
5949            */
5950           rel[2].r_info = ELFNN_R_INFO (ELFNN_R_SYM (rel->r_info),
5951                                         AARCH64_R (TLSLE_MOVW_TPREL_G0_NC));
5952           rel[2].r_offset = rel->r_offset + 8;
5953
5954           bfd_putl32 (movz_hw_R0, contents + rel->r_offset + 0);
5955           bfd_putl32 (ldr_hw_R0, contents + rel->r_offset + 4);
5956           bfd_putl32 (movk_R0, contents + rel->r_offset + 8);
5957           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 12);
5958           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 16);
5959         }
5960       else
5961         {
5962           /* Large GD->IE relaxation:
5963              movz x0, #:tlsgd_g1:var    => movz x0, #:gottprel_g1:var, lsl #16
5964              movk x0, #:tlsgd_g0_nc:var => movk x0, #:gottprel_g0_nc:var
5965              add x0, gp, x0             => ldr x0, [gp, x0]
5966              bl __tls_get_addr          => mrs x1, tpidr_el0
5967              nop                        => add x0, x0, x1
5968            */
5969           rel[2].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
5970           bfd_putl32 (0xd2a80000, contents + rel->r_offset + 0);
5971           bfd_putl32 (ldr_R0, contents + rel->r_offset + 8);
5972           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 12);
5973           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 16);
5974         }
5975       return bfd_reloc_continue;
5976
5977     case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
5978       return bfd_reloc_continue;
5979 #endif
5980
5981     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
5982       return bfd_reloc_continue;
5983
5984     case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
5985       if (is_local)
5986         {
5987           /* GD->LE relaxation:
5988              ldr xd, [x0, #:tlsdesc_lo12:var]   =>   movk x0, :tprel_g0_nc:var
5989
5990              Where R is x for lp64 mode, and w for ILP32 mode.  */
5991           bfd_putl32 (movk_R0, contents + rel->r_offset);
5992           return bfd_reloc_continue;
5993         }
5994       else
5995         {
5996           /* GD->IE relaxation:
5997              ldr xd, [x0, #:tlsdesc_lo12:var] => ldr R0, [x0, #:gottprel_lo12:var]
5998
5999              Where R is x for lp64 mode, and w for ILP32 mode.  */
6000           insn = bfd_getl32 (contents + rel->r_offset);
6001           bfd_putl32 (ldr_R0_mask (insn), contents + rel->r_offset);
6002           return bfd_reloc_continue;
6003         }
6004
6005     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6006       if (is_local)
6007         {
6008           /* GD->LE relaxation
6009              add  x0, #:tlsgd_lo12:var  => movk R0, :tprel_g0_nc:var
6010              bl   __tls_get_addr        => mrs  x1, tpidr_el0
6011              nop                        => add  R0, R1, R0
6012
6013              Where R is x for lp64 mode, and w for ILP32 mode.  */
6014
6015           /* First kill the tls_get_addr reloc on the bl instruction.  */
6016           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6017           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6018
6019           bfd_putl32 (movk_R0, contents + rel->r_offset);
6020           bfd_putl32 (0xd53bd041, contents + rel->r_offset + 4);
6021           bfd_putl32 (add_R0_R0_R1, contents + rel->r_offset + 8);
6022           return bfd_reloc_continue;
6023         }
6024       else
6025         {
6026           /* GD->IE relaxation
6027              ADD  x0, #:tlsgd_lo12:var  => ldr  R0, [x0, #:gottprel_lo12:var]
6028              BL   __tls_get_addr        => mrs  x1, tpidr_el0
6029                R_AARCH64_CALL26
6030              NOP                        => add  R0, R1, R0
6031
6032              Where R is x for lp64 mode, and w for ilp32 mode.  */
6033
6034           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6035
6036           /* Remove the relocation on the BL instruction.  */
6037           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6038
6039           /* We choose to fixup the BL and NOP instructions using the
6040              offset from the second relocation to allow flexibility in
6041              scheduling instructions between the ADD and BL.  */
6042           bfd_putl32 (ldr_R0_x0, contents + rel->r_offset);
6043           bfd_putl32 (0xd53bd041, contents + rel[1].r_offset);
6044           bfd_putl32 (add_R0_R0_R1, contents + rel[1].r_offset + 4);
6045           return bfd_reloc_continue;
6046         }
6047
6048     case BFD_RELOC_AARCH64_TLSDESC_ADD:
6049     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
6050     case BFD_RELOC_AARCH64_TLSDESC_CALL:
6051       /* GD->IE/LE relaxation:
6052          add x0, x0, #:tlsdesc_lo12:var   =>   nop
6053          blr xd                           =>   nop
6054        */
6055       bfd_putl32 (INSN_NOP, contents + rel->r_offset);
6056       return bfd_reloc_ok;
6057
6058     case BFD_RELOC_AARCH64_TLSDESC_LDR:
6059       if (is_local)
6060         {
6061           /* GD->LE relaxation:
6062              ldr xd, [gp, xn]   =>   movk R0, #:tprel_g0_nc:var
6063
6064              Where R is x for lp64 mode, and w for ILP32 mode.  */
6065           bfd_putl32 (movk_R0, contents + rel->r_offset);
6066           return bfd_reloc_continue;
6067         }
6068       else
6069         {
6070           /* GD->IE relaxation:
6071              ldr xd, [gp, xn]   =>   ldr R0, [gp, xn]
6072
6073              Where R is x for lp64 mode, and w for ILP32 mode.  */
6074           insn = bfd_getl32 (contents + rel->r_offset);
6075           bfd_putl32 (ldr_R0_mask (insn), contents + rel->r_offset);
6076           return bfd_reloc_ok;
6077         }
6078
6079     case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
6080       /* GD->LE relaxation:
6081          movk xd, #:tlsdesc_off_g0_nc:var => movk R0, #:tprel_g1_nc:var, lsl #16
6082          GD->IE relaxation:
6083          movk xd, #:tlsdesc_off_g0_nc:var => movk Rd, #:gottprel_g0_nc:var
6084
6085          Where R is x for lp64 mode, and w for ILP32 mode.  */
6086       if (is_local)
6087         bfd_putl32 (ldr_hw_R0, contents + rel->r_offset);
6088       return bfd_reloc_continue;
6089
6090     case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
6091       if (is_local)
6092         {
6093           /* GD->LE relaxation:
6094              movz xd, #:tlsdesc_off_g1:var => movz R0, #:tprel_g2:var, lsl #32
6095
6096              Where R is x for lp64 mode, and w for ILP32 mode.  */
6097           bfd_putl32 (movz_hw_R0, contents + rel->r_offset);
6098           return bfd_reloc_continue;
6099         }
6100       else
6101         {
6102           /*  GD->IE relaxation:
6103               movz xd, #:tlsdesc_off_g1:var => movz Rd, #:gottprel_g1:var, lsl #16
6104
6105              Where R is x for lp64 mode, and w for ILP32 mode.  */
6106           insn = bfd_getl32 (contents + rel->r_offset);
6107           bfd_putl32 (movz_R0 | (insn & 0x1f), contents + rel->r_offset);
6108           return bfd_reloc_continue;
6109         }
6110
6111     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6112       /* IE->LE relaxation:
6113          adrp xd, :gottprel:var   =>   movz Rd, :tprel_g1:var
6114
6115          Where R is x for lp64 mode, and w for ILP32 mode.  */
6116       if (is_local)
6117         {
6118           insn = bfd_getl32 (contents + rel->r_offset);
6119           bfd_putl32 (movz_R0 | (insn & 0x1f), contents + rel->r_offset);
6120         }
6121       return bfd_reloc_continue;
6122
6123     case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
6124       /* IE->LE relaxation:
6125          ldr  xd, [xm, #:gottprel_lo12:var]   =>   movk Rd, :tprel_g0_nc:var
6126
6127          Where R is x for lp64 mode, and w for ILP32 mode.  */
6128       if (is_local)
6129         {
6130           insn = bfd_getl32 (contents + rel->r_offset);
6131           bfd_putl32 (movk_R0 | (insn & 0x1f), contents + rel->r_offset);
6132         }
6133       return bfd_reloc_continue;
6134
6135     case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
6136       /* LD->LE relaxation (tiny):
6137          adr  x0, :tlsldm:x  => mrs x0, tpidr_el0
6138          bl   __tls_get_addr => add R0, R0, TCB_SIZE
6139
6140          Where R is x for lp64 mode, and w for ilp32 mode.  */
6141       if (is_local)
6142         {
6143           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6144           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6145           /* No need of CALL26 relocation for tls_get_addr.  */
6146           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6147           bfd_putl32 (0xd53bd040, contents + rel->r_offset + 0);
6148           bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10),
6149                       contents + rel->r_offset + 4);
6150           return bfd_reloc_ok;
6151         }
6152       return bfd_reloc_continue;
6153
6154     case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6155       /* LD->LE relaxation (small):
6156          adrp  x0, :tlsldm:x       => mrs x0, tpidr_el0
6157        */
6158       if (is_local)
6159         {
6160           bfd_putl32 (0xd53bd040, contents + rel->r_offset);
6161           return bfd_reloc_ok;
6162         }
6163       return bfd_reloc_continue;
6164
6165     case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
6166       /* LD->LE relaxation (small):
6167          add   x0, #:tlsldm_lo12:x => add R0, R0, TCB_SIZE
6168          bl   __tls_get_addr       => nop
6169
6170          Where R is x for lp64 mode, and w for ilp32 mode.  */
6171       if (is_local)
6172         {
6173           BFD_ASSERT (rel->r_offset + 4 == rel[1].r_offset);
6174           BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26));
6175           /* No need of CALL26 relocation for tls_get_addr.  */
6176           rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE);
6177           bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10),
6178                       contents + rel->r_offset + 0);
6179           bfd_putl32 (INSN_NOP, contents + rel->r_offset + 4);
6180           return bfd_reloc_ok;
6181         }
6182       return bfd_reloc_continue;
6183
6184     default:
6185       return bfd_reloc_continue;
6186     }
6187
6188   return bfd_reloc_ok;
6189 }
6190
6191 /* Relocate an AArch64 ELF section.  */
6192
6193 static bfd_boolean
6194 elfNN_aarch64_relocate_section (bfd *output_bfd,
6195                                 struct bfd_link_info *info,
6196                                 bfd *input_bfd,
6197                                 asection *input_section,
6198                                 bfd_byte *contents,
6199                                 Elf_Internal_Rela *relocs,
6200                                 Elf_Internal_Sym *local_syms,
6201                                 asection **local_sections)
6202 {
6203   Elf_Internal_Shdr *symtab_hdr;
6204   struct elf_link_hash_entry **sym_hashes;
6205   Elf_Internal_Rela *rel;
6206   Elf_Internal_Rela *relend;
6207   const char *name;
6208   struct elf_aarch64_link_hash_table *globals;
6209   bfd_boolean save_addend = FALSE;
6210   bfd_vma addend = 0;
6211
6212   globals = elf_aarch64_hash_table (info);
6213
6214   symtab_hdr = &elf_symtab_hdr (input_bfd);
6215   sym_hashes = elf_sym_hashes (input_bfd);
6216
6217   rel = relocs;
6218   relend = relocs + input_section->reloc_count;
6219   for (; rel < relend; rel++)
6220     {
6221       unsigned int r_type;
6222       bfd_reloc_code_real_type bfd_r_type;
6223       bfd_reloc_code_real_type relaxed_bfd_r_type;
6224       reloc_howto_type *howto;
6225       unsigned long r_symndx;
6226       Elf_Internal_Sym *sym;
6227       asection *sec;
6228       struct elf_link_hash_entry *h;
6229       bfd_vma relocation;
6230       bfd_reloc_status_type r;
6231       arelent bfd_reloc;
6232       char sym_type;
6233       bfd_boolean unresolved_reloc = FALSE;
6234       char *error_message = NULL;
6235
6236       r_symndx = ELFNN_R_SYM (rel->r_info);
6237       r_type = ELFNN_R_TYPE (rel->r_info);
6238
6239       bfd_reloc.howto = elfNN_aarch64_howto_from_type (input_bfd, r_type);
6240       howto = bfd_reloc.howto;
6241
6242       if (howto == NULL)
6243         return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
6244
6245       bfd_r_type = elfNN_aarch64_bfd_reloc_from_howto (howto);
6246
6247       h = NULL;
6248       sym = NULL;
6249       sec = NULL;
6250
6251       if (r_symndx < symtab_hdr->sh_info)
6252         {
6253           sym = local_syms + r_symndx;
6254           sym_type = ELFNN_ST_TYPE (sym->st_info);
6255           sec = local_sections[r_symndx];
6256
6257           /* An object file might have a reference to a local
6258              undefined symbol.  This is a daft object file, but we
6259              should at least do something about it.  */
6260           if (r_type != R_AARCH64_NONE && r_type != R_AARCH64_NULL
6261               && bfd_is_und_section (sec)
6262               && ELF_ST_BIND (sym->st_info) != STB_WEAK)
6263             (*info->callbacks->undefined_symbol)
6264               (info, bfd_elf_string_from_elf_section
6265                (input_bfd, symtab_hdr->sh_link, sym->st_name),
6266                input_bfd, input_section, rel->r_offset, TRUE);
6267
6268           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
6269
6270           /* Relocate against local STT_GNU_IFUNC symbol.  */
6271           if (!bfd_link_relocatable (info)
6272               && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
6273             {
6274               h = elfNN_aarch64_get_local_sym_hash (globals, input_bfd,
6275                                                     rel, FALSE);
6276               if (h == NULL)
6277                 abort ();
6278
6279               /* Set STT_GNU_IFUNC symbol value.  */
6280               h->root.u.def.value = sym->st_value;
6281               h->root.u.def.section = sec;
6282             }
6283         }
6284       else
6285         {
6286           bfd_boolean warned, ignored;
6287
6288           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
6289                                    r_symndx, symtab_hdr, sym_hashes,
6290                                    h, sec, relocation,
6291                                    unresolved_reloc, warned, ignored);
6292
6293           sym_type = h->type;
6294         }
6295
6296       if (sec != NULL && discarded_section (sec))
6297         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
6298                                          rel, 1, relend, howto, 0, contents);
6299
6300       if (bfd_link_relocatable (info))
6301         continue;
6302
6303       if (h != NULL)
6304         name = h->root.root.string;
6305       else
6306         {
6307           name = (bfd_elf_string_from_elf_section
6308                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
6309           if (name == NULL || *name == '\0')
6310             name = bfd_section_name (input_bfd, sec);
6311         }
6312
6313       if (r_symndx != 0
6314           && r_type != R_AARCH64_NONE
6315           && r_type != R_AARCH64_NULL
6316           && (h == NULL
6317               || h->root.type == bfd_link_hash_defined
6318               || h->root.type == bfd_link_hash_defweak)
6319           && IS_AARCH64_TLS_RELOC (bfd_r_type) != (sym_type == STT_TLS))
6320         {
6321           _bfd_error_handler
6322             ((sym_type == STT_TLS
6323               /* xgettext:c-format */
6324               ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
6325               /* xgettext:c-format */
6326               : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
6327              input_bfd,
6328              input_section, (uint64_t) rel->r_offset, howto->name, name);
6329         }
6330
6331       /* We relax only if we can see that there can be a valid transition
6332          from a reloc type to another.
6333          We call elfNN_aarch64_final_link_relocate unless we're completely
6334          done, i.e., the relaxation produced the final output we want.  */
6335
6336       relaxed_bfd_r_type = aarch64_tls_transition (input_bfd, info, r_type,
6337                                                    h, r_symndx);
6338       if (relaxed_bfd_r_type != bfd_r_type)
6339         {
6340           bfd_r_type = relaxed_bfd_r_type;
6341           howto = elfNN_aarch64_howto_from_bfd_reloc (bfd_r_type);
6342           BFD_ASSERT (howto != NULL);
6343           r_type = howto->type;
6344           r = elfNN_aarch64_tls_relax (globals, input_bfd, contents, rel, h);
6345           unresolved_reloc = 0;
6346         }
6347       else
6348         r = bfd_reloc_continue;
6349
6350       /* There may be multiple consecutive relocations for the
6351          same offset.  In that case we are supposed to treat the
6352          output of each relocation as the addend for the next.  */
6353       if (rel + 1 < relend
6354           && rel->r_offset == rel[1].r_offset
6355           && ELFNN_R_TYPE (rel[1].r_info) != R_AARCH64_NONE
6356           && ELFNN_R_TYPE (rel[1].r_info) != R_AARCH64_NULL)
6357         save_addend = TRUE;
6358       else
6359         save_addend = FALSE;
6360
6361       if (r == bfd_reloc_continue)
6362         r = elfNN_aarch64_final_link_relocate (howto, input_bfd, output_bfd,
6363                                                input_section, contents, rel,
6364                                                relocation, info, sec,
6365                                                h, &unresolved_reloc,
6366                                                save_addend, &addend, sym);
6367
6368       switch (elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type))
6369         {
6370         case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6371         case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
6372         case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
6373         case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
6374         case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
6375         case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
6376         case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6377         case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
6378           if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
6379             {
6380               bfd_boolean need_relocs = FALSE;
6381               bfd_byte *loc;
6382               int indx;
6383               bfd_vma off;
6384
6385               off = symbol_got_offset (input_bfd, h, r_symndx);
6386               indx = h && h->dynindx != -1 ? h->dynindx : 0;
6387
6388               need_relocs =
6389                 (!bfd_link_executable (info) || indx != 0) &&
6390                 (h == NULL
6391                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6392                  || h->root.type != bfd_link_hash_undefweak);
6393
6394               BFD_ASSERT (globals->root.srelgot != NULL);
6395
6396               if (need_relocs)
6397                 {
6398                   Elf_Internal_Rela rela;
6399                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPMOD));
6400                   rela.r_addend = 0;
6401                   rela.r_offset = globals->root.sgot->output_section->vma +
6402                     globals->root.sgot->output_offset + off;
6403
6404
6405                   loc = globals->root.srelgot->contents;
6406                   loc += globals->root.srelgot->reloc_count++
6407                     * RELOC_SIZE (htab);
6408                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6409
6410                   bfd_reloc_code_real_type real_type =
6411                     elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
6412
6413                   if (real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PREL21
6414                       || real_type == BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21
6415                       || real_type == BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC)
6416                     {
6417                       /* For local dynamic, don't generate DTPREL in any case.
6418                          Initialize the DTPREL slot into zero, so we get module
6419                          base address when invoke runtime TLS resolver.  */
6420                       bfd_put_NN (output_bfd, 0,
6421                                   globals->root.sgot->contents + off
6422                                   + GOT_ENTRY_SIZE);
6423                     }
6424                   else if (indx == 0)
6425                     {
6426                       bfd_put_NN (output_bfd,
6427                                   relocation - dtpoff_base (info),
6428                                   globals->root.sgot->contents + off
6429                                   + GOT_ENTRY_SIZE);
6430                     }
6431                   else
6432                     {
6433                       /* This TLS symbol is global. We emit a
6434                          relocation to fixup the tls offset at load
6435                          time.  */
6436                       rela.r_info =
6437                         ELFNN_R_INFO (indx, AARCH64_R (TLS_DTPREL));
6438                       rela.r_addend = 0;
6439                       rela.r_offset =
6440                         (globals->root.sgot->output_section->vma
6441                          + globals->root.sgot->output_offset + off
6442                          + GOT_ENTRY_SIZE);
6443
6444                       loc = globals->root.srelgot->contents;
6445                       loc += globals->root.srelgot->reloc_count++
6446                         * RELOC_SIZE (globals);
6447                       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6448                       bfd_put_NN (output_bfd, (bfd_vma) 0,
6449                                   globals->root.sgot->contents + off
6450                                   + GOT_ENTRY_SIZE);
6451                     }
6452                 }
6453               else
6454                 {
6455                   bfd_put_NN (output_bfd, (bfd_vma) 1,
6456                               globals->root.sgot->contents + off);
6457                   bfd_put_NN (output_bfd,
6458                               relocation - dtpoff_base (info),
6459                               globals->root.sgot->contents + off
6460                               + GOT_ENTRY_SIZE);
6461                 }
6462
6463               symbol_got_offset_mark (input_bfd, h, r_symndx);
6464             }
6465           break;
6466
6467         case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6468         case BFD_RELOC_AARCH64_TLSIE_LDNN_GOTTPREL_LO12_NC:
6469         case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
6470         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
6471         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
6472           if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
6473             {
6474               bfd_boolean need_relocs = FALSE;
6475               bfd_byte *loc;
6476               int indx;
6477               bfd_vma off;
6478
6479               off = symbol_got_offset (input_bfd, h, r_symndx);
6480
6481               indx = h && h->dynindx != -1 ? h->dynindx : 0;
6482
6483               need_relocs =
6484                 (!bfd_link_executable (info) || indx != 0) &&
6485                 (h == NULL
6486                  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6487                  || h->root.type != bfd_link_hash_undefweak);
6488
6489               BFD_ASSERT (globals->root.srelgot != NULL);
6490
6491               if (need_relocs)
6492                 {
6493                   Elf_Internal_Rela rela;
6494
6495                   if (indx == 0)
6496                     rela.r_addend = relocation - dtpoff_base (info);
6497                   else
6498                     rela.r_addend = 0;
6499
6500                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLS_TPREL));
6501                   rela.r_offset = globals->root.sgot->output_section->vma +
6502                     globals->root.sgot->output_offset + off;
6503
6504                   loc = globals->root.srelgot->contents;
6505                   loc += globals->root.srelgot->reloc_count++
6506                     * RELOC_SIZE (htab);
6507
6508                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6509
6510                   bfd_put_NN (output_bfd, rela.r_addend,
6511                               globals->root.sgot->contents + off);
6512                 }
6513               else
6514                 bfd_put_NN (output_bfd, relocation - tpoff_base (info),
6515                             globals->root.sgot->contents + off);
6516
6517               symbol_got_offset_mark (input_bfd, h, r_symndx);
6518             }
6519           break;
6520
6521         case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
6522         case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
6523         case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
6524         case BFD_RELOC_AARCH64_TLSDESC_LDNN_LO12_NC:
6525         case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
6526         case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
6527         case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
6528           if (! symbol_tlsdesc_got_offset_mark_p (input_bfd, h, r_symndx))
6529             {
6530               bfd_boolean need_relocs = FALSE;
6531               int indx = h && h->dynindx != -1 ? h->dynindx : 0;
6532               bfd_vma off = symbol_tlsdesc_got_offset (input_bfd, h, r_symndx);
6533
6534               need_relocs = (h == NULL
6535                              || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6536                              || h->root.type != bfd_link_hash_undefweak);
6537
6538               BFD_ASSERT (globals->root.srelgot != NULL);
6539               BFD_ASSERT (globals->root.sgot != NULL);
6540
6541               if (need_relocs)
6542                 {
6543                   bfd_byte *loc;
6544                   Elf_Internal_Rela rela;
6545                   rela.r_info = ELFNN_R_INFO (indx, AARCH64_R (TLSDESC));
6546
6547                   rela.r_addend = 0;
6548                   rela.r_offset = (globals->root.sgotplt->output_section->vma
6549                                    + globals->root.sgotplt->output_offset
6550                                    + off + globals->sgotplt_jump_table_size);
6551
6552                   if (indx == 0)
6553                     rela.r_addend = relocation - dtpoff_base (info);
6554
6555                   /* Allocate the next available slot in the PLT reloc
6556                      section to hold our R_AARCH64_TLSDESC, the next
6557                      available slot is determined from reloc_count,
6558                      which we step. But note, reloc_count was
6559                      artifically moved down while allocating slots for
6560                      real PLT relocs such that all of the PLT relocs
6561                      will fit above the initial reloc_count and the
6562                      extra stuff will fit below.  */
6563                   loc = globals->root.srelplt->contents;
6564                   loc += globals->root.srelplt->reloc_count++
6565                     * RELOC_SIZE (globals);
6566
6567                   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6568
6569                   bfd_put_NN (output_bfd, (bfd_vma) 0,
6570                               globals->root.sgotplt->contents + off +
6571                               globals->sgotplt_jump_table_size);
6572                   bfd_put_NN (output_bfd, (bfd_vma) 0,
6573                               globals->root.sgotplt->contents + off +
6574                               globals->sgotplt_jump_table_size +
6575                               GOT_ENTRY_SIZE);
6576                 }
6577
6578               symbol_tlsdesc_got_offset_mark (input_bfd, h, r_symndx);
6579             }
6580           break;
6581         default:
6582           break;
6583         }
6584
6585       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
6586          because such sections are not SEC_ALLOC and thus ld.so will
6587          not process them.  */
6588       if (unresolved_reloc
6589           && !((input_section->flags & SEC_DEBUGGING) != 0
6590                && h->def_dynamic)
6591           && _bfd_elf_section_offset (output_bfd, info, input_section,
6592                                       +rel->r_offset) != (bfd_vma) - 1)
6593         {
6594           _bfd_error_handler
6595             /* xgettext:c-format */
6596             (_("%pB(%pA+%#" PRIx64 "): "
6597                "unresolvable %s relocation against symbol `%s'"),
6598              input_bfd, input_section, (uint64_t) rel->r_offset, howto->name,
6599              h->root.root.string);
6600           return FALSE;
6601         }
6602
6603       if (r != bfd_reloc_ok && r != bfd_reloc_continue)
6604         {
6605           bfd_reloc_code_real_type real_r_type
6606             = elfNN_aarch64_bfd_reloc_from_type (input_bfd, r_type);
6607
6608           switch (r)
6609             {
6610             case bfd_reloc_overflow:
6611               (*info->callbacks->reloc_overflow)
6612                 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
6613                  input_bfd, input_section, rel->r_offset);
6614               if (real_r_type == BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15
6615                   || real_r_type == BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14)
6616                 {
6617                   (*info->callbacks->warning)
6618                     (info,
6619                      _("too many GOT entries for -fpic, "
6620                        "please recompile with -fPIC"),
6621                      name, input_bfd, input_section, rel->r_offset);
6622                   return FALSE;
6623                 }
6624               /* Overflow can occur when a variable is referenced with a type
6625                  that has a larger alignment than the type with which it was
6626                  declared. eg:
6627                    file1.c: extern int foo; int a (void) { return foo; }
6628                    file2.c: char bar, foo, baz;
6629                  If the variable is placed into a data section at an offset
6630                  that is incompatible with the larger alignment requirement
6631                  overflow will occur.  (Strictly speaking this is not overflow
6632                  but rather an alignment problem, but the bfd_reloc_ error
6633                  enum does not have a value to cover that situation).
6634
6635                  Try to catch this situation here and provide a more helpful
6636                  error message to the user.  */
6637               if (addend & ((1 << howto->rightshift) - 1)
6638                   /* FIXME: Are we testing all of the appropriate reloc
6639                      types here ?  */
6640                   && (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL
6641                       || real_r_type == BFD_RELOC_AARCH64_LDST16_LO12
6642                       || real_r_type == BFD_RELOC_AARCH64_LDST32_LO12
6643                       || real_r_type == BFD_RELOC_AARCH64_LDST64_LO12
6644                       || real_r_type == BFD_RELOC_AARCH64_LDST128_LO12))
6645                 {
6646                   info->callbacks->warning
6647                     (info, _("one possible cause of this error is that the \
6648 symbol is being referenced in the indicated code as if it had a larger \
6649 alignment than was declared where it was defined"),
6650                      name, input_bfd, input_section, rel->r_offset);
6651                 }
6652               break;
6653
6654             case bfd_reloc_undefined:
6655               (*info->callbacks->undefined_symbol)
6656                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
6657               break;
6658
6659             case bfd_reloc_outofrange:
6660               error_message = _("out of range");
6661               goto common_error;
6662
6663             case bfd_reloc_notsupported:
6664               error_message = _("unsupported relocation");
6665               goto common_error;
6666
6667             case bfd_reloc_dangerous:
6668               /* error_message should already be set.  */
6669               goto common_error;
6670
6671             default:
6672               error_message = _("unknown error");
6673               /* Fall through.  */
6674
6675             common_error:
6676               BFD_ASSERT (error_message != NULL);
6677               (*info->callbacks->reloc_dangerous)
6678                 (info, error_message, input_bfd, input_section, rel->r_offset);
6679               break;
6680             }
6681         }
6682
6683       if (!save_addend)
6684         addend = 0;
6685     }
6686
6687   return TRUE;
6688 }
6689
6690 /* Set the right machine number.  */
6691
6692 static bfd_boolean
6693 elfNN_aarch64_object_p (bfd *abfd)
6694 {
6695 #if ARCH_SIZE == 32
6696   bfd_default_set_arch_mach (abfd, bfd_arch_aarch64, bfd_mach_aarch64_ilp32);
6697 #else
6698   bfd_default_set_arch_mach (abfd, bfd_arch_aarch64, bfd_mach_aarch64);
6699 #endif
6700   return TRUE;
6701 }
6702
6703 /* Function to keep AArch64 specific flags in the ELF header.  */
6704
6705 static bfd_boolean
6706 elfNN_aarch64_set_private_flags (bfd *abfd, flagword flags)
6707 {
6708   if (elf_flags_init (abfd) && elf_elfheader (abfd)->e_flags != flags)
6709     {
6710     }
6711   else
6712     {
6713       elf_elfheader (abfd)->e_flags = flags;
6714       elf_flags_init (abfd) = TRUE;
6715     }
6716
6717   return TRUE;
6718 }
6719
6720 /* Merge backend specific data from an object file to the output
6721    object file when linking.  */
6722
6723 static bfd_boolean
6724 elfNN_aarch64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6725 {
6726   bfd *obfd = info->output_bfd;
6727   flagword out_flags;
6728   flagword in_flags;
6729   bfd_boolean flags_compatible = TRUE;
6730   asection *sec;
6731
6732   /* Check if we have the same endianess.  */
6733   if (!_bfd_generic_verify_endian_match (ibfd, info))
6734     return FALSE;
6735
6736   if (!is_aarch64_elf (ibfd) || !is_aarch64_elf (obfd))
6737     return TRUE;
6738
6739   /* The input BFD must have had its flags initialised.  */
6740   /* The following seems bogus to me -- The flags are initialized in
6741      the assembler but I don't think an elf_flags_init field is
6742      written into the object.  */
6743   /* BFD_ASSERT (elf_flags_init (ibfd)); */
6744
6745   in_flags = elf_elfheader (ibfd)->e_flags;
6746   out_flags = elf_elfheader (obfd)->e_flags;
6747
6748   if (!elf_flags_init (obfd))
6749     {
6750       /* If the input is the default architecture and had the default
6751          flags then do not bother setting the flags for the output
6752          architecture, instead allow future merges to do this.  If no
6753          future merges ever set these flags then they will retain their
6754          uninitialised values, which surprise surprise, correspond
6755          to the default values.  */
6756       if (bfd_get_arch_info (ibfd)->the_default
6757           && elf_elfheader (ibfd)->e_flags == 0)
6758         return TRUE;
6759
6760       elf_flags_init (obfd) = TRUE;
6761       elf_elfheader (obfd)->e_flags = in_flags;
6762
6763       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
6764           && bfd_get_arch_info (obfd)->the_default)
6765         return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
6766                                   bfd_get_mach (ibfd));
6767
6768       return TRUE;
6769     }
6770
6771   /* Identical flags must be compatible.  */
6772   if (in_flags == out_flags)
6773     return TRUE;
6774
6775   /* Check to see if the input BFD actually contains any sections.  If
6776      not, its flags may not have been initialised either, but it
6777      cannot actually cause any incompatiblity.  Do not short-circuit
6778      dynamic objects; their section list may be emptied by
6779      elf_link_add_object_symbols.
6780
6781      Also check to see if there are no code sections in the input.
6782      In this case there is no need to check for code specific flags.
6783      XXX - do we need to worry about floating-point format compatability
6784      in data sections ?  */
6785   if (!(ibfd->flags & DYNAMIC))
6786     {
6787       bfd_boolean null_input_bfd = TRUE;
6788       bfd_boolean only_data_sections = TRUE;
6789
6790       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6791         {
6792           if ((bfd_get_section_flags (ibfd, sec)
6793                & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6794               == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
6795             only_data_sections = FALSE;
6796
6797           null_input_bfd = FALSE;
6798           break;
6799         }
6800
6801       if (null_input_bfd || only_data_sections)
6802         return TRUE;
6803     }
6804
6805   return flags_compatible;
6806 }
6807
6808 /* Display the flags field.  */
6809
6810 static bfd_boolean
6811 elfNN_aarch64_print_private_bfd_data (bfd *abfd, void *ptr)
6812 {
6813   FILE *file = (FILE *) ptr;
6814   unsigned long flags;
6815
6816   BFD_ASSERT (abfd != NULL && ptr != NULL);
6817
6818   /* Print normal ELF private data.  */
6819   _bfd_elf_print_private_bfd_data (abfd, ptr);
6820
6821   flags = elf_elfheader (abfd)->e_flags;
6822   /* Ignore init flag - it may not be set, despite the flags field
6823      containing valid data.  */
6824
6825   /* xgettext:c-format */
6826   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
6827
6828   if (flags)
6829     fprintf (file, _("<Unrecognised flag bits set>"));
6830
6831   fputc ('\n', file);
6832
6833   return TRUE;
6834 }
6835
6836 /* Find dynamic relocs for H that apply to read-only sections.  */
6837
6838 static asection *
6839 readonly_dynrelocs (struct elf_link_hash_entry *h)
6840 {
6841   struct elf_dyn_relocs *p;
6842
6843   for (p = elf_aarch64_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
6844     {
6845       asection *s = p->sec->output_section;
6846
6847       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6848         return p->sec;
6849     }
6850   return NULL;
6851 }
6852
6853 /* Return true if we need copy relocation against EH.  */
6854
6855 static bfd_boolean
6856 need_copy_relocation_p (struct elf_aarch64_link_hash_entry *eh)
6857 {
6858   struct elf_dyn_relocs *p;
6859   asection *s;
6860
6861   for (p = eh->dyn_relocs; p != NULL; p = p->next)
6862     {
6863       /* If there is any pc-relative reference, we need to keep copy relocation
6864          to avoid propagating the relocation into runtime that current glibc
6865          does not support.  */
6866       if (p->pc_count)
6867         return TRUE;
6868
6869       s = p->sec->output_section;
6870       /* Need copy relocation if it's against read-only section.  */
6871       if (s != NULL && (s->flags & SEC_READONLY) != 0)
6872         return TRUE;
6873     }
6874
6875   return FALSE;
6876 }
6877
6878 /* Adjust a symbol defined by a dynamic object and referenced by a
6879    regular object.  The current definition is in some section of the
6880    dynamic object, but we're not including those sections.  We have to
6881    change the definition to something the rest of the link can
6882    understand.  */
6883
6884 static bfd_boolean
6885 elfNN_aarch64_adjust_dynamic_symbol (struct bfd_link_info *info,
6886                                      struct elf_link_hash_entry *h)
6887 {
6888   struct elf_aarch64_link_hash_table *htab;
6889   asection *s, *srel;
6890
6891   /* If this is a function, put it in the procedure linkage table.  We
6892      will fill in the contents of the procedure linkage table later,
6893      when we know the address of the .got section.  */
6894   if (h->type == STT_FUNC || h->type == STT_GNU_IFUNC || h->needs_plt)
6895     {
6896       if (h->plt.refcount <= 0
6897           || (h->type != STT_GNU_IFUNC
6898               && (SYMBOL_CALLS_LOCAL (info, h)
6899                   || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6900                       && h->root.type == bfd_link_hash_undefweak))))
6901         {
6902           /* This case can occur if we saw a CALL26 reloc in
6903              an input file, but the symbol wasn't referred to
6904              by a dynamic object or all references were
6905              garbage collected. In which case we can end up
6906              resolving.  */
6907           h->plt.offset = (bfd_vma) - 1;
6908           h->needs_plt = 0;
6909         }
6910
6911       return TRUE;
6912     }
6913   else
6914     /* Otherwise, reset to -1.  */
6915     h->plt.offset = (bfd_vma) - 1;
6916
6917
6918   /* If this is a weak symbol, and there is a real definition, the
6919      processor independent code will have arranged for us to see the
6920      real definition first, and we can just use the same value.  */
6921   if (h->is_weakalias)
6922     {
6923       struct elf_link_hash_entry *def = weakdef (h);
6924       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
6925       h->root.u.def.section = def->root.u.def.section;
6926       h->root.u.def.value = def->root.u.def.value;
6927       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
6928         h->non_got_ref = def->non_got_ref;
6929       return TRUE;
6930     }
6931
6932   /* If we are creating a shared library, we must presume that the
6933      only references to the symbol are via the global offset table.
6934      For such cases we need not do anything here; the relocations will
6935      be handled correctly by relocate_section.  */
6936   if (bfd_link_pic (info))
6937     return TRUE;
6938
6939   /* If there are no references to this symbol that do not use the
6940      GOT, we don't need to generate a copy reloc.  */
6941   if (!h->non_got_ref)
6942     return TRUE;
6943
6944   /* If -z nocopyreloc was given, we won't generate them either.  */
6945   if (info->nocopyreloc)
6946     {
6947       h->non_got_ref = 0;
6948       return TRUE;
6949     }
6950
6951   if (ELIMINATE_COPY_RELOCS)
6952     {
6953       struct elf_aarch64_link_hash_entry *eh;
6954       /* If we don't find any dynamic relocs in read-only sections, then
6955          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
6956       eh = (struct elf_aarch64_link_hash_entry *) h;
6957       if (!need_copy_relocation_p (eh))
6958         {
6959           h->non_got_ref = 0;
6960           return TRUE;
6961         }
6962     }
6963
6964   /* We must allocate the symbol in our .dynbss section, which will
6965      become part of the .bss section of the executable.  There will be
6966      an entry for this symbol in the .dynsym section.  The dynamic
6967      object will contain position independent code, so all references
6968      from the dynamic object to this symbol will go through the global
6969      offset table.  The dynamic linker will use the .dynsym entry to
6970      determine the address it must put in the global offset table, so
6971      both the dynamic object and the regular object will refer to the
6972      same memory location for the variable.  */
6973
6974   htab = elf_aarch64_hash_table (info);
6975
6976   /* We must generate a R_AARCH64_COPY reloc to tell the dynamic linker
6977      to copy the initial value out of the dynamic object and into the
6978      runtime process image.  */
6979   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
6980     {
6981       s = htab->root.sdynrelro;
6982       srel = htab->root.sreldynrelro;
6983     }
6984   else
6985     {
6986       s = htab->root.sdynbss;
6987       srel = htab->root.srelbss;
6988     }
6989   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
6990     {
6991       srel->size += RELOC_SIZE (htab);
6992       h->needs_copy = 1;
6993     }
6994
6995   return _bfd_elf_adjust_dynamic_copy (info, h, s);
6996
6997 }
6998
6999 static bfd_boolean
7000 elfNN_aarch64_allocate_local_symbols (bfd *abfd, unsigned number)
7001 {
7002   struct elf_aarch64_local_symbol *locals;
7003   locals = elf_aarch64_locals (abfd);
7004   if (locals == NULL)
7005     {
7006       locals = (struct elf_aarch64_local_symbol *)
7007         bfd_zalloc (abfd, number * sizeof (struct elf_aarch64_local_symbol));
7008       if (locals == NULL)
7009         return FALSE;
7010       elf_aarch64_locals (abfd) = locals;
7011     }
7012   return TRUE;
7013 }
7014
7015 /* Create the .got section to hold the global offset table.  */
7016
7017 static bfd_boolean
7018 aarch64_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
7019 {
7020   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7021   flagword flags;
7022   asection *s;
7023   struct elf_link_hash_entry *h;
7024   struct elf_link_hash_table *htab = elf_hash_table (info);
7025
7026   /* This function may be called more than once.  */
7027   if (htab->sgot != NULL)
7028     return TRUE;
7029
7030   flags = bed->dynamic_sec_flags;
7031
7032   s = bfd_make_section_anyway_with_flags (abfd,
7033                                           (bed->rela_plts_and_copies_p
7034                                            ? ".rela.got" : ".rel.got"),
7035                                           (bed->dynamic_sec_flags
7036                                            | SEC_READONLY));
7037   if (s == NULL
7038       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
7039     return FALSE;
7040   htab->srelgot = s;
7041
7042   s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
7043   if (s == NULL
7044       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
7045     return FALSE;
7046   htab->sgot = s;
7047   htab->sgot->size += GOT_ENTRY_SIZE;
7048
7049   if (bed->want_got_sym)
7050     {
7051       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
7052          (or .got.plt) section.  We don't do this in the linker script
7053          because we don't want to define the symbol if we are not creating
7054          a global offset table.  */
7055       h = _bfd_elf_define_linkage_sym (abfd, info, s,
7056                                        "_GLOBAL_OFFSET_TABLE_");
7057       elf_hash_table (info)->hgot = h;
7058       if (h == NULL)
7059         return FALSE;
7060     }
7061
7062   if (bed->want_got_plt)
7063     {
7064       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
7065       if (s == NULL
7066           || !bfd_set_section_alignment (abfd, s,
7067                                          bed->s->log_file_align))
7068         return FALSE;
7069       htab->sgotplt = s;
7070     }
7071
7072   /* The first bit of the global offset table is the header.  */
7073   s->size += bed->got_header_size;
7074
7075   return TRUE;
7076 }
7077
7078 /* Look through the relocs for a section during the first phase.  */
7079
7080 static bfd_boolean
7081 elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
7082                             asection *sec, const Elf_Internal_Rela *relocs)
7083 {
7084   Elf_Internal_Shdr *symtab_hdr;
7085   struct elf_link_hash_entry **sym_hashes;
7086   const Elf_Internal_Rela *rel;
7087   const Elf_Internal_Rela *rel_end;
7088   asection *sreloc;
7089
7090   struct elf_aarch64_link_hash_table *htab;
7091
7092   if (bfd_link_relocatable (info))
7093     return TRUE;
7094
7095   BFD_ASSERT (is_aarch64_elf (abfd));
7096
7097   htab = elf_aarch64_hash_table (info);
7098   sreloc = NULL;
7099
7100   symtab_hdr = &elf_symtab_hdr (abfd);
7101   sym_hashes = elf_sym_hashes (abfd);
7102
7103   rel_end = relocs + sec->reloc_count;
7104   for (rel = relocs; rel < rel_end; rel++)
7105     {
7106       struct elf_link_hash_entry *h;
7107       unsigned int r_symndx;
7108       unsigned int r_type;
7109       bfd_reloc_code_real_type bfd_r_type;
7110       Elf_Internal_Sym *isym;
7111
7112       r_symndx = ELFNN_R_SYM (rel->r_info);
7113       r_type = ELFNN_R_TYPE (rel->r_info);
7114
7115       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
7116         {
7117           /* xgettext:c-format */
7118           _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
7119           return FALSE;
7120         }
7121
7122       if (r_symndx < symtab_hdr->sh_info)
7123         {
7124           /* A local symbol.  */
7125           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
7126                                         abfd, r_symndx);
7127           if (isym == NULL)
7128             return FALSE;
7129
7130           /* Check relocation against local STT_GNU_IFUNC symbol.  */
7131           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
7132             {
7133               h = elfNN_aarch64_get_local_sym_hash (htab, abfd, rel,
7134                                                     TRUE);
7135               if (h == NULL)
7136                 return FALSE;
7137
7138               /* Fake a STT_GNU_IFUNC symbol.  */
7139               h->type = STT_GNU_IFUNC;
7140               h->def_regular = 1;
7141               h->ref_regular = 1;
7142               h->forced_local = 1;
7143               h->root.type = bfd_link_hash_defined;
7144             }
7145           else
7146             h = NULL;
7147         }
7148       else
7149         {
7150           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7151           while (h->root.type == bfd_link_hash_indirect
7152                  || h->root.type == bfd_link_hash_warning)
7153             h = (struct elf_link_hash_entry *) h->root.u.i.link;
7154         }
7155
7156       /* Could be done earlier, if h were already available.  */
7157       bfd_r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);
7158
7159       if (h != NULL)
7160         {
7161           /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
7162              This shows up in particular in an R_AARCH64_PREL64 in large model
7163              when calculating the pc-relative address to .got section which is
7164              used to initialize the gp register.  */
7165           if (h->root.root.string
7166               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
7167             {
7168               if (htab->root.dynobj == NULL)
7169                 htab->root.dynobj = abfd;
7170
7171               if (! aarch64_elf_create_got_section (htab->root.dynobj, info))
7172                 return FALSE;
7173
7174               BFD_ASSERT (h == htab->root.hgot);
7175             }
7176
7177           /* Create the ifunc sections for static executables.  If we
7178              never see an indirect function symbol nor we are building
7179              a static executable, those sections will be empty and
7180              won't appear in output.  */
7181           switch (bfd_r_type)
7182             {
7183             default:
7184               break;
7185
7186             case BFD_RELOC_AARCH64_ADD_LO12:
7187             case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
7188             case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
7189             case BFD_RELOC_AARCH64_CALL26:
7190             case BFD_RELOC_AARCH64_GOT_LD_PREL19:
7191             case BFD_RELOC_AARCH64_JUMP26:
7192             case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
7193             case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
7194             case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
7195             case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
7196             case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
7197             case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
7198             case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
7199             case BFD_RELOC_AARCH64_NN:
7200               if (htab->root.dynobj == NULL)
7201                 htab->root.dynobj = abfd;
7202               if (!_bfd_elf_create_ifunc_sections (htab->root.dynobj, info))
7203                 return FALSE;
7204               break;
7205             }
7206
7207           /* It is referenced by a non-shared object.  */
7208           h->ref_regular = 1;
7209         }
7210
7211       switch (bfd_r_type)
7212         {
7213         case BFD_RELOC_AARCH64_16:
7214 #if ARCH_SIZE == 64
7215         case BFD_RELOC_AARCH64_32:
7216 #endif
7217           if (bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0)
7218             {
7219               if (h != NULL
7220                   /* This is an absolute symbol.  It represents a value instead
7221                      of an address.  */
7222                   && ((h->root.type == bfd_link_hash_defined
7223                        && bfd_is_abs_section (h->root.u.def.section))
7224                       /* This is an undefined symbol.  */
7225                       || h->root.type == bfd_link_hash_undefined))
7226                 break;
7227
7228               /* For local symbols, defined global symbols in a non-ABS section,
7229                  it is assumed that the value is an address.  */
7230               int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7231               _bfd_error_handler
7232                 /* xgettext:c-format */
7233                 (_("%pB: relocation %s against `%s' can not be used when making "
7234                    "a shared object"),
7235                  abfd, elfNN_aarch64_howto_table[howto_index].name,
7236                  (h) ? h->root.root.string : "a local symbol");
7237               bfd_set_error (bfd_error_bad_value);
7238               return FALSE;
7239             }
7240           else
7241             break;
7242
7243         case BFD_RELOC_AARCH64_MOVW_G0_NC:
7244         case BFD_RELOC_AARCH64_MOVW_G1_NC:
7245         case BFD_RELOC_AARCH64_MOVW_G2_NC:
7246         case BFD_RELOC_AARCH64_MOVW_G3:
7247           if (bfd_link_pic (info))
7248             {
7249               int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7250               _bfd_error_handler
7251                 /* xgettext:c-format */
7252                 (_("%pB: relocation %s against `%s' can not be used when making "
7253                    "a shared object; recompile with -fPIC"),
7254                  abfd, elfNN_aarch64_howto_table[howto_index].name,
7255                  (h) ? h->root.root.string : "a local symbol");
7256               bfd_set_error (bfd_error_bad_value);
7257               return FALSE;
7258             }
7259           /* Fall through.  */
7260
7261         case BFD_RELOC_AARCH64_16_PCREL:
7262         case BFD_RELOC_AARCH64_32_PCREL:
7263         case BFD_RELOC_AARCH64_64_PCREL:
7264         case BFD_RELOC_AARCH64_ADD_LO12:
7265         case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
7266         case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
7267         case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
7268         case BFD_RELOC_AARCH64_LDST128_LO12:
7269         case BFD_RELOC_AARCH64_LDST16_LO12:
7270         case BFD_RELOC_AARCH64_LDST32_LO12:
7271         case BFD_RELOC_AARCH64_LDST64_LO12:
7272         case BFD_RELOC_AARCH64_LDST8_LO12:
7273         case BFD_RELOC_AARCH64_LD_LO19_PCREL:
7274           if (h == NULL || bfd_link_pic (info))
7275             break;
7276           /* Fall through.  */
7277
7278         case BFD_RELOC_AARCH64_NN:
7279
7280           /* We don't need to handle relocs into sections not going into
7281              the "real" output.  */
7282           if ((sec->flags & SEC_ALLOC) == 0)
7283             break;
7284
7285           if (h != NULL)
7286             {
7287               if (!bfd_link_pic (info))
7288                 h->non_got_ref = 1;
7289
7290               h->plt.refcount += 1;
7291               h->pointer_equality_needed = 1;
7292             }
7293
7294           /* No need to do anything if we're not creating a shared
7295              object.  */
7296           if (!(bfd_link_pic (info)
7297                 /* If on the other hand, we are creating an executable, we
7298                    may need to keep relocations for symbols satisfied by a
7299                    dynamic library if we manage to avoid copy relocs for the
7300                    symbol.
7301
7302                    NOTE: Currently, there is no support of copy relocs
7303                    elimination on pc-relative relocation types, because there is
7304                    no dynamic relocation support for them in glibc.  We still
7305                    record the dynamic symbol reference for them.  This is
7306                    because one symbol may be referenced by both absolute
7307                    relocation (for example, BFD_RELOC_AARCH64_NN) and
7308                    pc-relative relocation.  We need full symbol reference
7309                    information to make correct decision later in
7310                    elfNN_aarch64_adjust_dynamic_symbol.  */
7311                 || (ELIMINATE_COPY_RELOCS
7312                     && !bfd_link_pic (info)
7313                     && h != NULL
7314                     && (h->root.type == bfd_link_hash_defweak
7315                         || !h->def_regular))))
7316             break;
7317
7318           {
7319             struct elf_dyn_relocs *p;
7320             struct elf_dyn_relocs **head;
7321             int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START;
7322
7323             /* We must copy these reloc types into the output file.
7324                Create a reloc section in dynobj and make room for
7325                this reloc.  */
7326             if (sreloc == NULL)
7327               {
7328                 if (htab->root.dynobj == NULL)
7329                   htab->root.dynobj = abfd;
7330
7331                 sreloc = _bfd_elf_make_dynamic_reloc_section
7332                   (sec, htab->root.dynobj, LOG_FILE_ALIGN, abfd, /*rela? */ TRUE);
7333
7334                 if (sreloc == NULL)
7335                   return FALSE;
7336               }
7337
7338             /* If this is a global symbol, we count the number of
7339                relocations we need for this symbol.  */
7340             if (h != NULL)
7341               {
7342                 struct elf_aarch64_link_hash_entry *eh;
7343                 eh = (struct elf_aarch64_link_hash_entry *) h;
7344                 head = &eh->dyn_relocs;
7345               }
7346             else
7347               {
7348                 /* Track dynamic relocs needed for local syms too.
7349                    We really need local syms available to do this
7350                    easily.  Oh well.  */
7351
7352                 asection *s;
7353                 void **vpp;
7354
7355                 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
7356                                               abfd, r_symndx);
7357                 if (isym == NULL)
7358                   return FALSE;
7359
7360                 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
7361                 if (s == NULL)
7362                   s = sec;
7363
7364                 /* Beware of type punned pointers vs strict aliasing
7365                    rules.  */
7366                 vpp = &(elf_section_data (s)->local_dynrel);
7367                 head = (struct elf_dyn_relocs **) vpp;
7368               }
7369
7370             p = *head;
7371             if (p == NULL || p->sec != sec)
7372               {
7373                 bfd_size_type amt = sizeof *p;
7374                 p = ((struct elf_dyn_relocs *)
7375                      bfd_zalloc (htab->root.dynobj, amt));
7376                 if (p == NULL)
7377                   return FALSE;
7378                 p->next = *head;
7379                 *head = p;
7380                 p->sec = sec;
7381               }
7382
7383             p->count += 1;
7384
7385             if (elfNN_aarch64_howto_table[howto_index].pc_relative)
7386               p->pc_count += 1;
7387           }
7388           break;
7389
7390           /* RR: We probably want to keep a consistency check that
7391              there are no dangling GOT_PAGE relocs.  */
7392         case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
7393         case BFD_RELOC_AARCH64_GOT_LD_PREL19:
7394         case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
7395         case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
7396         case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
7397         case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
7398         case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
7399         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
7400         case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
7401         case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
7402         case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
7403         case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
7404         case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
7405         case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
7406         case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
7407         case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
7408         case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
7409         case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
7410         case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
7411         case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
7412         case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
7413         case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
7414         case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
7415         case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
7416         case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
7417         case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
7418         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
7419         case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
7420         case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
7421         case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
7422         case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
7423         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
7424         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
7425         case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
7426           {
7427             unsigned got_type;
7428             unsigned old_got_type;
7429
7430             got_type = aarch64_reloc_got_type (bfd_r_type);
7431
7432             if (h)
7433               {
7434                 h->got.refcount += 1;
7435                 old_got_type = elf_aarch64_hash_entry (h)->got_type;
7436               }
7437             else
7438               {
7439                 struct elf_aarch64_local_symbol *locals;
7440
7441                 if (!elfNN_aarch64_allocate_local_symbols
7442                     (abfd, symtab_hdr->sh_info))
7443                   return FALSE;
7444
7445                 locals = elf_aarch64_locals (abfd);
7446                 BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7447                 locals[r_symndx].got_refcount += 1;
7448                 old_got_type = locals[r_symndx].got_type;
7449               }
7450
7451             /* If a variable is accessed with both general dynamic TLS
7452                methods, two slots may be created.  */
7453             if (GOT_TLS_GD_ANY_P (old_got_type) && GOT_TLS_GD_ANY_P (got_type))
7454               got_type |= old_got_type;
7455
7456             /* We will already have issued an error message if there
7457                is a TLS/non-TLS mismatch, based on the symbol type.
7458                So just combine any TLS types needed.  */
7459             if (old_got_type != GOT_UNKNOWN && old_got_type != GOT_NORMAL
7460                 && got_type != GOT_NORMAL)
7461               got_type |= old_got_type;
7462
7463             /* If the symbol is accessed by both IE and GD methods, we
7464                are able to relax.  Turn off the GD flag, without
7465                messing up with any other kind of TLS types that may be
7466                involved.  */
7467             if ((got_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (got_type))
7468               got_type &= ~ (GOT_TLSDESC_GD | GOT_TLS_GD);
7469
7470             if (old_got_type != got_type)
7471               {
7472                 if (h != NULL)
7473                   elf_aarch64_hash_entry (h)->got_type = got_type;
7474                 else
7475                   {
7476                     struct elf_aarch64_local_symbol *locals;
7477                     locals = elf_aarch64_locals (abfd);
7478                     BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
7479                     locals[r_symndx].got_type = got_type;
7480                   }
7481               }
7482
7483             if (htab->root.dynobj == NULL)
7484               htab->root.dynobj = abfd;
7485             if (! aarch64_elf_create_got_section (htab->root.dynobj, info))
7486               return FALSE;
7487             break;
7488           }
7489
7490         case BFD_RELOC_AARCH64_CALL26:
7491         case BFD_RELOC_AARCH64_JUMP26:
7492           /* If this is a local symbol then we resolve it
7493              directly without creating a PLT entry.  */
7494           if (h == NULL)
7495             continue;
7496
7497           h->needs_plt = 1;
7498           if (h->plt.refcount <= 0)
7499             h->plt.refcount = 1;
7500           else
7501             h->plt.refcount += 1;
7502           break;
7503
7504         default:
7505           break;
7506         }
7507     }
7508
7509   return TRUE;
7510 }
7511
7512 /* Treat mapping symbols as special target symbols.  */
7513
7514 static bfd_boolean
7515 elfNN_aarch64_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED,
7516                                         asymbol *sym)
7517 {
7518   return bfd_is_aarch64_special_symbol_name (sym->name,
7519                                              BFD_AARCH64_SPECIAL_SYM_TYPE_ANY);
7520 }
7521
7522 /* This is a copy of elf_find_function () from elf.c except that
7523    AArch64 mapping symbols are ignored when looking for function names.  */
7524
7525 static bfd_boolean
7526 aarch64_elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
7527                            asymbol **symbols,
7528                            asection *section,
7529                            bfd_vma offset,
7530                            const char **filename_ptr,
7531                            const char **functionname_ptr)
7532 {
7533   const char *filename = NULL;
7534   asymbol *func = NULL;
7535   bfd_vma low_func = 0;
7536   asymbol **p;
7537
7538   for (p = symbols; *p != NULL; p++)
7539     {
7540       elf_symbol_type *q;
7541
7542       q = (elf_symbol_type *) * p;
7543
7544       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
7545         {
7546         default:
7547           break;
7548         case STT_FILE:
7549           filename = bfd_asymbol_name (&q->symbol);
7550           break;
7551         case STT_FUNC:
7552         case STT_NOTYPE:
7553           /* Skip mapping symbols.  */
7554           if ((q->symbol.flags & BSF_LOCAL)
7555               && (bfd_is_aarch64_special_symbol_name
7556                   (q->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY)))
7557             continue;
7558           /* Fall through.  */
7559           if (bfd_get_section (&q->symbol) == section
7560               && q->symbol.value >= low_func && q->symbol.value <= offset)
7561             {
7562               func = (asymbol *) q;
7563               low_func = q->symbol.value;
7564             }
7565           break;
7566         }
7567     }
7568
7569   if (func == NULL)
7570     return FALSE;
7571
7572   if (filename_ptr)
7573     *filename_ptr = filename;
7574   if (functionname_ptr)
7575     *functionname_ptr = bfd_asymbol_name (func);
7576
7577   return TRUE;
7578 }
7579
7580
7581 /* Find the nearest line to a particular section and offset, for error
7582    reporting.   This code is a duplicate of the code in elf.c, except
7583    that it uses aarch64_elf_find_function.  */
7584
7585 static bfd_boolean
7586 elfNN_aarch64_find_nearest_line (bfd *abfd,
7587                                  asymbol **symbols,
7588                                  asection *section,
7589                                  bfd_vma offset,
7590                                  const char **filename_ptr,
7591                                  const char **functionname_ptr,
7592                                  unsigned int *line_ptr,
7593                                  unsigned int *discriminator_ptr)
7594 {
7595   bfd_boolean found = FALSE;
7596
7597   if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
7598                                      filename_ptr, functionname_ptr,
7599                                      line_ptr, discriminator_ptr,
7600                                      dwarf_debug_sections, 0,
7601                                      &elf_tdata (abfd)->dwarf2_find_line_info))
7602     {
7603       if (!*functionname_ptr)
7604         aarch64_elf_find_function (abfd, symbols, section, offset,
7605                                    *filename_ptr ? NULL : filename_ptr,
7606                                    functionname_ptr);
7607
7608       return TRUE;
7609     }
7610
7611   /* Skip _bfd_dwarf1_find_nearest_line since no known AArch64
7612      toolchain uses DWARF1.  */
7613
7614   if (!_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
7615                                             &found, filename_ptr,
7616                                             functionname_ptr, line_ptr,
7617                                             &elf_tdata (abfd)->line_info))
7618     return FALSE;
7619
7620   if (found && (*functionname_ptr || *line_ptr))
7621     return TRUE;
7622
7623   if (symbols == NULL)
7624     return FALSE;
7625
7626   if (!aarch64_elf_find_function (abfd, symbols, section, offset,
7627                                   filename_ptr, functionname_ptr))
7628     return FALSE;
7629
7630   *line_ptr = 0;
7631   return TRUE;
7632 }
7633
7634 static bfd_boolean
7635 elfNN_aarch64_find_inliner_info (bfd *abfd,
7636                                  const char **filename_ptr,
7637                                  const char **functionname_ptr,
7638                                  unsigned int *line_ptr)
7639 {
7640   bfd_boolean found;
7641   found = _bfd_dwarf2_find_inliner_info
7642     (abfd, filename_ptr,
7643      functionname_ptr, line_ptr, &elf_tdata (abfd)->dwarf2_find_line_info);
7644   return found;
7645 }
7646
7647
7648 static void
7649 elfNN_aarch64_post_process_headers (bfd *abfd,
7650                                     struct bfd_link_info *link_info)
7651 {
7652   Elf_Internal_Ehdr *i_ehdrp;   /* ELF file header, internal form.  */
7653
7654   i_ehdrp = elf_elfheader (abfd);
7655   i_ehdrp->e_ident[EI_ABIVERSION] = AARCH64_ELF_ABI_VERSION;
7656
7657   _bfd_elf_post_process_headers (abfd, link_info);
7658 }
7659
7660 static enum elf_reloc_type_class
7661 elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
7662                                 const asection *rel_sec ATTRIBUTE_UNUSED,
7663                                 const Elf_Internal_Rela *rela)
7664 {
7665   struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
7666
7667   if (htab->root.dynsym != NULL
7668       && htab->root.dynsym->contents != NULL)
7669     {
7670       /* Check relocation against STT_GNU_IFUNC symbol if there are
7671          dynamic symbols.  */
7672       bfd *abfd = info->output_bfd;
7673       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7674       unsigned long r_symndx = ELFNN_R_SYM (rela->r_info);
7675       if (r_symndx != STN_UNDEF)
7676         {
7677           Elf_Internal_Sym sym;
7678           if (!bed->s->swap_symbol_in (abfd,
7679                                        (htab->root.dynsym->contents
7680                                         + r_symndx * bed->s->sizeof_sym),
7681                                        0, &sym))
7682             {
7683               /* xgettext:c-format */
7684               _bfd_error_handler (_("%pB symbol number %lu references"
7685                                     " nonexistent SHT_SYMTAB_SHNDX section"),
7686                                     abfd, r_symndx);
7687               /* Ideally an error class should be returned here.  */
7688             }
7689           else if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
7690             return reloc_class_ifunc;
7691         }
7692     }
7693
7694   switch ((int) ELFNN_R_TYPE (rela->r_info))
7695     {
7696     case AARCH64_R (IRELATIVE):
7697       return reloc_class_ifunc;
7698     case AARCH64_R (RELATIVE):
7699       return reloc_class_relative;
7700     case AARCH64_R (JUMP_SLOT):
7701       return reloc_class_plt;
7702     case AARCH64_R (COPY):
7703       return reloc_class_copy;
7704     default:
7705       return reloc_class_normal;
7706     }
7707 }
7708
7709 /* Handle an AArch64 specific section when reading an object file.  This is
7710    called when bfd_section_from_shdr finds a section with an unknown
7711    type.  */
7712
7713 static bfd_boolean
7714 elfNN_aarch64_section_from_shdr (bfd *abfd,
7715                                  Elf_Internal_Shdr *hdr,
7716                                  const char *name, int shindex)
7717 {
7718   /* There ought to be a place to keep ELF backend specific flags, but
7719      at the moment there isn't one.  We just keep track of the
7720      sections by their name, instead.  Fortunately, the ABI gives
7721      names for all the AArch64 specific sections, so we will probably get
7722      away with this.  */
7723   switch (hdr->sh_type)
7724     {
7725     case SHT_AARCH64_ATTRIBUTES:
7726       break;
7727
7728     default:
7729       return FALSE;
7730     }
7731
7732   if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7733     return FALSE;
7734
7735   return TRUE;
7736 }
7737
7738 /* A structure used to record a list of sections, independently
7739    of the next and prev fields in the asection structure.  */
7740 typedef struct section_list
7741 {
7742   asection *sec;
7743   struct section_list *next;
7744   struct section_list *prev;
7745 }
7746 section_list;
7747
7748 /* Unfortunately we need to keep a list of sections for which
7749    an _aarch64_elf_section_data structure has been allocated.  This
7750    is because it is possible for functions like elfNN_aarch64_write_section
7751    to be called on a section which has had an elf_data_structure
7752    allocated for it (and so the used_by_bfd field is valid) but
7753    for which the AArch64 extended version of this structure - the
7754    _aarch64_elf_section_data structure - has not been allocated.  */
7755 static section_list *sections_with_aarch64_elf_section_data = NULL;
7756
7757 static void
7758 record_section_with_aarch64_elf_section_data (asection *sec)
7759 {
7760   struct section_list *entry;
7761
7762   entry = bfd_malloc (sizeof (*entry));
7763   if (entry == NULL)
7764     return;
7765   entry->sec = sec;
7766   entry->next = sections_with_aarch64_elf_section_data;
7767   entry->prev = NULL;
7768   if (entry->next != NULL)
7769     entry->next->prev = entry;
7770   sections_with_aarch64_elf_section_data = entry;
7771 }
7772
7773 static struct section_list *
7774 find_aarch64_elf_section_entry (asection *sec)
7775 {
7776   struct section_list *entry;
7777   static struct section_list *last_entry = NULL;
7778
7779   /* This is a short cut for the typical case where the sections are added
7780      to the sections_with_aarch64_elf_section_data list in forward order and
7781      then looked up here in backwards order.  This makes a real difference
7782      to the ld-srec/sec64k.exp linker test.  */
7783   entry = sections_with_aarch64_elf_section_data;
7784   if (last_entry != NULL)
7785     {
7786       if (last_entry->sec == sec)
7787         entry = last_entry;
7788       else if (last_entry->next != NULL && last_entry->next->sec == sec)
7789         entry = last_entry->next;
7790     }
7791
7792   for (; entry; entry = entry->next)
7793     if (entry->sec == sec)
7794       break;
7795
7796   if (entry)
7797     /* Record the entry prior to this one - it is the entry we are
7798        most likely to want to locate next time.  Also this way if we
7799        have been called from
7800        unrecord_section_with_aarch64_elf_section_data () we will not
7801        be caching a pointer that is about to be freed.  */
7802     last_entry = entry->prev;
7803
7804   return entry;
7805 }
7806
7807 static void
7808 unrecord_section_with_aarch64_elf_section_data (asection *sec)
7809 {
7810   struct section_list *entry;
7811
7812   entry = find_aarch64_elf_section_entry (sec);
7813
7814   if (entry)
7815     {
7816       if (entry->prev != NULL)
7817         entry->prev->next = entry->next;
7818       if (entry->next != NULL)
7819         entry->next->prev = entry->prev;
7820       if (entry == sections_with_aarch64_elf_section_data)
7821         sections_with_aarch64_elf_section_data = entry->next;
7822       free (entry);
7823     }
7824 }
7825
7826
7827 typedef struct
7828 {
7829   void *finfo;
7830   struct bfd_link_info *info;
7831   asection *sec;
7832   int sec_shndx;
7833   int (*func) (void *, const char *, Elf_Internal_Sym *,
7834                asection *, struct elf_link_hash_entry *);
7835 } output_arch_syminfo;
7836
7837 enum map_symbol_type
7838 {
7839   AARCH64_MAP_INSN,
7840   AARCH64_MAP_DATA
7841 };
7842
7843
7844 /* Output a single mapping symbol.  */
7845
7846 static bfd_boolean
7847 elfNN_aarch64_output_map_sym (output_arch_syminfo *osi,
7848                               enum map_symbol_type type, bfd_vma offset)
7849 {
7850   static const char *names[2] = { "$x", "$d" };
7851   Elf_Internal_Sym sym;
7852
7853   sym.st_value = (osi->sec->output_section->vma
7854                   + osi->sec->output_offset + offset);
7855   sym.st_size = 0;
7856   sym.st_other = 0;
7857   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
7858   sym.st_shndx = osi->sec_shndx;
7859   return osi->func (osi->finfo, names[type], &sym, osi->sec, NULL) == 1;
7860 }
7861
7862 /* Output a single local symbol for a generated stub.  */
7863
7864 static bfd_boolean
7865 elfNN_aarch64_output_stub_sym (output_arch_syminfo *osi, const char *name,
7866                                bfd_vma offset, bfd_vma size)
7867 {
7868   Elf_Internal_Sym sym;
7869
7870   sym.st_value = (osi->sec->output_section->vma
7871                   + osi->sec->output_offset + offset);
7872   sym.st_size = size;
7873   sym.st_other = 0;
7874   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
7875   sym.st_shndx = osi->sec_shndx;
7876   return osi->func (osi->finfo, name, &sym, osi->sec, NULL) == 1;
7877 }
7878
7879 static bfd_boolean
7880 aarch64_map_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7881 {
7882   struct elf_aarch64_stub_hash_entry *stub_entry;
7883   asection *stub_sec;
7884   bfd_vma addr;
7885   char *stub_name;
7886   output_arch_syminfo *osi;
7887
7888   /* Massage our args to the form they really have.  */
7889   stub_entry = (struct elf_aarch64_stub_hash_entry *) gen_entry;
7890   osi = (output_arch_syminfo *) in_arg;
7891
7892   stub_sec = stub_entry->stub_sec;
7893
7894   /* Ensure this stub is attached to the current section being
7895      processed.  */
7896   if (stub_sec != osi->sec)
7897     return TRUE;
7898
7899   addr = (bfd_vma) stub_entry->stub_offset;
7900
7901   stub_name = stub_entry->output_name;
7902
7903   switch (stub_entry->stub_type)
7904     {
7905     case aarch64_stub_adrp_branch:
7906       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7907                                           sizeof (aarch64_adrp_branch_stub)))
7908         return FALSE;
7909       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7910         return FALSE;
7911       break;
7912     case aarch64_stub_long_branch:
7913       if (!elfNN_aarch64_output_stub_sym
7914           (osi, stub_name, addr, sizeof (aarch64_long_branch_stub)))
7915         return FALSE;
7916       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7917         return FALSE;
7918       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_DATA, addr + 16))
7919         return FALSE;
7920       break;
7921     case aarch64_stub_erratum_835769_veneer:
7922       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7923                                           sizeof (aarch64_erratum_835769_stub)))
7924         return FALSE;
7925       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7926         return FALSE;
7927       break;
7928     case aarch64_stub_erratum_843419_veneer:
7929       if (!elfNN_aarch64_output_stub_sym (osi, stub_name, addr,
7930                                           sizeof (aarch64_erratum_843419_stub)))
7931         return FALSE;
7932       if (!elfNN_aarch64_output_map_sym (osi, AARCH64_MAP_INSN, addr))
7933         return FALSE;
7934       break;
7935
7936     default:
7937       abort ();
7938     }
7939
7940   return TRUE;
7941 }
7942
7943 /* Output mapping symbols for linker generated sections.  */
7944
7945 static bfd_boolean
7946 elfNN_aarch64_output_arch_local_syms (bfd *output_bfd,
7947                                       struct bfd_link_info *info,
7948                                       void *finfo,
7949                                       int (*func) (void *, const char *,
7950                                                    Elf_Internal_Sym *,
7951                                                    asection *,
7952                                                    struct elf_link_hash_entry
7953                                                    *))
7954 {
7955   output_arch_syminfo osi;
7956   struct elf_aarch64_link_hash_table *htab;
7957
7958   htab = elf_aarch64_hash_table (info);
7959
7960   osi.finfo = finfo;
7961   osi.info = info;
7962   osi.func = func;
7963
7964   /* Long calls stubs.  */
7965   if (htab->stub_bfd && htab->stub_bfd->sections)
7966     {
7967       asection *stub_sec;
7968
7969       for (stub_sec = htab->stub_bfd->sections;
7970            stub_sec != NULL; stub_sec = stub_sec->next)
7971         {
7972           /* Ignore non-stub sections.  */
7973           if (!strstr (stub_sec->name, STUB_SUFFIX))
7974             continue;
7975
7976           osi.sec = stub_sec;
7977
7978           osi.sec_shndx = _bfd_elf_section_from_bfd_section
7979             (output_bfd, osi.sec->output_section);
7980
7981           /* The first instruction in a stub is always a branch.  */
7982           if (!elfNN_aarch64_output_map_sym (&osi, AARCH64_MAP_INSN, 0))
7983             return FALSE;
7984
7985           bfd_hash_traverse (&htab->stub_hash_table, aarch64_map_one_stub,
7986                              &osi);
7987         }
7988     }
7989
7990   /* Finally, output mapping symbols for the PLT.  */
7991   if (!htab->root.splt || htab->root.splt->size == 0)
7992     return TRUE;
7993
7994   osi.sec_shndx = _bfd_elf_section_from_bfd_section
7995     (output_bfd, htab->root.splt->output_section);
7996   osi.sec = htab->root.splt;
7997
7998   elfNN_aarch64_output_map_sym (&osi, AARCH64_MAP_INSN, 0);
7999
8000   return TRUE;
8001
8002 }
8003
8004 /* Allocate target specific section data.  */
8005
8006 static bfd_boolean
8007 elfNN_aarch64_new_section_hook (bfd *abfd, asection *sec)
8008 {
8009   if (!sec->used_by_bfd)
8010     {
8011       _aarch64_elf_section_data *sdata;
8012       bfd_size_type amt = sizeof (*sdata);
8013
8014       sdata = bfd_zalloc (abfd, amt);
8015       if (sdata == NULL)
8016         return FALSE;
8017       sec->used_by_bfd = sdata;
8018     }
8019
8020   record_section_with_aarch64_elf_section_data (sec);
8021
8022   return _bfd_elf_new_section_hook (abfd, sec);
8023 }
8024
8025
8026 static void
8027 unrecord_section_via_map_over_sections (bfd *abfd ATTRIBUTE_UNUSED,
8028                                         asection *sec,
8029                                         void *ignore ATTRIBUTE_UNUSED)
8030 {
8031   unrecord_section_with_aarch64_elf_section_data (sec);
8032 }
8033
8034 static bfd_boolean
8035 elfNN_aarch64_close_and_cleanup (bfd *abfd)
8036 {
8037   if (abfd->sections)
8038     bfd_map_over_sections (abfd,
8039                            unrecord_section_via_map_over_sections, NULL);
8040
8041   return _bfd_elf_close_and_cleanup (abfd);
8042 }
8043
8044 static bfd_boolean
8045 elfNN_aarch64_bfd_free_cached_info (bfd *abfd)
8046 {
8047   if (abfd->sections)
8048     bfd_map_over_sections (abfd,
8049                            unrecord_section_via_map_over_sections, NULL);
8050
8051   return _bfd_free_cached_info (abfd);
8052 }
8053
8054 /* Create dynamic sections. This is different from the ARM backend in that
8055    the got, plt, gotplt and their relocation sections are all created in the
8056    standard part of the bfd elf backend.  */
8057
8058 static bfd_boolean
8059 elfNN_aarch64_create_dynamic_sections (bfd *dynobj,
8060                                        struct bfd_link_info *info)
8061 {
8062   /* We need to create .got section.  */
8063   if (!aarch64_elf_create_got_section (dynobj, info))
8064     return FALSE;
8065
8066   return _bfd_elf_create_dynamic_sections (dynobj, info);
8067 }
8068
8069
8070 /* Allocate space in .plt, .got and associated reloc sections for
8071    dynamic relocs.  */
8072
8073 static bfd_boolean
8074 elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8075 {
8076   struct bfd_link_info *info;
8077   struct elf_aarch64_link_hash_table *htab;
8078   struct elf_aarch64_link_hash_entry *eh;
8079   struct elf_dyn_relocs *p;
8080
8081   /* An example of a bfd_link_hash_indirect symbol is versioned
8082      symbol. For example: __gxx_personality_v0(bfd_link_hash_indirect)
8083      -> __gxx_personality_v0(bfd_link_hash_defined)
8084
8085      There is no need to process bfd_link_hash_indirect symbols here
8086      because we will also be presented with the concrete instance of
8087      the symbol and elfNN_aarch64_copy_indirect_symbol () will have been
8088      called to copy all relevant data from the generic to the concrete
8089      symbol instance.  */
8090   if (h->root.type == bfd_link_hash_indirect)
8091     return TRUE;
8092
8093   if (h->root.type == bfd_link_hash_warning)
8094     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8095
8096   info = (struct bfd_link_info *) inf;
8097   htab = elf_aarch64_hash_table (info);
8098
8099   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
8100      here if it is defined and referenced in a non-shared object.  */
8101   if (h->type == STT_GNU_IFUNC
8102       && h->def_regular)
8103     return TRUE;
8104   else if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
8105     {
8106       /* Make sure this symbol is output as a dynamic symbol.
8107          Undefined weak syms won't yet be marked as dynamic.  */
8108       if (h->dynindx == -1 && !h->forced_local
8109           && h->root.type == bfd_link_hash_undefweak)
8110         {
8111           if (!bfd_elf_link_record_dynamic_symbol (info, h))
8112             return FALSE;
8113         }
8114
8115       if (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
8116         {
8117           asection *s = htab->root.splt;
8118
8119           /* If this is the first .plt entry, make room for the special
8120              first entry.  */
8121           if (s->size == 0)
8122             s->size += htab->plt_header_size;
8123
8124           h->plt.offset = s->size;
8125
8126           /* If this symbol is not defined in a regular file, and we are
8127              not generating a shared library, then set the symbol to this
8128              location in the .plt.  This is required to make function
8129              pointers compare as equal between the normal executable and
8130              the shared library.  */
8131           if (!bfd_link_pic (info) && !h->def_regular)
8132             {
8133               h->root.u.def.section = s;
8134               h->root.u.def.value = h->plt.offset;
8135             }
8136
8137           /* Make room for this entry. For now we only create the
8138              small model PLT entries. We later need to find a way
8139              of relaxing into these from the large model PLT entries.  */
8140           s->size += PLT_SMALL_ENTRY_SIZE;
8141
8142           /* We also need to make an entry in the .got.plt section, which
8143              will be placed in the .got section by the linker script.  */
8144           htab->root.sgotplt->size += GOT_ENTRY_SIZE;
8145
8146           /* We also need to make an entry in the .rela.plt section.  */
8147           htab->root.srelplt->size += RELOC_SIZE (htab);
8148
8149           /* We need to ensure that all GOT entries that serve the PLT
8150              are consecutive with the special GOT slots [0] [1] and
8151              [2]. Any addtional relocations, such as
8152              R_AARCH64_TLSDESC, must be placed after the PLT related
8153              entries.  We abuse the reloc_count such that during
8154              sizing we adjust reloc_count to indicate the number of
8155              PLT related reserved entries.  In subsequent phases when
8156              filling in the contents of the reloc entries, PLT related
8157              entries are placed by computing their PLT index (0
8158              .. reloc_count). While other none PLT relocs are placed
8159              at the slot indicated by reloc_count and reloc_count is
8160              updated.  */
8161
8162           htab->root.srelplt->reloc_count++;
8163         }
8164       else
8165         {
8166           h->plt.offset = (bfd_vma) - 1;
8167           h->needs_plt = 0;
8168         }
8169     }
8170   else
8171     {
8172       h->plt.offset = (bfd_vma) - 1;
8173       h->needs_plt = 0;
8174     }
8175
8176   eh = (struct elf_aarch64_link_hash_entry *) h;
8177   eh->tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
8178
8179   if (h->got.refcount > 0)
8180     {
8181       bfd_boolean dyn;
8182       unsigned got_type = elf_aarch64_hash_entry (h)->got_type;
8183
8184       h->got.offset = (bfd_vma) - 1;
8185
8186       dyn = htab->root.dynamic_sections_created;
8187
8188       /* Make sure this symbol is output as a dynamic symbol.
8189          Undefined weak syms won't yet be marked as dynamic.  */
8190       if (dyn && h->dynindx == -1 && !h->forced_local
8191           && h->root.type == bfd_link_hash_undefweak)
8192         {
8193           if (!bfd_elf_link_record_dynamic_symbol (info, h))
8194             return FALSE;
8195         }
8196
8197       if (got_type == GOT_UNKNOWN)
8198         {
8199         }
8200       else if (got_type == GOT_NORMAL)
8201         {
8202           h->got.offset = htab->root.sgot->size;
8203           htab->root.sgot->size += GOT_ENTRY_SIZE;
8204           if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8205                || h->root.type != bfd_link_hash_undefweak)
8206               && (bfd_link_pic (info)
8207                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
8208               /* Undefined weak symbol in static PIE resolves to 0 without
8209                  any dynamic relocations.  */
8210               && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8211             {
8212               htab->root.srelgot->size += RELOC_SIZE (htab);
8213             }
8214         }
8215       else
8216         {
8217           int indx;
8218           if (got_type & GOT_TLSDESC_GD)
8219             {
8220               eh->tlsdesc_got_jump_table_offset =
8221                 (htab->root.sgotplt->size
8222                  - aarch64_compute_jump_table_size (htab));
8223               htab->root.sgotplt->size += GOT_ENTRY_SIZE * 2;
8224               h->got.offset = (bfd_vma) - 2;
8225             }
8226
8227           if (got_type & GOT_TLS_GD)
8228             {
8229               h->got.offset = htab->root.sgot->size;
8230               htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
8231             }
8232
8233           if (got_type & GOT_TLS_IE)
8234             {
8235               h->got.offset = htab->root.sgot->size;
8236               htab->root.sgot->size += GOT_ENTRY_SIZE;
8237             }
8238
8239           indx = h && h->dynindx != -1 ? h->dynindx : 0;
8240           if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8241                || h->root.type != bfd_link_hash_undefweak)
8242               && (!bfd_link_executable (info)
8243                   || indx != 0
8244                   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
8245             {
8246               if (got_type & GOT_TLSDESC_GD)
8247                 {
8248                   htab->root.srelplt->size += RELOC_SIZE (htab);
8249                   /* Note reloc_count not incremented here!  We have
8250                      already adjusted reloc_count for this relocation
8251                      type.  */
8252
8253                   /* TLSDESC PLT is now needed, but not yet determined.  */
8254                   htab->tlsdesc_plt = (bfd_vma) - 1;
8255                 }
8256
8257               if (got_type & GOT_TLS_GD)
8258                 htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
8259
8260               if (got_type & GOT_TLS_IE)
8261                 htab->root.srelgot->size += RELOC_SIZE (htab);
8262             }
8263         }
8264     }
8265   else
8266     {
8267       h->got.offset = (bfd_vma) - 1;
8268     }
8269
8270   if (eh->dyn_relocs == NULL)
8271     return TRUE;
8272
8273   /* In the shared -Bsymbolic case, discard space allocated for
8274      dynamic pc-relative relocs against symbols which turn out to be
8275      defined in regular objects.  For the normal shared case, discard
8276      space for pc-relative relocs that have become local due to symbol
8277      visibility changes.  */
8278
8279   if (bfd_link_pic (info))
8280     {
8281       /* Relocs that use pc_count are those that appear on a call
8282          insn, or certain REL relocs that can generated via assembly.
8283          We want calls to protected symbols to resolve directly to the
8284          function rather than going via the plt.  If people want
8285          function pointer comparisons to work as expected then they
8286          should avoid writing weird assembly.  */
8287       if (SYMBOL_CALLS_LOCAL (info, h))
8288         {
8289           struct elf_dyn_relocs **pp;
8290
8291           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
8292             {
8293               p->count -= p->pc_count;
8294               p->pc_count = 0;
8295               if (p->count == 0)
8296                 *pp = p->next;
8297               else
8298                 pp = &p->next;
8299             }
8300         }
8301
8302       /* Also discard relocs on undefined weak syms with non-default
8303          visibility.  */
8304       if (eh->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak)
8305         {
8306           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
8307               || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8308             eh->dyn_relocs = NULL;
8309
8310           /* Make sure undefined weak symbols are output as a dynamic
8311              symbol in PIEs.  */
8312           else if (h->dynindx == -1
8313                    && !h->forced_local
8314                    && h->root.type == bfd_link_hash_undefweak
8315                    && !bfd_elf_link_record_dynamic_symbol (info, h))
8316             return FALSE;
8317         }
8318
8319     }
8320   else if (ELIMINATE_COPY_RELOCS)
8321     {
8322       /* For the non-shared case, discard space for relocs against
8323          symbols which turn out to need copy relocs or are not
8324          dynamic.  */
8325
8326       if (!h->non_got_ref
8327           && ((h->def_dynamic
8328                && !h->def_regular)
8329               || (htab->root.dynamic_sections_created
8330                   && (h->root.type == bfd_link_hash_undefweak
8331                       || h->root.type == bfd_link_hash_undefined))))
8332         {
8333           /* Make sure this symbol is output as a dynamic symbol.
8334              Undefined weak syms won't yet be marked as dynamic.  */
8335           if (h->dynindx == -1
8336               && !h->forced_local
8337               && h->root.type == bfd_link_hash_undefweak
8338               && !bfd_elf_link_record_dynamic_symbol (info, h))
8339             return FALSE;
8340
8341           /* If that succeeded, we know we'll be keeping all the
8342              relocs.  */
8343           if (h->dynindx != -1)
8344             goto keep;
8345         }
8346
8347       eh->dyn_relocs = NULL;
8348
8349     keep:;
8350     }
8351
8352   /* Finally, allocate space.  */
8353   for (p = eh->dyn_relocs; p != NULL; p = p->next)
8354     {
8355       asection *sreloc;
8356
8357       sreloc = elf_section_data (p->sec)->sreloc;
8358
8359       BFD_ASSERT (sreloc != NULL);
8360
8361       sreloc->size += p->count * RELOC_SIZE (htab);
8362     }
8363
8364   return TRUE;
8365 }
8366
8367 /* Allocate space in .plt, .got and associated reloc sections for
8368    ifunc dynamic relocs.  */
8369
8370 static bfd_boolean
8371 elfNN_aarch64_allocate_ifunc_dynrelocs (struct elf_link_hash_entry *h,
8372                                         void *inf)
8373 {
8374   struct bfd_link_info *info;
8375   struct elf_aarch64_link_hash_table *htab;
8376   struct elf_aarch64_link_hash_entry *eh;
8377
8378   /* An example of a bfd_link_hash_indirect symbol is versioned
8379      symbol. For example: __gxx_personality_v0(bfd_link_hash_indirect)
8380      -> __gxx_personality_v0(bfd_link_hash_defined)
8381
8382      There is no need to process bfd_link_hash_indirect symbols here
8383      because we will also be presented with the concrete instance of
8384      the symbol and elfNN_aarch64_copy_indirect_symbol () will have been
8385      called to copy all relevant data from the generic to the concrete
8386      symbol instance.  */
8387   if (h->root.type == bfd_link_hash_indirect)
8388     return TRUE;
8389
8390   if (h->root.type == bfd_link_hash_warning)
8391     h = (struct elf_link_hash_entry *) h->root.u.i.link;
8392
8393   info = (struct bfd_link_info *) inf;
8394   htab = elf_aarch64_hash_table (info);
8395
8396   eh = (struct elf_aarch64_link_hash_entry *) h;
8397
8398   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
8399      here if it is defined and referenced in a non-shared object.  */
8400   if (h->type == STT_GNU_IFUNC
8401       && h->def_regular)
8402     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
8403                                                &eh->dyn_relocs,
8404                                                NULL,
8405                                                htab->plt_entry_size,
8406                                                htab->plt_header_size,
8407                                                GOT_ENTRY_SIZE,
8408                                                FALSE);
8409   return TRUE;
8410 }
8411
8412 /* Allocate space in .plt, .got and associated reloc sections for
8413    local dynamic relocs.  */
8414
8415 static bfd_boolean
8416 elfNN_aarch64_allocate_local_dynrelocs (void **slot, void *inf)
8417 {
8418   struct elf_link_hash_entry *h
8419     = (struct elf_link_hash_entry *) *slot;
8420
8421   if (h->type != STT_GNU_IFUNC
8422       || !h->def_regular
8423       || !h->ref_regular
8424       || !h->forced_local
8425       || h->root.type != bfd_link_hash_defined)
8426     abort ();
8427
8428   return elfNN_aarch64_allocate_dynrelocs (h, inf);
8429 }
8430
8431 /* Allocate space in .plt, .got and associated reloc sections for
8432    local ifunc dynamic relocs.  */
8433
8434 static bfd_boolean
8435 elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf)
8436 {
8437   struct elf_link_hash_entry *h
8438     = (struct elf_link_hash_entry *) *slot;
8439
8440   if (h->type != STT_GNU_IFUNC
8441       || !h->def_regular
8442       || !h->ref_regular
8443       || !h->forced_local
8444       || h->root.type != bfd_link_hash_defined)
8445     abort ();
8446
8447   return elfNN_aarch64_allocate_ifunc_dynrelocs (h, inf);
8448 }
8449
8450 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
8451    read-only sections.  */
8452
8453 static bfd_boolean
8454 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
8455 {
8456   asection *sec;
8457
8458   if (h->root.type == bfd_link_hash_indirect)
8459     return TRUE;
8460
8461   sec = readonly_dynrelocs (h);
8462   if (sec != NULL)
8463     {
8464       struct bfd_link_info *info = (struct bfd_link_info *) info_p;
8465
8466       info->flags |= DF_TEXTREL;
8467       info->callbacks->minfo
8468         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
8469          sec->owner, h->root.root.string, sec);
8470
8471       /* Not an error, just cut short the traversal.  */
8472       return FALSE;
8473     }
8474   return TRUE;
8475 }
8476
8477 /* This is the most important function of all . Innocuosly named
8478    though !  */
8479
8480 static bfd_boolean
8481 elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
8482                                      struct bfd_link_info *info)
8483 {
8484   struct elf_aarch64_link_hash_table *htab;
8485   bfd *dynobj;
8486   asection *s;
8487   bfd_boolean relocs;
8488   bfd *ibfd;
8489
8490   htab = elf_aarch64_hash_table ((info));
8491   dynobj = htab->root.dynobj;
8492
8493   BFD_ASSERT (dynobj != NULL);
8494
8495   if (htab->root.dynamic_sections_created)
8496     {
8497       if (bfd_link_executable (info) && !info->nointerp)
8498         {
8499           s = bfd_get_linker_section (dynobj, ".interp");
8500           if (s == NULL)
8501             abort ();
8502           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
8503           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
8504         }
8505     }
8506
8507   /* Set up .got offsets for local syms, and space for local dynamic
8508      relocs.  */
8509   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8510     {
8511       struct elf_aarch64_local_symbol *locals = NULL;
8512       Elf_Internal_Shdr *symtab_hdr;
8513       asection *srel;
8514       unsigned int i;
8515
8516       if (!is_aarch64_elf (ibfd))
8517         continue;
8518
8519       for (s = ibfd->sections; s != NULL; s = s->next)
8520         {
8521           struct elf_dyn_relocs *p;
8522
8523           for (p = (struct elf_dyn_relocs *)
8524                (elf_section_data (s)->local_dynrel); p != NULL; p = p->next)
8525             {
8526               if (!bfd_is_abs_section (p->sec)
8527                   && bfd_is_abs_section (p->sec->output_section))
8528                 {
8529                   /* Input section has been discarded, either because
8530                      it is a copy of a linkonce section or due to
8531                      linker script /DISCARD/, so we'll be discarding
8532                      the relocs too.  */
8533                 }
8534               else if (p->count != 0)
8535                 {
8536                   srel = elf_section_data (p->sec)->sreloc;
8537                   srel->size += p->count * RELOC_SIZE (htab);
8538                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
8539                     info->flags |= DF_TEXTREL;
8540                 }
8541             }
8542         }
8543
8544       locals = elf_aarch64_locals (ibfd);
8545       if (!locals)
8546         continue;
8547
8548       symtab_hdr = &elf_symtab_hdr (ibfd);
8549       srel = htab->root.srelgot;
8550       for (i = 0; i < symtab_hdr->sh_info; i++)
8551         {
8552           locals[i].got_offset = (bfd_vma) - 1;
8553           locals[i].tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
8554           if (locals[i].got_refcount > 0)
8555             {
8556               unsigned got_type = locals[i].got_type;
8557               if (got_type & GOT_TLSDESC_GD)
8558                 {
8559                   locals[i].tlsdesc_got_jump_table_offset =
8560                     (htab->root.sgotplt->size
8561                      - aarch64_compute_jump_table_size (htab));
8562                   htab->root.sgotplt->size += GOT_ENTRY_SIZE * 2;
8563                   locals[i].got_offset = (bfd_vma) - 2;
8564                 }
8565
8566               if (got_type & GOT_TLS_GD)
8567                 {
8568                   locals[i].got_offset = htab->root.sgot->size;
8569                   htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
8570                 }
8571
8572               if (got_type & GOT_TLS_IE
8573                   || got_type & GOT_NORMAL)
8574                 {
8575                   locals[i].got_offset = htab->root.sgot->size;
8576                   htab->root.sgot->size += GOT_ENTRY_SIZE;
8577                 }
8578
8579               if (got_type == GOT_UNKNOWN)
8580                 {
8581                 }
8582
8583               if (bfd_link_pic (info))
8584                 {
8585                   if (got_type & GOT_TLSDESC_GD)
8586                     {
8587                       htab->root.srelplt->size += RELOC_SIZE (htab);
8588                       /* Note RELOC_COUNT not incremented here! */
8589                       htab->tlsdesc_plt = (bfd_vma) - 1;
8590                     }
8591
8592                   if (got_type & GOT_TLS_GD)
8593                     htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
8594
8595                   if (got_type & GOT_TLS_IE
8596                       || got_type & GOT_NORMAL)
8597                     htab->root.srelgot->size += RELOC_SIZE (htab);
8598                 }
8599             }
8600           else
8601             {
8602               locals[i].got_refcount = (bfd_vma) - 1;
8603             }
8604         }
8605     }
8606
8607
8608   /* Allocate global sym .plt and .got entries, and space for global
8609      sym dynamic relocs.  */
8610   elf_link_hash_traverse (&htab->root, elfNN_aarch64_allocate_dynrelocs,
8611                           info);
8612
8613   /* Allocate global ifunc sym .plt and .got entries, and space for global
8614      ifunc sym dynamic relocs.  */
8615   elf_link_hash_traverse (&htab->root, elfNN_aarch64_allocate_ifunc_dynrelocs,
8616                           info);
8617
8618   /* Allocate .plt and .got entries, and space for local symbols.  */
8619   htab_traverse (htab->loc_hash_table,
8620                  elfNN_aarch64_allocate_local_dynrelocs,
8621                  info);
8622
8623   /* Allocate .plt and .got entries, and space for local ifunc symbols.  */
8624   htab_traverse (htab->loc_hash_table,
8625                  elfNN_aarch64_allocate_local_ifunc_dynrelocs,
8626                  info);
8627
8628   /* For every jump slot reserved in the sgotplt, reloc_count is
8629      incremented.  However, when we reserve space for TLS descriptors,
8630      it's not incremented, so in order to compute the space reserved
8631      for them, it suffices to multiply the reloc count by the jump
8632      slot size.  */
8633
8634   if (htab->root.srelplt)
8635     htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);
8636
8637   if (htab->tlsdesc_plt)
8638     {
8639       if (htab->root.splt->size == 0)
8640         htab->root.splt->size += PLT_ENTRY_SIZE;
8641
8642       htab->tlsdesc_plt = htab->root.splt->size;
8643       htab->root.splt->size += PLT_TLSDESC_ENTRY_SIZE;
8644
8645       /* If we're not using lazy TLS relocations, don't generate the
8646          GOT entry required.  */
8647       if (!(info->flags & DF_BIND_NOW))
8648         {
8649           htab->dt_tlsdesc_got = htab->root.sgot->size;
8650           htab->root.sgot->size += GOT_ENTRY_SIZE;
8651         }
8652     }
8653
8654   /* Init mapping symbols information to use later to distingush between
8655      code and data while scanning for errata.  */
8656   if (htab->fix_erratum_835769 || htab->fix_erratum_843419)
8657     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8658       {
8659         if (!is_aarch64_elf (ibfd))
8660           continue;
8661         bfd_elfNN_aarch64_init_maps (ibfd);
8662       }
8663
8664   /* We now have determined the sizes of the various dynamic sections.
8665      Allocate memory for them.  */
8666   relocs = FALSE;
8667   for (s = dynobj->sections; s != NULL; s = s->next)
8668     {
8669       if ((s->flags & SEC_LINKER_CREATED) == 0)
8670         continue;
8671
8672       if (s == htab->root.splt
8673           || s == htab->root.sgot
8674           || s == htab->root.sgotplt
8675           || s == htab->root.iplt
8676           || s == htab->root.igotplt
8677           || s == htab->root.sdynbss
8678           || s == htab->root.sdynrelro)
8679         {
8680           /* Strip this section if we don't need it; see the
8681              comment below.  */
8682         }
8683       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
8684         {
8685           if (s->size != 0 && s != htab->root.srelplt)
8686             relocs = TRUE;
8687
8688           /* We use the reloc_count field as a counter if we need
8689              to copy relocs into the output file.  */
8690           if (s != htab->root.srelplt)
8691             s->reloc_count = 0;
8692         }
8693       else
8694         {
8695           /* It's not one of our sections, so don't allocate space.  */
8696           continue;
8697         }
8698
8699       if (s->size == 0)
8700         {
8701           /* If we don't need this section, strip it from the
8702              output file.  This is mostly to handle .rela.bss and
8703              .rela.plt.  We must create both sections in
8704              create_dynamic_sections, because they must be created
8705              before the linker maps input sections to output
8706              sections.  The linker does that before
8707              adjust_dynamic_symbol is called, and it is that
8708              function which decides whether anything needs to go
8709              into these sections.  */
8710           s->flags |= SEC_EXCLUDE;
8711           continue;
8712         }
8713
8714       if ((s->flags & SEC_HAS_CONTENTS) == 0)
8715         continue;
8716
8717       /* Allocate memory for the section contents.  We use bfd_zalloc
8718          here in case unused entries are not reclaimed before the
8719          section's contents are written out.  This should not happen,
8720          but this way if it does, we get a R_AARCH64_NONE reloc instead
8721          of garbage.  */
8722       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
8723       if (s->contents == NULL)
8724         return FALSE;
8725     }
8726
8727   if (htab->root.dynamic_sections_created)
8728     {
8729       /* Add some entries to the .dynamic section.  We fill in the
8730          values later, in elfNN_aarch64_finish_dynamic_sections, but we
8731          must add the entries now so that we get the correct size for
8732          the .dynamic section.  The DT_DEBUG entry is filled in by the
8733          dynamic linker and used by the debugger.  */
8734 #define add_dynamic_entry(TAG, VAL)                     \
8735       _bfd_elf_add_dynamic_entry (info, TAG, VAL)
8736
8737       if (bfd_link_executable (info))
8738         {
8739           if (!add_dynamic_entry (DT_DEBUG, 0))
8740             return FALSE;
8741         }
8742
8743       if (htab->root.splt->size != 0)
8744         {
8745           if (!add_dynamic_entry (DT_PLTGOT, 0)
8746               || !add_dynamic_entry (DT_PLTRELSZ, 0)
8747               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
8748               || !add_dynamic_entry (DT_JMPREL, 0))
8749             return FALSE;
8750
8751           if (htab->tlsdesc_plt
8752               && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
8753                   || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
8754             return FALSE;
8755         }
8756
8757       if (relocs)
8758         {
8759           if (!add_dynamic_entry (DT_RELA, 0)
8760               || !add_dynamic_entry (DT_RELASZ, 0)
8761               || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
8762             return FALSE;
8763
8764           /* If any dynamic relocs apply to a read-only section,
8765              then we need a DT_TEXTREL entry.  */
8766           if ((info->flags & DF_TEXTREL) == 0)
8767             elf_link_hash_traverse (&htab->root, maybe_set_textrel, info);
8768
8769           if ((info->flags & DF_TEXTREL) != 0)
8770             {
8771               if (!add_dynamic_entry (DT_TEXTREL, 0))
8772                 return FALSE;
8773             }
8774         }
8775     }
8776 #undef add_dynamic_entry
8777
8778   return TRUE;
8779 }
8780
8781 static inline void
8782 elf_aarch64_update_plt_entry (bfd *output_bfd,
8783                               bfd_reloc_code_real_type r_type,
8784                               bfd_byte *plt_entry, bfd_vma value)
8785 {
8786   reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (r_type);
8787
8788   /* FIXME: We should check the return value from this function call.  */
8789   (void) _bfd_aarch64_elf_put_addend (output_bfd, plt_entry, r_type, howto, value);
8790 }
8791
8792 static void
8793 elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
8794                                        struct elf_aarch64_link_hash_table
8795                                        *htab, bfd *output_bfd,
8796                                        struct bfd_link_info *info)
8797 {
8798   bfd_byte *plt_entry;
8799   bfd_vma plt_index;
8800   bfd_vma got_offset;
8801   bfd_vma gotplt_entry_address;
8802   bfd_vma plt_entry_address;
8803   Elf_Internal_Rela rela;
8804   bfd_byte *loc;
8805   asection *plt, *gotplt, *relplt;
8806
8807   /* When building a static executable, use .iplt, .igot.plt and
8808      .rela.iplt sections for STT_GNU_IFUNC symbols.  */
8809   if (htab->root.splt != NULL)
8810     {
8811       plt = htab->root.splt;
8812       gotplt = htab->root.sgotplt;
8813       relplt = htab->root.srelplt;
8814     }
8815   else
8816     {
8817       plt = htab->root.iplt;
8818       gotplt = htab->root.igotplt;
8819       relplt = htab->root.irelplt;
8820     }
8821
8822   /* Get the index in the procedure linkage table which
8823      corresponds to this symbol.  This is the index of this symbol
8824      in all the symbols for which we are making plt entries.  The
8825      first entry in the procedure linkage table is reserved.
8826
8827      Get the offset into the .got table of the entry that
8828      corresponds to this function.      Each .got entry is GOT_ENTRY_SIZE
8829      bytes. The first three are reserved for the dynamic linker.
8830
8831      For static executables, we don't reserve anything.  */
8832
8833   if (plt == htab->root.splt)
8834     {
8835       plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
8836       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
8837     }
8838   else
8839     {
8840       plt_index = h->plt.offset / htab->plt_entry_size;
8841       got_offset = plt_index * GOT_ENTRY_SIZE;
8842     }
8843
8844   plt_entry = plt->contents + h->plt.offset;
8845   plt_entry_address = plt->output_section->vma
8846     + plt->output_offset + h->plt.offset;
8847   gotplt_entry_address = gotplt->output_section->vma +
8848     gotplt->output_offset + got_offset;
8849
8850   /* Copy in the boiler-plate for the PLTn entry.  */
8851   memcpy (plt_entry, elfNN_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
8852
8853   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
8854      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
8855   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADR_HI21_PCREL,
8856                                 plt_entry,
8857                                 PG (gotplt_entry_address) -
8858                                 PG (plt_entry_address));
8859
8860   /* Fill in the lo12 bits for the load from the pltgot.  */
8861   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12,
8862                                 plt_entry + 4,
8863                                 PG_OFFSET (gotplt_entry_address));
8864
8865   /* Fill in the lo12 bits for the add from the pltgot entry.  */
8866   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12,
8867                                 plt_entry + 8,
8868                                 PG_OFFSET (gotplt_entry_address));
8869
8870   /* All the GOTPLT Entries are essentially initialized to PLT0.  */
8871   bfd_put_NN (output_bfd,
8872               plt->output_section->vma + plt->output_offset,
8873               gotplt->contents + got_offset);
8874
8875   rela.r_offset = gotplt_entry_address;
8876
8877   if (h->dynindx == -1
8878       || ((bfd_link_executable (info)
8879            || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8880           && h->def_regular
8881           && h->type == STT_GNU_IFUNC))
8882     {
8883       /* If an STT_GNU_IFUNC symbol is locally defined, generate
8884          R_AARCH64_IRELATIVE instead of R_AARCH64_JUMP_SLOT.  */
8885       rela.r_info = ELFNN_R_INFO (0, AARCH64_R (IRELATIVE));
8886       rela.r_addend = (h->root.u.def.value
8887                        + h->root.u.def.section->output_section->vma
8888                        + h->root.u.def.section->output_offset);
8889     }
8890   else
8891     {
8892       /* Fill in the entry in the .rela.plt section.  */
8893       rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (JUMP_SLOT));
8894       rela.r_addend = 0;
8895     }
8896
8897   /* Compute the relocation entry to used based on PLT index and do
8898      not adjust reloc_count. The reloc_count has already been adjusted
8899      to account for this entry.  */
8900   loc = relplt->contents + plt_index * RELOC_SIZE (htab);
8901   bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
8902 }
8903
8904 /* Size sections even though they're not dynamic.  We use it to setup
8905    _TLS_MODULE_BASE_, if needed.  */
8906
8907 static bfd_boolean
8908 elfNN_aarch64_always_size_sections (bfd *output_bfd,
8909                                     struct bfd_link_info *info)
8910 {
8911   asection *tls_sec;
8912
8913   if (bfd_link_relocatable (info))
8914     return TRUE;
8915
8916   tls_sec = elf_hash_table (info)->tls_sec;
8917
8918   if (tls_sec)
8919     {
8920       struct elf_link_hash_entry *tlsbase;
8921
8922       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
8923                                       "_TLS_MODULE_BASE_", TRUE, TRUE, FALSE);
8924
8925       if (tlsbase)
8926         {
8927           struct bfd_link_hash_entry *h = NULL;
8928           const struct elf_backend_data *bed =
8929             get_elf_backend_data (output_bfd);
8930
8931           if (!(_bfd_generic_link_add_one_symbol
8932                 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
8933                  tls_sec, 0, NULL, FALSE, bed->collect, &h)))
8934             return FALSE;
8935
8936           tlsbase->type = STT_TLS;
8937           tlsbase = (struct elf_link_hash_entry *) h;
8938           tlsbase->def_regular = 1;
8939           tlsbase->other = STV_HIDDEN;
8940           (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
8941         }
8942     }
8943
8944   return TRUE;
8945 }
8946
8947 /* Finish up dynamic symbol handling.  We set the contents of various
8948    dynamic sections here.  */
8949
8950 static bfd_boolean
8951 elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
8952                                      struct bfd_link_info *info,
8953                                      struct elf_link_hash_entry *h,
8954                                      Elf_Internal_Sym *sym)
8955 {
8956   struct elf_aarch64_link_hash_table *htab;
8957   htab = elf_aarch64_hash_table (info);
8958
8959   if (h->plt.offset != (bfd_vma) - 1)
8960     {
8961       asection *plt, *gotplt, *relplt;
8962
8963       /* This symbol has an entry in the procedure linkage table.  Set
8964          it up.  */
8965
8966       /* When building a static executable, use .iplt, .igot.plt and
8967          .rela.iplt sections for STT_GNU_IFUNC symbols.  */
8968       if (htab->root.splt != NULL)
8969         {
8970           plt = htab->root.splt;
8971           gotplt = htab->root.sgotplt;
8972           relplt = htab->root.srelplt;
8973         }
8974       else
8975         {
8976           plt = htab->root.iplt;
8977           gotplt = htab->root.igotplt;
8978           relplt = htab->root.irelplt;
8979         }
8980
8981       /* This symbol has an entry in the procedure linkage table.  Set
8982          it up.  */
8983       if ((h->dynindx == -1
8984            && !((h->forced_local || bfd_link_executable (info))
8985                 && h->def_regular
8986                 && h->type == STT_GNU_IFUNC))
8987           || plt == NULL
8988           || gotplt == NULL
8989           || relplt == NULL)
8990         return FALSE;
8991
8992       elfNN_aarch64_create_small_pltn_entry (h, htab, output_bfd, info);
8993       if (!h->def_regular)
8994         {
8995           /* Mark the symbol as undefined, rather than as defined in
8996              the .plt section.  */
8997           sym->st_shndx = SHN_UNDEF;
8998           /* If the symbol is weak we need to clear the value.
8999              Otherwise, the PLT entry would provide a definition for
9000              the symbol even if the symbol wasn't defined anywhere,
9001              and so the symbol would never be NULL.  Leave the value if
9002              there were any relocations where pointer equality matters
9003              (this is a clue for the dynamic linker, to make function
9004              pointer comparisons work between an application and shared
9005              library).  */
9006           if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
9007             sym->st_value = 0;
9008         }
9009     }
9010
9011   if (h->got.offset != (bfd_vma) - 1
9012       && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL
9013       /* Undefined weak symbol in static PIE resolves to 0 without
9014          any dynamic relocations.  */
9015       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9016     {
9017       Elf_Internal_Rela rela;
9018       bfd_byte *loc;
9019
9020       /* This symbol has an entry in the global offset table.  Set it
9021          up.  */
9022       if (htab->root.sgot == NULL || htab->root.srelgot == NULL)
9023         abort ();
9024
9025       rela.r_offset = (htab->root.sgot->output_section->vma
9026                        + htab->root.sgot->output_offset
9027                        + (h->got.offset & ~(bfd_vma) 1));
9028
9029       if (h->def_regular
9030           && h->type == STT_GNU_IFUNC)
9031         {
9032           if (bfd_link_pic (info))
9033             {
9034               /* Generate R_AARCH64_GLOB_DAT.  */
9035               goto do_glob_dat;
9036             }
9037           else
9038             {
9039               asection *plt;
9040
9041               if (!h->pointer_equality_needed)
9042                 abort ();
9043
9044               /* For non-shared object, we can't use .got.plt, which
9045                  contains the real function address if we need pointer
9046                  equality.  We load the GOT entry with the PLT entry.  */
9047               plt = htab->root.splt ? htab->root.splt : htab->root.iplt;
9048               bfd_put_NN (output_bfd, (plt->output_section->vma
9049                                        + plt->output_offset
9050                                        + h->plt.offset),
9051                           htab->root.sgot->contents
9052                           + (h->got.offset & ~(bfd_vma) 1));
9053               return TRUE;
9054             }
9055         }
9056       else if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
9057         {
9058           if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
9059             return FALSE;
9060
9061           BFD_ASSERT ((h->got.offset & 1) != 0);
9062           rela.r_info = ELFNN_R_INFO (0, AARCH64_R (RELATIVE));
9063           rela.r_addend = (h->root.u.def.value
9064                            + h->root.u.def.section->output_section->vma
9065                            + h->root.u.def.section->output_offset);
9066         }
9067       else
9068         {
9069 do_glob_dat:
9070           BFD_ASSERT ((h->got.offset & 1) == 0);
9071           bfd_put_NN (output_bfd, (bfd_vma) 0,
9072                       htab->root.sgot->contents + h->got.offset);
9073           rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT));
9074           rela.r_addend = 0;
9075         }
9076
9077       loc = htab->root.srelgot->contents;
9078       loc += htab->root.srelgot->reloc_count++ * RELOC_SIZE (htab);
9079       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
9080     }
9081
9082   if (h->needs_copy)
9083     {
9084       Elf_Internal_Rela rela;
9085       asection *s;
9086       bfd_byte *loc;
9087
9088       /* This symbol needs a copy reloc.  Set it up.  */
9089       if (h->dynindx == -1
9090           || (h->root.type != bfd_link_hash_defined
9091               && h->root.type != bfd_link_hash_defweak)
9092           || htab->root.srelbss == NULL)
9093         abort ();
9094
9095       rela.r_offset = (h->root.u.def.value
9096                        + h->root.u.def.section->output_section->vma
9097                        + h->root.u.def.section->output_offset);
9098       rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (COPY));
9099       rela.r_addend = 0;
9100       if (h->root.u.def.section == htab->root.sdynrelro)
9101         s = htab->root.sreldynrelro;
9102       else
9103         s = htab->root.srelbss;
9104       loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
9105       bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
9106     }
9107
9108   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  SYM may
9109      be NULL for local symbols.  */
9110   if (sym != NULL
9111       && (h == elf_hash_table (info)->hdynamic
9112           || h == elf_hash_table (info)->hgot))
9113     sym->st_shndx = SHN_ABS;
9114
9115   return TRUE;
9116 }
9117
9118 /* Finish up local dynamic symbol handling.  We set the contents of
9119    various dynamic sections here.  */
9120
9121 static bfd_boolean
9122 elfNN_aarch64_finish_local_dynamic_symbol (void **slot, void *inf)
9123 {
9124   struct elf_link_hash_entry *h
9125     = (struct elf_link_hash_entry *) *slot;
9126   struct bfd_link_info *info
9127     = (struct bfd_link_info *) inf;
9128
9129   return elfNN_aarch64_finish_dynamic_symbol (info->output_bfd,
9130                                               info, h, NULL);
9131 }
9132
9133 static void
9134 elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
9135                                      struct elf_aarch64_link_hash_table
9136                                      *htab)
9137 {
9138   /* Fill in PLT0. Fixme:RR Note this doesn't distinguish between
9139      small and large plts and at the minute just generates
9140      the small PLT.  */
9141
9142   /* PLT0 of the small PLT looks like this in ELF64 -
9143      stp x16, x30, [sp, #-16]!          // Save the reloc and lr on stack.
9144      adrp x16, PLT_GOT + 16             // Get the page base of the GOTPLT
9145      ldr  x17, [x16, #:lo12:PLT_GOT+16] // Load the address of the
9146                                         // symbol resolver
9147      add  x16, x16, #:lo12:PLT_GOT+16   // Load the lo12 bits of the
9148                                         // GOTPLT entry for this.
9149      br   x17
9150      PLT0 will be slightly different in ELF32 due to different got entry
9151      size.  */
9152   bfd_vma plt_got_2nd_ent;      /* Address of GOT[2].  */
9153   bfd_vma plt_base;
9154
9155
9156   memcpy (htab->root.splt->contents, elfNN_aarch64_small_plt0_entry,
9157           PLT_ENTRY_SIZE);
9158   elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize =
9159     PLT_ENTRY_SIZE;
9160
9161   plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma
9162                   + htab->root.sgotplt->output_offset
9163                   + GOT_ENTRY_SIZE * 2);
9164
9165   plt_base = htab->root.splt->output_section->vma +
9166     htab->root.splt->output_offset;
9167
9168   /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8.
9169      ADRP:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
9170   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9171                                 htab->root.splt->contents + 4,
9172                                 PG (plt_got_2nd_ent) - PG (plt_base + 4));
9173
9174   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_LDSTNN_LO12,
9175                                 htab->root.splt->contents + 8,
9176                                 PG_OFFSET (plt_got_2nd_ent));
9177
9178   elf_aarch64_update_plt_entry (output_bfd, BFD_RELOC_AARCH64_ADD_LO12,
9179                                 htab->root.splt->contents + 12,
9180                                 PG_OFFSET (plt_got_2nd_ent));
9181 }
9182
9183 static bfd_boolean
9184 elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
9185                                        struct bfd_link_info *info)
9186 {
9187   struct elf_aarch64_link_hash_table *htab;
9188   bfd *dynobj;
9189   asection *sdyn;
9190
9191   htab = elf_aarch64_hash_table (info);
9192   dynobj = htab->root.dynobj;
9193   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
9194
9195   if (htab->root.dynamic_sections_created)
9196     {
9197       ElfNN_External_Dyn *dyncon, *dynconend;
9198
9199       if (sdyn == NULL || htab->root.sgot == NULL)
9200         abort ();
9201
9202       dyncon = (ElfNN_External_Dyn *) sdyn->contents;
9203       dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
9204       for (; dyncon < dynconend; dyncon++)
9205         {
9206           Elf_Internal_Dyn dyn;
9207           asection *s;
9208
9209           bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
9210
9211           switch (dyn.d_tag)
9212             {
9213             default:
9214               continue;
9215
9216             case DT_PLTGOT:
9217               s = htab->root.sgotplt;
9218               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9219               break;
9220
9221             case DT_JMPREL:
9222               s = htab->root.srelplt;
9223               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9224               break;
9225
9226             case DT_PLTRELSZ:
9227               s = htab->root.srelplt;
9228               dyn.d_un.d_val = s->size;
9229               break;
9230
9231             case DT_TLSDESC_PLT:
9232               s = htab->root.splt;
9233               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
9234                 + htab->tlsdesc_plt;
9235               break;
9236
9237             case DT_TLSDESC_GOT:
9238               s = htab->root.sgot;
9239               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
9240                 + htab->dt_tlsdesc_got;
9241               break;
9242             }
9243
9244           bfd_elfNN_swap_dyn_out (output_bfd, &dyn, dyncon);
9245         }
9246
9247     }
9248
9249   /* Fill in the special first entry in the procedure linkage table.  */
9250   if (htab->root.splt && htab->root.splt->size > 0)
9251     {
9252       elfNN_aarch64_init_small_plt0_entry (output_bfd, htab);
9253
9254       elf_section_data (htab->root.splt->output_section)->
9255         this_hdr.sh_entsize = htab->plt_entry_size;
9256
9257
9258       if (htab->tlsdesc_plt)
9259         {
9260           bfd_put_NN (output_bfd, (bfd_vma) 0,
9261                       htab->root.sgot->contents + htab->dt_tlsdesc_got);
9262
9263           memcpy (htab->root.splt->contents + htab->tlsdesc_plt,
9264                   elfNN_aarch64_tlsdesc_small_plt_entry,
9265                   sizeof (elfNN_aarch64_tlsdesc_small_plt_entry));
9266
9267           {
9268             bfd_vma adrp1_addr =
9269               htab->root.splt->output_section->vma
9270               + htab->root.splt->output_offset + htab->tlsdesc_plt + 4;
9271
9272             bfd_vma adrp2_addr = adrp1_addr + 4;
9273
9274             bfd_vma got_addr =
9275               htab->root.sgot->output_section->vma
9276               + htab->root.sgot->output_offset;
9277
9278             bfd_vma pltgot_addr =
9279               htab->root.sgotplt->output_section->vma
9280               + htab->root.sgotplt->output_offset;
9281
9282             bfd_vma dt_tlsdesc_got = got_addr + htab->dt_tlsdesc_got;
9283
9284             bfd_byte *plt_entry =
9285               htab->root.splt->contents + htab->tlsdesc_plt;
9286
9287             /* adrp x2, DT_TLSDESC_GOT */
9288             elf_aarch64_update_plt_entry (output_bfd,
9289                                           BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9290                                           plt_entry + 4,
9291                                           (PG (dt_tlsdesc_got)
9292                                            - PG (adrp1_addr)));
9293
9294             /* adrp x3, 0 */
9295             elf_aarch64_update_plt_entry (output_bfd,
9296                                           BFD_RELOC_AARCH64_ADR_HI21_PCREL,
9297                                           plt_entry + 8,
9298                                           (PG (pltgot_addr)
9299                                            - PG (adrp2_addr)));
9300
9301             /* ldr x2, [x2, #0] */
9302             elf_aarch64_update_plt_entry (output_bfd,
9303                                           BFD_RELOC_AARCH64_LDSTNN_LO12,
9304                                           plt_entry + 12,
9305                                           PG_OFFSET (dt_tlsdesc_got));
9306
9307             /* add x3, x3, 0 */
9308             elf_aarch64_update_plt_entry (output_bfd,
9309                                           BFD_RELOC_AARCH64_ADD_LO12,
9310                                           plt_entry + 16,
9311                                           PG_OFFSET (pltgot_addr));
9312           }
9313         }
9314     }
9315
9316   if (htab->root.sgotplt)
9317     {
9318       if (bfd_is_abs_section (htab->root.sgotplt->output_section))
9319         {
9320           _bfd_error_handler
9321             (_("discarded output section: `%pA'"), htab->root.sgotplt);
9322           return FALSE;
9323         }
9324
9325       /* Fill in the first three entries in the global offset table.  */
9326       if (htab->root.sgotplt->size > 0)
9327         {
9328           bfd_put_NN (output_bfd, (bfd_vma) 0, htab->root.sgotplt->contents);
9329
9330           /* Write GOT[1] and GOT[2], needed for the dynamic linker.  */
9331           bfd_put_NN (output_bfd,
9332                       (bfd_vma) 0,
9333                       htab->root.sgotplt->contents + GOT_ENTRY_SIZE);
9334           bfd_put_NN (output_bfd,
9335                       (bfd_vma) 0,
9336                       htab->root.sgotplt->contents + GOT_ENTRY_SIZE * 2);
9337         }
9338
9339       if (htab->root.sgot)
9340         {
9341           if (htab->root.sgot->size > 0)
9342             {
9343               bfd_vma addr =
9344                 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0;
9345               bfd_put_NN (output_bfd, addr, htab->root.sgot->contents);
9346             }
9347         }
9348
9349       elf_section_data (htab->root.sgotplt->output_section)->
9350         this_hdr.sh_entsize = GOT_ENTRY_SIZE;
9351     }
9352
9353   if (htab->root.sgot && htab->root.sgot->size > 0)
9354     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize
9355       = GOT_ENTRY_SIZE;
9356
9357   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
9358   htab_traverse (htab->loc_hash_table,
9359                  elfNN_aarch64_finish_local_dynamic_symbol,
9360                  info);
9361
9362   return TRUE;
9363 }
9364
9365 /* Return address for Ith PLT stub in section PLT, for relocation REL
9366    or (bfd_vma) -1 if it should not be included.  */
9367
9368 static bfd_vma
9369 elfNN_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
9370                            const arelent *rel ATTRIBUTE_UNUSED)
9371 {
9372   return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
9373 }
9374
9375 /* Returns TRUE if NAME is an AArch64 mapping symbol.
9376    The ARM ELF standard defines $x (for A64 code) and $d (for data).
9377    It also allows a period initiated suffix to be added to the symbol, ie:
9378    "$[adtx]\.[:sym_char]+".  */
9379
9380 static bfd_boolean
9381 is_aarch64_mapping_symbol (const char * name)
9382 {
9383   return name != NULL /* Paranoia.  */
9384     && name[0] == '$' /* Note: if objcopy --prefix-symbols has been used then
9385                          the mapping symbols could have acquired a prefix.
9386                          We do not support this here, since such symbols no
9387                          longer conform to the ARM ELF ABI.  */
9388     && (name[1] == 'd' || name[1] == 'x')
9389     && (name[2] == 0 || name[2] == '.');
9390   /* FIXME: Strictly speaking the symbol is only a valid mapping symbol if
9391      any characters that follow the period are legal characters for the body
9392      of a symbol's name.  For now we just assume that this is the case.  */
9393 }
9394
9395 /* Make sure that mapping symbols in object files are not removed via the
9396    "strip --strip-unneeded" tool.  These symbols might needed in order to
9397    correctly generate linked files.  Once an object file has been linked,
9398    it should be safe to remove them.  */
9399
9400 static void
9401 elfNN_aarch64_backend_symbol_processing (bfd *abfd, asymbol *sym)
9402 {
9403   if (((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
9404       && sym->section != bfd_abs_section_ptr
9405       && is_aarch64_mapping_symbol (sym->name))
9406     sym->flags |= BSF_KEEP;
9407 }
9408
9409
9410 /* We use this so we can override certain functions
9411    (though currently we don't).  */
9412
9413 const struct elf_size_info elfNN_aarch64_size_info =
9414 {
9415   sizeof (ElfNN_External_Ehdr),
9416   sizeof (ElfNN_External_Phdr),
9417   sizeof (ElfNN_External_Shdr),
9418   sizeof (ElfNN_External_Rel),
9419   sizeof (ElfNN_External_Rela),
9420   sizeof (ElfNN_External_Sym),
9421   sizeof (ElfNN_External_Dyn),
9422   sizeof (Elf_External_Note),
9423   4,                            /* Hash table entry size.  */
9424   1,                            /* Internal relocs per external relocs.  */
9425   ARCH_SIZE,                    /* Arch size.  */
9426   LOG_FILE_ALIGN,               /* Log_file_align.  */
9427   ELFCLASSNN, EV_CURRENT,
9428   bfd_elfNN_write_out_phdrs,
9429   bfd_elfNN_write_shdrs_and_ehdr,
9430   bfd_elfNN_checksum_contents,
9431   bfd_elfNN_write_relocs,
9432   bfd_elfNN_swap_symbol_in,
9433   bfd_elfNN_swap_symbol_out,
9434   bfd_elfNN_slurp_reloc_table,
9435   bfd_elfNN_slurp_symbol_table,
9436   bfd_elfNN_swap_dyn_in,
9437   bfd_elfNN_swap_dyn_out,
9438   bfd_elfNN_swap_reloc_in,
9439   bfd_elfNN_swap_reloc_out,
9440   bfd_elfNN_swap_reloca_in,
9441   bfd_elfNN_swap_reloca_out
9442 };
9443
9444 #define ELF_ARCH                        bfd_arch_aarch64
9445 #define ELF_MACHINE_CODE                EM_AARCH64
9446 #define ELF_MAXPAGESIZE                 0x10000
9447 #define ELF_MINPAGESIZE                 0x1000
9448 #define ELF_COMMONPAGESIZE              0x1000
9449
9450 #define bfd_elfNN_close_and_cleanup             \
9451   elfNN_aarch64_close_and_cleanup
9452
9453 #define bfd_elfNN_bfd_free_cached_info          \
9454   elfNN_aarch64_bfd_free_cached_info
9455
9456 #define bfd_elfNN_bfd_is_target_special_symbol  \
9457   elfNN_aarch64_is_target_special_symbol
9458
9459 #define bfd_elfNN_bfd_link_hash_table_create    \
9460   elfNN_aarch64_link_hash_table_create
9461
9462 #define bfd_elfNN_bfd_merge_private_bfd_data    \
9463   elfNN_aarch64_merge_private_bfd_data
9464
9465 #define bfd_elfNN_bfd_print_private_bfd_data    \
9466   elfNN_aarch64_print_private_bfd_data
9467
9468 #define bfd_elfNN_bfd_reloc_type_lookup         \
9469   elfNN_aarch64_reloc_type_lookup
9470
9471 #define bfd_elfNN_bfd_reloc_name_lookup         \
9472   elfNN_aarch64_reloc_name_lookup
9473
9474 #define bfd_elfNN_bfd_set_private_flags         \
9475   elfNN_aarch64_set_private_flags
9476
9477 #define bfd_elfNN_find_inliner_info             \
9478   elfNN_aarch64_find_inliner_info
9479
9480 #define bfd_elfNN_find_nearest_line             \
9481   elfNN_aarch64_find_nearest_line
9482
9483 #define bfd_elfNN_mkobject                      \
9484   elfNN_aarch64_mkobject
9485
9486 #define bfd_elfNN_new_section_hook              \
9487   elfNN_aarch64_new_section_hook
9488
9489 #define elf_backend_adjust_dynamic_symbol       \
9490   elfNN_aarch64_adjust_dynamic_symbol
9491
9492 #define elf_backend_always_size_sections        \
9493   elfNN_aarch64_always_size_sections
9494
9495 #define elf_backend_check_relocs                \
9496   elfNN_aarch64_check_relocs
9497
9498 #define elf_backend_copy_indirect_symbol        \
9499   elfNN_aarch64_copy_indirect_symbol
9500
9501 /* Create .dynbss, and .rela.bss sections in DYNOBJ, and set up shortcuts
9502    to them in our hash.  */
9503 #define elf_backend_create_dynamic_sections     \
9504   elfNN_aarch64_create_dynamic_sections
9505
9506 #define elf_backend_init_index_section          \
9507   _bfd_elf_init_2_index_sections
9508
9509 #define elf_backend_finish_dynamic_sections     \
9510   elfNN_aarch64_finish_dynamic_sections
9511
9512 #define elf_backend_finish_dynamic_symbol       \
9513   elfNN_aarch64_finish_dynamic_symbol
9514
9515 #define elf_backend_object_p                    \
9516   elfNN_aarch64_object_p
9517
9518 #define elf_backend_output_arch_local_syms      \
9519   elfNN_aarch64_output_arch_local_syms
9520
9521 #define elf_backend_plt_sym_val                 \
9522   elfNN_aarch64_plt_sym_val
9523
9524 #define elf_backend_post_process_headers        \
9525   elfNN_aarch64_post_process_headers
9526
9527 #define elf_backend_relocate_section            \
9528   elfNN_aarch64_relocate_section
9529
9530 #define elf_backend_reloc_type_class            \
9531   elfNN_aarch64_reloc_type_class
9532
9533 #define elf_backend_section_from_shdr           \
9534   elfNN_aarch64_section_from_shdr
9535
9536 #define elf_backend_size_dynamic_sections       \
9537   elfNN_aarch64_size_dynamic_sections
9538
9539 #define elf_backend_size_info                   \
9540   elfNN_aarch64_size_info
9541
9542 #define elf_backend_write_section               \
9543   elfNN_aarch64_write_section
9544
9545 #define elf_backend_symbol_processing           \
9546   elfNN_aarch64_backend_symbol_processing
9547
9548 #define elf_backend_can_refcount       1
9549 #define elf_backend_can_gc_sections    1
9550 #define elf_backend_plt_readonly       1
9551 #define elf_backend_want_got_plt       1
9552 #define elf_backend_want_plt_sym       0
9553 #define elf_backend_want_dynrelro      1
9554 #define elf_backend_may_use_rel_p      0
9555 #define elf_backend_may_use_rela_p     1
9556 #define elf_backend_default_use_rela_p 1
9557 #define elf_backend_rela_normal        1
9558 #define elf_backend_dtrel_excludes_plt 1
9559 #define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
9560 #define elf_backend_default_execstack  0
9561 #define elf_backend_extern_protected_data 1
9562 #define elf_backend_hash_symbol elf_aarch64_hash_symbol
9563
9564 #undef  elf_backend_obj_attrs_section
9565 #define elf_backend_obj_attrs_section           ".ARM.attributes"
9566
9567 #include "elfNN-target.h"
9568
9569 /* CloudABI support.  */
9570
9571 #undef  TARGET_LITTLE_SYM
9572 #define TARGET_LITTLE_SYM       aarch64_elfNN_le_cloudabi_vec
9573 #undef  TARGET_LITTLE_NAME
9574 #define TARGET_LITTLE_NAME      "elfNN-littleaarch64-cloudabi"
9575 #undef  TARGET_BIG_SYM
9576 #define TARGET_BIG_SYM          aarch64_elfNN_be_cloudabi_vec
9577 #undef  TARGET_BIG_NAME
9578 #define TARGET_BIG_NAME         "elfNN-bigaarch64-cloudabi"
9579
9580 #undef  ELF_OSABI
9581 #define ELF_OSABI               ELFOSABI_CLOUDABI
9582
9583 #undef  elfNN_bed
9584 #define elfNN_bed               elfNN_aarch64_cloudabi_bed
9585
9586 #include "elfNN-target.h"