1 /* AArch64-specific backend routines.
2 Copyright (C) 2009-2023 Free Software Foundation, Inc.
3 Contributed by ARM Ltd.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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/>. */
21 extern void bfd_elf64_aarch64_init_maps
24 extern void bfd_elf32_aarch64_init_maps
27 /* Types of PLTs based on the level of security. This would be a
28 bit-mask to denote which of the combinations of security features
30 - No security feature PLTs
31 - PLTs with BTI instruction
32 - PLTs with PAC instruction
36 PLT_NORMAL
= 0x0, /* Normal plts. */
37 PLT_BTI
= 0x1, /* plts with bti. */
38 PLT_PAC
= 0x2, /* plts with pointer authentication. */
39 PLT_BTI_PAC
= PLT_BTI
| PLT_PAC
42 /* To indicate if BTI is enabled with/without warning. */
45 BTI_NONE
= 0, /* BTI is not enabled. */
46 BTI_WARN
= 1, /* BTI is enabled with -z force-bti. */
47 } aarch64_enable_bti_type
;
49 /* A structure to encompass all information coming from BTI or PAC
50 related command line options. This involves the "PLT_TYPE" to determine
51 which version of PLTs to pick and "BTI_TYPE" to determine if
52 BTI should be turned on with any warnings. */
55 aarch64_plt_type plt_type
;
56 aarch64_enable_bti_type bti_type
;
57 } aarch64_bti_pac_info
;
59 /* An enum to define what kind of erratum fixes we should apply. This gives the
60 user a bit more control over the sequences we generate. */
63 ERRAT_NONE
= (1 << 0), /* No erratum workarounds allowed. */
64 ERRAT_ADR
= (1 << 1), /* Erratum workarounds using ADR allowed. */
65 ERRAT_ADRP
= (1 << 2), /* Erratum workarounds using ADRP are allowed. */
68 extern void bfd_elf64_aarch64_set_options
69 (bfd
*, struct bfd_link_info
*, int, int, int, int, erratum_84319_opts
, int,
70 aarch64_bti_pac_info
);
72 extern void bfd_elf32_aarch64_set_options
73 (bfd
*, struct bfd_link_info
*, int, int, int, int, erratum_84319_opts
, int,
74 aarch64_bti_pac_info
);
76 /* AArch64 stub generation support for ELF64. Called from the linker. */
77 extern int elf64_aarch64_setup_section_lists
78 (bfd
*, struct bfd_link_info
*);
79 extern void elf64_aarch64_next_input_section
80 (struct bfd_link_info
*, struct bfd_section
*);
81 extern bool elf64_aarch64_size_stubs
82 (bfd
*, bfd
*, struct bfd_link_info
*, bfd_signed_vma
,
83 struct bfd_section
* (*) (const char *, struct bfd_section
*),
85 extern bool elf64_aarch64_build_stubs
86 (struct bfd_link_info
*);
87 /* AArch64 stub generation support for ELF32. Called from the linker. */
88 extern int elf32_aarch64_setup_section_lists
89 (bfd
*, struct bfd_link_info
*);
90 extern void elf32_aarch64_next_input_section
91 (struct bfd_link_info
*, struct bfd_section
*);
92 extern bool elf32_aarch64_size_stubs
93 (bfd
*, bfd
*, struct bfd_link_info
*, bfd_signed_vma
,
94 struct bfd_section
* (*) (const char *, struct bfd_section
*),
96 extern bool elf32_aarch64_build_stubs
97 (struct bfd_link_info
*);
99 /* Take the PAGE component of an address or offset. */
100 #define PG(x) ((x) & ~ (bfd_vma) 0xfff)
101 #define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff)
103 #define AARCH64_ADR_OP 0x10000000
104 #define AARCH64_ADRP_OP 0x90000000
105 #define AARCH64_ADRP_OP_MASK 0x9F000000
107 extern bfd_signed_vma
108 _bfd_aarch64_sign_extend (bfd_vma
, int);
111 _bfd_aarch64_decode_adrp_imm (uint32_t);
114 _bfd_aarch64_reencode_adr_imm (uint32_t, uint32_t);
116 extern bfd_reloc_status_type
117 _bfd_aarch64_elf_put_addend (bfd
*, bfd_byte
*, bfd_reloc_code_real_type
,
118 reloc_howto_type
*, bfd_signed_vma
);
121 _bfd_aarch64_elf_resolve_relocation (bfd
*, bfd_reloc_code_real_type
, bfd_vma
,
122 bfd_vma
, bfd_vma
, bool);
125 _bfd_aarch64_elf_grok_prstatus (bfd
*, Elf_Internal_Note
*);
128 _bfd_aarch64_elf_grok_psinfo (bfd
*, Elf_Internal_Note
*);
131 _bfd_aarch64_elf_write_core_note (bfd
*, char *, int *, int, ...);
133 #define elf_backend_grok_prstatus _bfd_aarch64_elf_grok_prstatus
134 #define elf_backend_grok_psinfo _bfd_aarch64_elf_grok_psinfo
135 #define elf_backend_write_core_note _bfd_aarch64_elf_write_core_note
138 _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info
*,
141 extern enum elf_property_kind
142 _bfd_aarch64_elf_parse_gnu_properties (bfd
*, unsigned int,
143 bfd_byte
*, unsigned int);
146 _bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info
*, bfd
*,
147 elf_property
*, elf_property
*,
151 _bfd_aarch64_elf_link_fixup_gnu_properties (struct bfd_link_info
*,
152 elf_property_list
**);
154 #define elf_backend_parse_gnu_properties \
155 _bfd_aarch64_elf_parse_gnu_properties
157 #define elf_backend_fixup_gnu_properties \
158 _bfd_aarch64_elf_link_fixup_gnu_properties