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