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