Home | History | Annotate | Line # | Download | only in bfd
elfxx-aarch64.h revision 1.1.1.5
      1 /* AArch64-specific backend routines.
      2    Copyright (C) 2009-2020 Free Software Foundation, Inc.
      3    Contributed by ARM Ltd.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; see the file COPYING3. If not,
     19    see <http://www.gnu.org/licenses/>.  */
     20 
     21 extern void bfd_elf64_aarch64_init_maps
     22   (bfd *);
     23 
     24 extern void bfd_elf32_aarch64_init_maps
     25   (bfd *);
     26 
     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
     29    are enabled:
     30    - No security feature PLTs
     31    - PLTs with BTI instruction
     32    - PLTs with PAC instruction
     33 */
     34 typedef enum
     35 {
     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
     40 } aarch64_plt_type;
     41 
     42 /* To indicate if BTI is enabled with/without warning.  */
     43 typedef enum
     44 {
     45   BTI_NONE	= 0,  /* BTI is not enabled.  */
     46   BTI_WARN	= 1,  /* BTI is enabled with -z force-bti.  */
     47 } aarch64_enable_bti_type;
     48 
     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.   */
     53 typedef struct
     54 {
     55   aarch64_plt_type plt_type;
     56   aarch64_enable_bti_type bti_type;
     57 } aarch64_bti_pac_info;
     58 
     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.  */
     61 typedef enum
     62 {
     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.  */
     66 } erratum_84319_opts;
     67 
     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);
     71 
     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);
     75 
     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 bfd_boolean elf64_aarch64_size_stubs
     82   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
     83    struct bfd_section * (*) (const char *, struct bfd_section *),
     84    void (*) (void));
     85 extern bfd_boolean 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 bfd_boolean elf32_aarch64_size_stubs
     93   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
     94    struct bfd_section * (*) (const char *, struct bfd_section *),
     95    void (*) (void));
     96 extern bfd_boolean elf32_aarch64_build_stubs
     97   (struct bfd_link_info *);
     98 
     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)
    102 
    103 #define AARCH64_ADR_OP		0x10000000
    104 #define AARCH64_ADRP_OP		0x90000000
    105 #define AARCH64_ADRP_OP_MASK	0x9F000000
    106 
    107 extern bfd_signed_vma
    108 _bfd_aarch64_sign_extend (bfd_vma, int);
    109 
    110 extern uint32_t
    111 _bfd_aarch64_decode_adrp_imm (uint32_t);
    112 
    113 extern uint32_t
    114 _bfd_aarch64_reencode_adr_imm (uint32_t, uint32_t);
    115 
    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);
    119 
    120 extern bfd_vma
    121 _bfd_aarch64_elf_resolve_relocation (bfd *, bfd_reloc_code_real_type, bfd_vma,
    122 				     bfd_vma, bfd_vma, bfd_boolean);
    123 
    124 extern bfd_boolean
    125 _bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *);
    126 
    127 extern bfd_boolean
    128 _bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *);
    129 
    130 extern char *
    131 _bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...);
    132 
    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
    136 
    137 extern bfd *
    138 _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *,
    139 					    uint32_t *);
    140 
    141 extern enum elf_property_kind
    142 _bfd_aarch64_elf_parse_gnu_properties (bfd *, unsigned int,
    143 				       bfd_byte *, unsigned int);
    144 
    145 extern bfd_boolean
    146 _bfd_aarch64_elf_merge_gnu_properties (struct bfd_link_info *, bfd *,
    147 				       elf_property *, elf_property *,
    148 				       uint32_t);
    149 
    150 extern void
    151 _bfd_aarch64_elf_link_fixup_gnu_properties (struct bfd_link_info *,
    152 					    elf_property_list **);
    153 
    154 #define elf_backend_parse_gnu_properties	\
    155   _bfd_aarch64_elf_parse_gnu_properties
    156 
    157 #define elf_backend_fixup_gnu_properties	\
    158   _bfd_aarch64_elf_link_fixup_gnu_properties
    159