(root)/
binutils-2.41/
bfd/
elfxx-mips.h
       1  /* MIPS ELF specific backend routines.
       2     Copyright (C) 2002-2023 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  #include "elf/common.h"
      22  #include "elf/internal.h"
      23  #include "elf/mips.h"
      24  
      25  enum reloc_check
      26  {
      27    check_std,
      28    check_inplace,
      29    check_shuffle
      30  };
      31  
      32  #ifndef MIPS_DEFAULT_R6
      33  #define MIPS_DEFAULT_R6 0
      34  #endif
      35  
      36  struct ecoff_debug_info;
      37  
      38  extern bool _bfd_mips_elf_mkobject
      39    (bfd *);
      40  extern bool _bfd_mips_elf_free_cached_info
      41    (bfd *);
      42  extern bool _bfd_mips_elf_new_section_hook
      43    (bfd *, asection *);
      44  extern void _bfd_mips_elf_symbol_processing
      45    (bfd *, asymbol *);
      46  extern unsigned int _bfd_mips_elf_eh_frame_address_size
      47    (bfd *, const asection *);
      48  extern bool _bfd_mips_elf_name_local_section_symbols
      49    (bfd *);
      50  extern bool _bfd_mips_elf_section_processing
      51    (bfd *, Elf_Internal_Shdr *);
      52  extern bool _bfd_mips_elf_section_from_shdr
      53    (bfd *, Elf_Internal_Shdr *, const char *, int);
      54  extern bool _bfd_mips_elf_fake_sections
      55    (bfd *, Elf_Internal_Shdr *, asection *);
      56  extern bool _bfd_mips_elf_section_from_bfd_section
      57    (bfd *, asection *, int *);
      58  extern bool _bfd_mips_elf_add_symbol_hook
      59    (bfd *, struct bfd_link_info *, Elf_Internal_Sym *,
      60     const char **, flagword *, asection **, bfd_vma *);
      61  extern int _bfd_mips_elf_link_output_symbol_hook
      62    (struct bfd_link_info *, const char *, Elf_Internal_Sym *,
      63     asection *, struct elf_link_hash_entry *);
      64  extern bool _bfd_mips_elf_create_dynamic_sections
      65    (bfd *, struct bfd_link_info *);
      66  extern bool _bfd_mips_elf_check_relocs
      67    (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
      68  extern bool _bfd_mips_elf_adjust_dynamic_symbol
      69    (struct bfd_link_info *, struct elf_link_hash_entry *);
      70  extern bool _bfd_mips_elf_always_size_sections
      71    (bfd *, struct bfd_link_info *);
      72  extern bool _bfd_mips_elf_size_dynamic_sections
      73    (bfd *, struct bfd_link_info *);
      74  extern int _bfd_mips_elf_relocate_section
      75    (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
      76     Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
      77  extern bool _bfd_mips_elf_finish_dynamic_symbol
      78    (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
      79     Elf_Internal_Sym *);
      80  extern bool _bfd_mips_vxworks_finish_dynamic_symbol
      81    (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
      82     Elf_Internal_Sym *);
      83  extern bool _bfd_mips_elf_finish_dynamic_sections
      84    (bfd *, struct bfd_link_info *);
      85  extern bool _bfd_mips_elf_sort_relocs_p
      86    (asection *);
      87  extern void _bfd_mips_final_write_processing
      88    (bfd *);
      89  extern bool _bfd_mips_elf_final_write_processing
      90    (bfd *);
      91  extern int _bfd_mips_elf_additional_program_headers
      92    (bfd *, struct bfd_link_info *);
      93  extern bool _bfd_mips_elf_modify_segment_map
      94    (bfd *, struct bfd_link_info *);
      95  extern asection * _bfd_mips_elf_gc_mark_hook
      96    (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
      97     struct elf_link_hash_entry *, Elf_Internal_Sym *);
      98  extern void _bfd_mips_elf_copy_indirect_symbol
      99    (struct bfd_link_info *, struct elf_link_hash_entry *,
     100     struct elf_link_hash_entry *);
     101  extern void _bfd_mips_elf_hide_symbol
     102    (struct bfd_link_info *, struct elf_link_hash_entry *, bool);
     103  extern bool _bfd_mips_elf_ignore_discarded_relocs
     104    (asection *);
     105  extern bool _bfd_mips_elf_is_target_special_symbol
     106    (bfd *abfd, asymbol *sym);
     107  extern bool _bfd_mips_elf_find_nearest_line
     108    (bfd *, asymbol **, asection *, bfd_vma,
     109     const char **, const char **, unsigned int *, unsigned int *);
     110  #define _bfd_mips_elf_find_nearest_line_with_alt \
     111    _bfd_nosymbols_find_nearest_line_with_alt
     112  extern bool _bfd_mips_elf_find_inliner_info
     113    (bfd *, const char **, const char **, unsigned int *);
     114  extern bool _bfd_mips_elf_set_section_contents
     115    (bfd *, asection *, const void *, file_ptr, bfd_size_type);
     116  extern bfd_byte *_bfd_elf_mips_get_relocated_section_contents
     117    (bfd *, struct bfd_link_info *, struct bfd_link_order *,
     118     bfd_byte *, bool, asymbol **);
     119  extern bool _bfd_mips_elf_relax_section
     120    (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
     121     bool *again);
     122  extern struct bfd_link_hash_table *_bfd_mips_elf_link_hash_table_create
     123    (bfd *);
     124  extern struct bfd_link_hash_table *_bfd_mips_vxworks_link_hash_table_create
     125    (bfd *);
     126  extern bool _bfd_mips_elf_final_link
     127    (bfd *, struct bfd_link_info *);
     128  extern bool _bfd_mips_elf_merge_private_bfd_data
     129    (bfd *, struct bfd_link_info *);
     130  extern bool _bfd_mips_elf_set_private_flags
     131    (bfd *, flagword);
     132  extern const char * _bfd_mips_fp_abi_string
     133    (int);
     134  extern bool _bfd_mips_elf_print_private_bfd_data
     135    (bfd *, void *);
     136  extern bool _bfd_mips_elf_discard_info
     137    (bfd *, struct elf_reloc_cookie *, struct bfd_link_info *);
     138  extern bool _bfd_mips_elf_write_section
     139    (bfd *, struct bfd_link_info *, asection *, bfd_byte *);
     140  
     141  extern bool _bfd_mips_elf_read_ecoff_info
     142    (bfd *, asection *, struct ecoff_debug_info *);
     143  extern void _bfd_mips_elf_reloc_unshuffle
     144    (bfd *, int, bool, bfd_byte *);
     145  extern void _bfd_mips_elf_reloc_shuffle
     146    (bfd *, int, bool, bfd_byte *);
     147  extern bool _bfd_mips_reloc_offset_in_range
     148    (bfd *, asection *, arelent *, enum reloc_check);
     149  extern bfd_reloc_status_type _bfd_mips_elf_gprel16_with_gp
     150    (bfd *, asymbol *, arelent *, asection *, bool, void *, bfd_vma);
     151  extern bfd_reloc_status_type _bfd_mips_elf32_gprel16_reloc
     152    (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     153  extern bfd_reloc_status_type _bfd_mips_elf_hi16_reloc
     154    (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     155  extern bfd_reloc_status_type _bfd_mips_elf_got16_reloc
     156    (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     157  extern bfd_reloc_status_type _bfd_mips_elf_lo16_reloc
     158    (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     159  extern bfd_reloc_status_type _bfd_mips_elf_generic_reloc
     160    (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     161  extern unsigned long _bfd_elf_mips_mach
     162    (flagword);
     163  extern bfd_vma _bfd_mips_elf_sign_extend
     164    (bfd_vma, int);
     165  extern void _bfd_mips_elf_merge_symbol_attribute
     166    (struct elf_link_hash_entry *, unsigned int, bool, bool);
     167  extern char *_bfd_mips_elf_get_target_dtag (bfd_vma);
     168  extern bool _bfd_mips_elf_ignore_undef_symbol
     169    (struct elf_link_hash_entry *);
     170  extern void _bfd_mips_elf_use_plts_and_copy_relocs
     171    (struct bfd_link_info *);
     172  extern void _bfd_mips_elf_linker_flags
     173    (struct bfd_link_info *, bool, bool, bool);
     174  extern void _bfd_mips_elf_compact_branches
     175    (struct bfd_link_info *, bool);
     176  extern bool _bfd_mips_elf_init_stubs
     177    (struct bfd_link_info *,
     178     asection *(*) (const char *, asection *, asection *));
     179  extern bfd_vma _bfd_mips_elf_plt_sym_val
     180    (bfd_vma, const asection *, const arelent *rel);
     181  extern long _bfd_mips_elf_get_synthetic_symtab
     182    (bfd *, long, asymbol **, long, asymbol **, asymbol **);
     183  extern bool _bfd_mips_elf_gc_mark_extra_sections
     184    (struct bfd_link_info *, elf_gc_mark_hook_fn);
     185  extern bool _bfd_mips_init_file_header
     186    (bfd *abfd, struct bfd_link_info *link_info);
     187  
     188  extern const struct bfd_elf_special_section _bfd_mips_elf_special_sections [];
     189  
     190  extern bool _bfd_mips_elf_common_definition (Elf_Internal_Sym *);
     191  
     192  extern int _bfd_mips_elf_compact_eh_encoding (struct bfd_link_info *);
     193  extern int _bfd_mips_elf_cant_unwind_opcode (struct bfd_link_info *);
     194  
     195  extern void _bfd_mips_elf_record_xhash_symbol
     196    (struct elf_link_hash_entry *h, bfd_vma xlat_loc);
     197  
     198  /* MIPS ABI flags data access.  For the disassembler.  */
     199  extern struct elf_internal_abiflags_v0 *bfd_mips_elf_get_abiflags (bfd *);
     200  
     201  static inline bool
     202  gprel16_reloc_p (unsigned int r_type)
     203  {
     204    return (r_type == R_MIPS_GPREL16
     205  	  || r_type == R_MIPS16_GPREL
     206  	  || r_type == R_MICROMIPS_GPREL16
     207  	  || r_type == R_MICROMIPS_GPREL7_S2);
     208  }
     209  
     210  static inline bool
     211  literal_reloc_p (int r_type)
     212  {
     213    return r_type == R_MIPS_LITERAL || r_type == R_MICROMIPS_LITERAL;
     214  }
     215  
     216  #define elf_backend_common_definition   _bfd_mips_elf_common_definition
     217  #define elf_backend_name_local_section_symbols \
     218    _bfd_mips_elf_name_local_section_symbols
     219  #define elf_backend_special_sections _bfd_mips_elf_special_sections
     220  #define elf_backend_eh_frame_address_size _bfd_mips_elf_eh_frame_address_size
     221  #define elf_backend_merge_symbol_attribute  _bfd_mips_elf_merge_symbol_attribute
     222  #define elf_backend_ignore_undef_symbol _bfd_mips_elf_ignore_undef_symbol
     223  #define elf_backend_init_file_header _bfd_mips_init_file_header
     224  #define elf_backend_compact_eh_encoding _bfd_mips_elf_compact_eh_encoding
     225  #define elf_backend_cant_unwind_opcode _bfd_mips_elf_cant_unwind_opcode
     226  #define elf_backend_record_xhash_symbol _bfd_mips_elf_record_xhash_symbol
     227  #define elf_backend_always_renumber_dynsyms true