Home | History | Annotate | Line # | Download | only in bfd
      1      1.1  christos /* AArch64-specific backend routines.
      2  1.1.1.9  christos    Copyright (C) 2009-2026 Free Software Foundation, Inc.
      3      1.1  christos    Contributed by ARM Ltd.
      4      1.1  christos 
      5      1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program; see the file COPYING3. If not,
     19      1.1  christos    see <http://www.gnu.org/licenses/>.  */
     20      1.1  christos 
     21  1.1.1.5  christos extern void bfd_elf64_aarch64_init_maps
     22  1.1.1.5  christos   (bfd *);
     23  1.1.1.5  christos 
     24  1.1.1.5  christos extern void bfd_elf32_aarch64_init_maps
     25  1.1.1.5  christos   (bfd *);
     26  1.1.1.5  christos 
     27  1.1.1.5  christos /* Types of PLTs based on the level of security.  This would be a
     28  1.1.1.5  christos    bit-mask to denote which of the combinations of security features
     29  1.1.1.5  christos    are enabled:
     30  1.1.1.5  christos    - No security feature PLTs
     31  1.1.1.5  christos    - PLTs with BTI instruction
     32  1.1.1.5  christos    - PLTs with PAC instruction
     33  1.1.1.5  christos */
     34  1.1.1.5  christos typedef enum
     35  1.1.1.5  christos {
     36  1.1.1.5  christos   PLT_NORMAL	= 0x0,  /* Normal plts.  */
     37  1.1.1.8  christos   PLT_BTI	= 0x1,  /* plts with BTI.  */
     38  1.1.1.5  christos   PLT_PAC	= 0x2,  /* plts with pointer authentication.  */
     39  1.1.1.5  christos   PLT_BTI_PAC	= PLT_BTI | PLT_PAC
     40  1.1.1.5  christos } aarch64_plt_type;
     41  1.1.1.5  christos 
     42  1.1.1.8  christos /* Indicates whether the linker should generate warnings, errors, or nothing
     43  1.1.1.8  christos    when input objects are missing GNU feature property markings and the output
     44  1.1.1.8  christos    has the markings.  */
     45  1.1.1.5  christos typedef enum
     46  1.1.1.5  christos {
     47  1.1.1.8  christos   MARKING_NONE	= 0,  /* Does not emit any warning/error messages.  */
     48  1.1.1.8  christos   MARKING_WARN	= 1,  /* Emit warning when the input objects are missing GNU
     49  1.1.1.8  christos 			 feature property markings, and the output has the
     50  1.1.1.8  christos 			 markings.  */
     51  1.1.1.8  christos   MARKING_ERROR	= 2,  /* Emit error when the input objects are missing GNU
     52  1.1.1.8  christos 			 feature property markings, and the output has the
     53  1.1.1.8  christos 			 markings.  */
     54  1.1.1.8  christos   MARKING_UNSET = 3,  /* The only purpose of this value is to simulate an
     55  1.1.1.8  christos 			 optional to detect when the value was not initialized
     56  1.1.1.8  christos 			 from the command line.  */
     57  1.1.1.8  christos } aarch64_feature_marking_report;
     58  1.1.1.8  christos 
     59  1.1.1.8  christos /* To indicate whether GNU_PROPERTY_AARCH64_FEATURE_1_GCS bit is
     60  1.1.1.8  christos    enabled/disabled on the output when -z gcs linker
     61  1.1.1.8  christos    command line option is passed.  */
     62  1.1.1.8  christos typedef enum
     63  1.1.1.8  christos {
     64  1.1.1.8  christos   GCS_NEVER	= 0,  /* gcs is disabled on output.  */
     65  1.1.1.8  christos   GCS_IMPLICIT  = 1,  /* gcs is deduced from input object.  */
     66  1.1.1.8  christos   GCS_ALWAYS	= 2,  /* gsc is enabled on output.  */
     67  1.1.1.8  christos } aarch64_gcs_type;
     68  1.1.1.8  christos 
     69  1.1.1.8  christos /* A structure to encompass all information about software protections coming
     70  1.1.1.8  christos    from BTI, PAC and GCS related command line options.  */
     71  1.1.1.8  christos struct aarch64_protection_opts
     72  1.1.1.5  christos {
     73  1.1.1.8  christos   /* PLT type to use depending on the selected software proctections.  */
     74  1.1.1.5  christos   aarch64_plt_type plt_type;
     75  1.1.1.8  christos 
     76  1.1.1.8  christos   /* Report level for BTI issues.  */
     77  1.1.1.8  christos   aarch64_feature_marking_report bti_report;
     78  1.1.1.8  christos 
     79  1.1.1.8  christos   /* Look-up mode for GCS property.  */
     80  1.1.1.8  christos   aarch64_gcs_type gcs_type;
     81  1.1.1.8  christos 
     82  1.1.1.8  christos   /* Report level for GCS issues.  */
     83  1.1.1.8  christos   aarch64_feature_marking_report gcs_report;
     84  1.1.1.8  christos 
     85  1.1.1.8  christos   /* Report level for GCS issues with dynamic inputs.  */
     86  1.1.1.8  christos   aarch64_feature_marking_report gcs_report_dynamic;
     87  1.1.1.8  christos };
     88  1.1.1.8  christos typedef struct aarch64_protection_opts aarch64_protection_opts;
     89  1.1.1.8  christos 
     90  1.1.1.8  christos struct elf_aarch64_local_symbol;
     91  1.1.1.8  christos struct elf_aarch64_obj_tdata
     92  1.1.1.8  christos {
     93  1.1.1.8  christos   struct elf_obj_tdata root;
     94  1.1.1.8  christos 
     95  1.1.1.8  christos   /* local symbol descriptors */
     96  1.1.1.8  christos   struct elf_aarch64_local_symbol *locals;
     97  1.1.1.8  christos 
     98  1.1.1.8  christos   /* Zero to warn when linking objects with incompatible enum sizes.  */
     99  1.1.1.8  christos   int no_enum_size_warning;
    100  1.1.1.8  christos 
    101  1.1.1.8  christos   /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
    102  1.1.1.8  christos   int no_wchar_size_warning;
    103  1.1.1.8  christos 
    104  1.1.1.8  christos   /* All GNU_PROPERTY_AARCH64_FEATURE_1_AND properties.  */
    105  1.1.1.8  christos   uint32_t gnu_property_aarch64_feature_1_and;
    106  1.1.1.8  christos 
    107  1.1.1.8  christos   /* Software protections options.  */
    108  1.1.1.8  christos   struct aarch64_protection_opts sw_protections;
    109  1.1.1.8  christos 
    110  1.1.1.9  christos   /* The merge of object attributes already occured.  */
    111  1.1.1.9  christos   bool oa_merge_done;
    112  1.1.1.9  christos 
    113  1.1.1.8  christos   /* Number of reported BTI issues.  */
    114  1.1.1.8  christos   int n_bti_issues;
    115  1.1.1.8  christos 
    116  1.1.1.8  christos   /* Number of reported GCS issues for non-dynamic objects.  */
    117  1.1.1.8  christos   int n_gcs_issues;
    118  1.1.1.8  christos 
    119  1.1.1.8  christos   /* Number of reported GCS issues for dynamic objects.  */
    120  1.1.1.8  christos   int n_gcs_dynamic_issues;
    121  1.1.1.8  christos };
    122  1.1.1.8  christos 
    123  1.1.1.8  christos #define elf_aarch64_tdata(bfd)				\
    124  1.1.1.8  christos   ((struct elf_aarch64_obj_tdata *) (bfd)->tdata.any)
    125  1.1.1.5  christos 
    126  1.1.1.5  christos /* An enum to define what kind of erratum fixes we should apply.  This gives the
    127  1.1.1.5  christos    user a bit more control over the sequences we generate.  */
    128  1.1.1.5  christos typedef enum
    129  1.1.1.5  christos {
    130  1.1.1.5  christos   ERRAT_NONE  = (1 << 0),  /* No erratum workarounds allowed.  */
    131  1.1.1.5  christos   ERRAT_ADR   = (1 << 1),  /* Erratum workarounds using ADR allowed.  */
    132  1.1.1.5  christos   ERRAT_ADRP  = (1 << 2),  /* Erratum workarounds using ADRP are allowed.  */
    133  1.1.1.5  christos } erratum_84319_opts;
    134  1.1.1.5  christos 
    135  1.1.1.8  christos /* An enum to define the various modes of MTE operation.
    136  1.1.1.8  christos    At this time, except AARCH64_MEMTAG_MODE_NONE, the enumerator constants are
    137  1.1.1.8  christos    the same as specified in the Memtag ABI Extension to ELF for the Arm 64-bit
    138  1.1.1.8  christos    Architecture (AArch64) document (the intent being that this keeps the
    139  1.1.1.8  christos    emission of the associated dynamic tag simple).*/
    140  1.1.1.8  christos typedef enum
    141  1.1.1.8  christos {
    142  1.1.1.8  christos   AARCH64_MEMTAG_MODE_SYNC    = 0,
    143  1.1.1.8  christos   AARCH64_MEMTAG_MODE_ASYNC   = 1,
    144  1.1.1.8  christos   AARCH64_MEMTAG_MODE_NONE    = 2,
    145  1.1.1.8  christos } aarch64_memtag_mode_type;
    146  1.1.1.8  christos 
    147  1.1.1.8  christos /* A structure to encompass all information about memtag feature related
    148  1.1.1.8  christos    command line options.  */
    149  1.1.1.8  christos struct aarch64_memtag_opts
    150  1.1.1.8  christos {
    151  1.1.1.8  christos   /* Mode of MTE operation.  */
    152  1.1.1.8  christos   aarch64_memtag_mode_type memtag_mode;
    153  1.1.1.8  christos 
    154  1.1.1.8  christos   /* Whether stack accesses use MTE insns.  */
    155  1.1.1.8  christos   unsigned int memtag_stack;
    156  1.1.1.8  christos };
    157  1.1.1.8  christos 
    158  1.1.1.8  christos typedef struct aarch64_memtag_opts aarch64_memtag_opts;
    159  1.1.1.8  christos 
    160  1.1.1.5  christos extern void bfd_elf64_aarch64_set_options
    161  1.1.1.5  christos   (bfd *, struct bfd_link_info *, int, int, int, int, erratum_84319_opts, int,
    162  1.1.1.8  christos    const aarch64_protection_opts *, const aarch64_memtag_opts *);
    163  1.1.1.5  christos 
    164  1.1.1.5  christos extern void bfd_elf32_aarch64_set_options
    165  1.1.1.5  christos   (bfd *, struct bfd_link_info *, int, int, int, int, erratum_84319_opts, int,
    166  1.1.1.8  christos    const aarch64_protection_opts *, const aarch64_memtag_opts *);
    167  1.1.1.5  christos 
    168  1.1.1.5  christos /* AArch64 stub generation support for ELF64.  Called from the linker.  */
    169  1.1.1.5  christos extern int elf64_aarch64_setup_section_lists
    170  1.1.1.5  christos   (bfd *, struct bfd_link_info *);
    171  1.1.1.5  christos extern void elf64_aarch64_next_input_section
    172  1.1.1.5  christos   (struct bfd_link_info *, struct bfd_section *);
    173  1.1.1.6  christos extern bool elf64_aarch64_size_stubs
    174  1.1.1.5  christos   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
    175  1.1.1.5  christos    struct bfd_section * (*) (const char *, struct bfd_section *),
    176  1.1.1.5  christos    void (*) (void));
    177  1.1.1.6  christos extern bool elf64_aarch64_build_stubs
    178  1.1.1.5  christos   (struct bfd_link_info *);
    179  1.1.1.5  christos /* AArch64 stub generation support for ELF32.  Called from the linker.  */
    180  1.1.1.5  christos extern int elf32_aarch64_setup_section_lists
    181  1.1.1.5  christos   (bfd *, struct bfd_link_info *);
    182  1.1.1.5  christos extern void elf32_aarch64_next_input_section
    183  1.1.1.5  christos   (struct bfd_link_info *, struct bfd_section *);
    184  1.1.1.6  christos extern bool elf32_aarch64_size_stubs
    185  1.1.1.5  christos   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
    186  1.1.1.5  christos    struct bfd_section * (*) (const char *, struct bfd_section *),
    187  1.1.1.5  christos    void (*) (void));
    188  1.1.1.6  christos extern bool elf32_aarch64_build_stubs
    189  1.1.1.5  christos   (struct bfd_link_info *);
    190      1.1  christos 
    191  1.1.1.8  christos /* AArch64 relative relocation packing support for ELF64.  */
    192  1.1.1.8  christos extern bool elf64_aarch64_size_relative_relocs
    193  1.1.1.9  christos   (struct bfd_link_info *, bool *) ATTRIBUTE_HIDDEN;
    194  1.1.1.8  christos extern bool elf64_aarch64_finish_relative_relocs
    195  1.1.1.9  christos   (struct bfd_link_info *) ATTRIBUTE_HIDDEN;
    196  1.1.1.8  christos /* AArch64 relative relocation packing support for ELF32.  */
    197  1.1.1.8  christos extern bool elf32_aarch64_size_relative_relocs
    198  1.1.1.9  christos   (struct bfd_link_info *, bool *) ATTRIBUTE_HIDDEN;
    199  1.1.1.8  christos extern bool elf32_aarch64_finish_relative_relocs
    200  1.1.1.9  christos   (struct bfd_link_info *) ATTRIBUTE_HIDDEN;
    201  1.1.1.8  christos 
    202      1.1  christos /* Take the PAGE component of an address or offset.  */
    203  1.1.1.3  christos #define PG(x)	     ((x) & ~ (bfd_vma) 0xfff)
    204      1.1  christos #define PG_OFFSET(x) ((x) &   (bfd_vma) 0xfff)
    205      1.1  christos 
    206      1.1  christos #define AARCH64_ADR_OP		0x10000000
    207      1.1  christos #define AARCH64_ADRP_OP		0x90000000
    208      1.1  christos #define AARCH64_ADRP_OP_MASK	0x9F000000
    209      1.1  christos 
    210      1.1  christos extern bfd_signed_vma
    211  1.1.1.9  christos _bfd_aarch64_sign_extend (bfd_vma, int) ATTRIBUTE_HIDDEN;
    212      1.1  christos 
    213      1.1  christos extern uint32_t
    214  1.1.1.9  christos _bfd_aarch64_decode_adrp_imm (uint32_t) ATTRIBUTE_HIDDEN;
    215      1.1  christos 
    216      1.1  christos extern uint32_t
    217  1.1.1.9  christos _bfd_aarch64_reencode_adr_imm (uint32_t, uint32_t) ATTRIBUTE_HIDDEN;
    218      1.1  christos 
    219      1.1  christos extern bfd_reloc_status_type
    220      1.1  christos _bfd_aarch64_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type,
    221  1.1.1.9  christos 			     reloc_howto_type *, bfd_signed_vma)
    222  1.1.1.9  christos 			    ATTRIBUTE_HIDDEN;
    223      1.1  christos 
    224      1.1  christos extern bfd_vma
    225  1.1.1.5  christos _bfd_aarch64_elf_resolve_relocation (bfd *, bfd_reloc_code_real_type, bfd_vma,
    226  1.1.1.9  christos 				     bfd_vma, bfd_vma, bool) ATTRIBUTE_HIDDEN;
    227      1.1  christos 
    228  1.1.1.6  christos extern bool
    229  1.1.1.9  christos _bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *) ATTRIBUTE_HIDDEN;
    230      1.1  christos 
    231  1.1.1.6  christos extern bool
    232  1.1.1.9  christos _bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *) ATTRIBUTE_HIDDEN;
    233      1.1  christos 
    234      1.1  christos extern char *
    235  1.1.1.9  christos _bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...)
    236  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    237      1.1  christos 
    238      1.1  christos #define elf_backend_grok_prstatus	_bfd_aarch64_elf_grok_prstatus
    239  1.1.1.3  christos #define elf_backend_grok_psinfo		_bfd_aarch64_elf_grok_psinfo
    240  1.1.1.3  christos #define elf_backend_write_core_note	_bfd_aarch64_elf_write_core_note
    241  1.1.1.5  christos 
    242  1.1.1.9  christos extern obj_attr_version_t
    243  1.1.1.9  christos _bfd_aarch64_obj_attrs_version_dec (uint8_t) ATTRIBUTE_HIDDEN;
    244  1.1.1.9  christos 
    245  1.1.1.9  christos extern uint8_t
    246  1.1.1.9  christos _bfd_aarch64_obj_attrs_version_enc (obj_attr_version_t) ATTRIBUTE_HIDDEN;
    247  1.1.1.9  christos 
    248  1.1.1.9  christos extern const known_subsection_v2_t aarch64_obj_attr_v2_known_subsections[2]
    249  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    250  1.1.1.9  christos 
    251  1.1.1.9  christos extern bfd *
    252  1.1.1.9  christos _bfd_aarch64_elf_link_setup_object_attributes (struct bfd_link_info *)
    253  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    254  1.1.1.9  christos 
    255  1.1.1.9  christos extern void
    256  1.1.1.9  christos _bfd_aarch64_oav2_record (obj_attr_subsection_v2_t *, Tag_Feature_Set, uint32_t)
    257  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    258  1.1.1.9  christos 
    259  1.1.1.9  christos extern void
    260  1.1.1.9  christos _bfd_aarch64_translate_gnu_props_to_obj_attrs
    261  1.1.1.9  christos   (const bfd *, const elf_property_list *) ATTRIBUTE_HIDDEN;
    262  1.1.1.9  christos 
    263  1.1.1.9  christos extern void
    264  1.1.1.9  christos _bfd_aarch64_translate_obj_attrs_to_gnu_props
    265  1.1.1.9  christos   (bfd *, const obj_attr_subsection_v2_t *) ATTRIBUTE_HIDDEN;
    266  1.1.1.9  christos 
    267  1.1.1.9  christos extern bool
    268  1.1.1.9  christos _bfd_aarch64_oav2_default_value (const struct bfd_link_info *,
    269  1.1.1.9  christos 				 const obj_attr_info_t *,
    270  1.1.1.9  christos 				 const obj_attr_subsection_v2_t *,
    271  1.1.1.9  christos 				 obj_attr_v2_t *) ATTRIBUTE_HIDDEN;
    272  1.1.1.9  christos 
    273  1.1.1.9  christos extern obj_attr_v2_merge_result_t
    274  1.1.1.9  christos _bfd_aarch64_oav2_attr_merge (const struct bfd_link_info *, const bfd *,
    275  1.1.1.9  christos 			      const obj_attr_subsection_v2_t *,
    276  1.1.1.9  christos 			      const obj_attr_v2_t *, const obj_attr_v2_t *,
    277  1.1.1.9  christos 			      const obj_attr_v2_t *) ATTRIBUTE_HIDDEN;
    278  1.1.1.9  christos 
    279  1.1.1.5  christos extern bfd *
    280  1.1.1.9  christos _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *)
    281  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    282  1.1.1.5  christos 
    283  1.1.1.5  christos extern enum elf_property_kind
    284  1.1.1.5  christos _bfd_aarch64_elf_parse_gnu_properties (bfd *, unsigned int,
    285  1.1.1.9  christos 				       bfd_byte *, unsigned int)
    286  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    287  1.1.1.5  christos 
    288  1.1.1.6  christos extern bool
    289  1.1.1.5  christos _bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info *, bfd *,
    290  1.1.1.5  christos 				       elf_property *, elf_property *,
    291  1.1.1.9  christos 				       uint32_t) ATTRIBUTE_HIDDEN;
    292  1.1.1.5  christos 
    293  1.1.1.5  christos extern void
    294  1.1.1.9  christos _bfd_aarch64_elf_check_bti_report (const struct bfd_link_info *, const bfd *)
    295  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    296  1.1.1.8  christos 
    297  1.1.1.8  christos extern void
    298  1.1.1.9  christos _bfd_aarch64_elf_check_gcs_report (const struct bfd_link_info *, const bfd *)
    299  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    300  1.1.1.8  christos 
    301  1.1.1.8  christos extern void
    302  1.1.1.5  christos _bfd_aarch64_elf_link_fixup_gnu_properties (struct bfd_link_info *,
    303  1.1.1.9  christos 					    elf_property_list **)
    304  1.1.1.9  christos   ATTRIBUTE_HIDDEN;
    305  1.1.1.5  christos 
    306  1.1.1.5  christos #define elf_backend_parse_gnu_properties	\
    307  1.1.1.5  christos   _bfd_aarch64_elf_parse_gnu_properties
    308  1.1.1.5  christos 
    309  1.1.1.5  christos #define elf_backend_fixup_gnu_properties	\
    310  1.1.1.5  christos   _bfd_aarch64_elf_link_fixup_gnu_properties
    311