Home | History | Annotate | Line # | Download | only in bfd
      1 /* 32-bit ELF support for ARM
      2    Copyright (C) 2019-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 
     22 /* ARM VFP11 erratum workaround support.  */
     23 typedef enum
     24 {
     25   BFD_ARM_VFP11_FIX_DEFAULT,
     26   BFD_ARM_VFP11_FIX_NONE,
     27   BFD_ARM_VFP11_FIX_SCALAR,
     28   BFD_ARM_VFP11_FIX_VECTOR
     29 } bfd_arm_vfp11_fix;
     30 
     31 extern void bfd_elf32_arm_init_maps
     32   (bfd *);
     33 
     34 extern void bfd_elf32_arm_set_vfp11_fix
     35   (bfd *, struct bfd_link_info *);
     36 
     37 extern void bfd_elf32_arm_set_cortex_a8_fix
     38   (bfd *, struct bfd_link_info *);
     39 
     40 extern bool bfd_elf32_arm_vfp11_erratum_scan
     41   (bfd *, struct bfd_link_info *);
     42 
     43 extern void bfd_elf32_arm_vfp11_fix_veneer_locations
     44   (bfd *, struct bfd_link_info *);
     45 
     46 /* ARM STM STM32L4XX erratum workaround support.  */
     47 typedef enum
     48 {
     49   BFD_ARM_STM32L4XX_FIX_NONE,
     50   BFD_ARM_STM32L4XX_FIX_DEFAULT,
     51   BFD_ARM_STM32L4XX_FIX_ALL
     52 } bfd_arm_stm32l4xx_fix;
     53 
     54 extern void bfd_elf32_arm_set_stm32l4xx_fix
     55   (bfd *, struct bfd_link_info *);
     56 
     57 extern bool bfd_elf32_arm_stm32l4xx_erratum_scan
     58   (bfd *, struct bfd_link_info *);
     59 
     60 extern void bfd_elf32_arm_stm32l4xx_fix_veneer_locations
     61   (bfd *, struct bfd_link_info *);
     62 
     63 /* ELF ARM Interworking support.  Called from linker.  */
     64 extern bool bfd_elf32_arm_allocate_interworking_sections
     65   (struct bfd_link_info *);
     66 
     67 extern bool bfd_elf32_arm_process_before_allocation
     68   (bfd *, struct bfd_link_info *);
     69 
     70 struct elf32_arm_params {
     71   char *thumb_entry_symbol;
     72   int byteswap_code;
     73   int target1_is_rel;
     74   char * target2_type;
     75   int fix_v4bx;
     76   int use_blx;
     77   bfd_arm_vfp11_fix vfp11_denorm_fix;
     78   bfd_arm_stm32l4xx_fix stm32l4xx_fix;
     79   int no_enum_size_warning;
     80   int no_wchar_size_warning;
     81   int pic_veneer;
     82   int fix_cortex_a8;
     83   int fix_arm1176;
     84   int merge_exidx_entries;
     85   int cmse_implib;
     86   bfd *in_implib_bfd;
     87 };
     88 
     89 void bfd_elf32_arm_set_target_params
     90   (bfd *, struct bfd_link_info *, struct elf32_arm_params *);
     91 
     92 extern bool bfd_elf32_arm_get_bfd_for_interworking
     93   (bfd *, struct bfd_link_info *);
     94 
     95 extern bool bfd_elf32_arm_add_glue_sections_to_bfd
     96   (bfd *, struct bfd_link_info *);
     97 
     98 extern void bfd_elf32_arm_keep_private_stub_output_sections
     99   (struct bfd_link_info *);
    100 
    101 extern void bfd_elf32_arm_set_byteswap_code
    102   (struct bfd_link_info *, int);
    103 
    104 extern void bfd_elf32_arm_use_long_plt (void);
    105 
    106 /* ARM stub generation support.  Called from the linker.  */
    107 extern int elf32_arm_setup_section_lists
    108   (bfd *, struct bfd_link_info *);
    109 extern void elf32_arm_next_input_section
    110   (struct bfd_link_info *, struct bfd_section *);
    111 extern bool elf32_arm_size_stubs
    112   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
    113    struct bfd_section * (*) (const char *, struct bfd_section *,
    114 			     struct bfd_section *, unsigned int),
    115    void (*) (void));
    116 extern bool elf32_arm_build_stubs
    117   (struct bfd_link_info *);
    118 
    119 /* ARM unwind section editing support.  */
    120 extern bool elf32_arm_fix_exidx_coverage
    121 (struct bfd_section **, unsigned int, struct bfd_link_info *, bool);
    122