1867d70fcSchristos /* 32-bit ELF support for ARM 2*c42dbd0eSchristos Copyright (C) 2019-2022 Free Software Foundation, Inc. 3867d70fcSchristos 4867d70fcSchristos This file is part of BFD, the Binary File Descriptor library. 5867d70fcSchristos 6867d70fcSchristos This program is free software; you can redistribute it and/or modify 7867d70fcSchristos it under the terms of the GNU General Public License as published by 8867d70fcSchristos the Free Software Foundation; either version 3 of the License, or 9867d70fcSchristos (at your option) any later version. 10867d70fcSchristos 11867d70fcSchristos This program is distributed in the hope that it will be useful, 12867d70fcSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of 13867d70fcSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14867d70fcSchristos GNU General Public License for more details. 15867d70fcSchristos 16867d70fcSchristos You should have received a copy of the GNU General Public License 17867d70fcSchristos along with this program; if not, write to the Free Software 18867d70fcSchristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19867d70fcSchristos MA 02110-1301, USA. */ 20867d70fcSchristos 21867d70fcSchristos 22867d70fcSchristos /* ARM VFP11 erratum workaround support. */ 23867d70fcSchristos typedef enum 24867d70fcSchristos { 25867d70fcSchristos BFD_ARM_VFP11_FIX_DEFAULT, 26867d70fcSchristos BFD_ARM_VFP11_FIX_NONE, 27867d70fcSchristos BFD_ARM_VFP11_FIX_SCALAR, 28867d70fcSchristos BFD_ARM_VFP11_FIX_VECTOR 29867d70fcSchristos } bfd_arm_vfp11_fix; 30867d70fcSchristos 31867d70fcSchristos extern void bfd_elf32_arm_init_maps 32867d70fcSchristos (bfd *); 33867d70fcSchristos 34867d70fcSchristos extern void bfd_elf32_arm_set_vfp11_fix 35867d70fcSchristos (bfd *, struct bfd_link_info *); 36867d70fcSchristos 37867d70fcSchristos extern void bfd_elf32_arm_set_cortex_a8_fix 38867d70fcSchristos (bfd *, struct bfd_link_info *); 39867d70fcSchristos 40*c42dbd0eSchristos extern bool bfd_elf32_arm_vfp11_erratum_scan 41867d70fcSchristos (bfd *, struct bfd_link_info *); 42867d70fcSchristos 43867d70fcSchristos extern void bfd_elf32_arm_vfp11_fix_veneer_locations 44867d70fcSchristos (bfd *, struct bfd_link_info *); 45867d70fcSchristos 46867d70fcSchristos /* ARM STM STM32L4XX erratum workaround support. */ 47867d70fcSchristos typedef enum 48867d70fcSchristos { 49867d70fcSchristos BFD_ARM_STM32L4XX_FIX_NONE, 50867d70fcSchristos BFD_ARM_STM32L4XX_FIX_DEFAULT, 51867d70fcSchristos BFD_ARM_STM32L4XX_FIX_ALL 52867d70fcSchristos } bfd_arm_stm32l4xx_fix; 53867d70fcSchristos 54867d70fcSchristos extern void bfd_elf32_arm_set_stm32l4xx_fix 55867d70fcSchristos (bfd *, struct bfd_link_info *); 56867d70fcSchristos 57*c42dbd0eSchristos extern bool bfd_elf32_arm_stm32l4xx_erratum_scan 58867d70fcSchristos (bfd *, struct bfd_link_info *); 59867d70fcSchristos 60867d70fcSchristos extern void bfd_elf32_arm_stm32l4xx_fix_veneer_locations 61867d70fcSchristos (bfd *, struct bfd_link_info *); 62867d70fcSchristos 63867d70fcSchristos /* ELF ARM Interworking support. Called from linker. */ 64*c42dbd0eSchristos extern bool bfd_elf32_arm_allocate_interworking_sections 65867d70fcSchristos (struct bfd_link_info *); 66867d70fcSchristos 67*c42dbd0eSchristos extern bool bfd_elf32_arm_process_before_allocation 68867d70fcSchristos (bfd *, struct bfd_link_info *); 69867d70fcSchristos 70867d70fcSchristos struct elf32_arm_params { 71867d70fcSchristos char *thumb_entry_symbol; 72867d70fcSchristos int byteswap_code; 73867d70fcSchristos int target1_is_rel; 74867d70fcSchristos char * target2_type; 75867d70fcSchristos int fix_v4bx; 76867d70fcSchristos int use_blx; 77867d70fcSchristos bfd_arm_vfp11_fix vfp11_denorm_fix; 78867d70fcSchristos bfd_arm_stm32l4xx_fix stm32l4xx_fix; 79867d70fcSchristos int no_enum_size_warning; 80867d70fcSchristos int no_wchar_size_warning; 81867d70fcSchristos int pic_veneer; 82867d70fcSchristos int fix_cortex_a8; 83867d70fcSchristos int fix_arm1176; 84867d70fcSchristos int merge_exidx_entries; 85867d70fcSchristos int cmse_implib; 86867d70fcSchristos bfd *in_implib_bfd; 87867d70fcSchristos }; 88867d70fcSchristos 89867d70fcSchristos void bfd_elf32_arm_set_target_params 90867d70fcSchristos (bfd *, struct bfd_link_info *, struct elf32_arm_params *); 91867d70fcSchristos 92*c42dbd0eSchristos extern bool bfd_elf32_arm_get_bfd_for_interworking 93867d70fcSchristos (bfd *, struct bfd_link_info *); 94867d70fcSchristos 95*c42dbd0eSchristos extern bool bfd_elf32_arm_add_glue_sections_to_bfd 96867d70fcSchristos (bfd *, struct bfd_link_info *); 97867d70fcSchristos 98867d70fcSchristos extern void bfd_elf32_arm_keep_private_stub_output_sections 99867d70fcSchristos (struct bfd_link_info *); 100867d70fcSchristos 101867d70fcSchristos extern void bfd_elf32_arm_set_byteswap_code 102867d70fcSchristos (struct bfd_link_info *, int); 103867d70fcSchristos 104867d70fcSchristos extern void bfd_elf32_arm_use_long_plt (void); 105867d70fcSchristos 106867d70fcSchristos /* ARM stub generation support. Called from the linker. */ 107867d70fcSchristos extern int elf32_arm_setup_section_lists 108867d70fcSchristos (bfd *, struct bfd_link_info *); 109867d70fcSchristos extern void elf32_arm_next_input_section 110867d70fcSchristos (struct bfd_link_info *, struct bfd_section *); 111*c42dbd0eSchristos extern bool elf32_arm_size_stubs 112867d70fcSchristos (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma, 113867d70fcSchristos struct bfd_section * (*) (const char *, struct bfd_section *, 114867d70fcSchristos struct bfd_section *, unsigned int), 115867d70fcSchristos void (*) (void)); 116*c42dbd0eSchristos extern bool elf32_arm_build_stubs 117867d70fcSchristos (struct bfd_link_info *); 118867d70fcSchristos 119867d70fcSchristos /* ARM unwind section editing support. */ 120*c42dbd0eSchristos extern bool elf32_arm_fix_exidx_coverage 121*c42dbd0eSchristos (struct bfd_section **, unsigned int, struct bfd_link_info *, bool); 122