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