(root)/
binutils-2.41/
bfd/
mach-o-target.c
       1  /* Mach-O support for BFD.
       2     Copyright (C) 1999-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  /* Define generic entry points here so that we don't need to duplicate the
      22     defines in every target.  But define once as this file may be included
      23     several times.  */
      24  #ifndef MACH_O_TARGET_COMMON_DEFINED
      25  #define MACH_O_TARGET_COMMON_DEFINED
      26  
      27  #define bfd_mach_o_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
      28  #define bfd_mach_o_bfd_print_private_bfd_data	      bfd_mach_o_bfd_print_private_bfd_data
      29  #define bfd_mach_o_bfd_is_target_special_symbol	      _bfd_bool_bfd_asymbol_false
      30  #define bfd_mach_o_bfd_is_local_label_name	      bfd_generic_is_local_label_name
      31  #define bfd_mach_o_get_lineno			      _bfd_nosymbols_get_lineno
      32  #define bfd_mach_o_find_inliner_info		      _bfd_nosymbols_find_inliner_info
      33  #define bfd_mach_o_get_symbol_version_string	      _bfd_nosymbols_get_symbol_version_string
      34  #define bfd_mach_o_bfd_make_debug_symbol	      _bfd_nosymbols_bfd_make_debug_symbol
      35  #define bfd_mach_o_read_minisymbols		      _bfd_generic_read_minisymbols
      36  #define bfd_mach_o_minisymbol_to_symbol		      _bfd_generic_minisymbol_to_symbol
      37  #define bfd_mach_o_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
      38  #define bfd_mach_o_bfd_relax_section		      bfd_generic_relax_section
      39  #define bfd_mach_o_bfd_link_hash_table_create	      _bfd_generic_link_hash_table_create
      40  #define bfd_mach_o_bfd_link_add_symbols		      _bfd_generic_link_add_symbols
      41  #define bfd_mach_o_bfd_link_just_syms		      _bfd_generic_link_just_syms
      42  #define bfd_mach_o_bfd_copy_link_hash_symbol_type \
      43    _bfd_generic_copy_link_hash_symbol_type
      44  #define bfd_mach_o_bfd_final_link		      _bfd_generic_final_link
      45  #define bfd_mach_o_bfd_link_split_section	      _bfd_generic_link_split_section
      46  #define bfd_mach_o_bfd_link_check_relocs	      _bfd_generic_link_check_relocs
      47  #define bfd_mach_o_bfd_merge_private_bfd_data	      _bfd_generic_bfd_merge_private_bfd_data
      48  #define bfd_mach_o_bfd_set_private_flags	      bfd_mach_o_bfd_set_private_flags
      49  #define bfd_mach_o_get_section_contents		      _bfd_generic_get_section_contents
      50  #define bfd_mach_o_bfd_gc_sections		      bfd_generic_gc_sections
      51  #define bfd_mach_o_bfd_lookup_section_flags	      bfd_generic_lookup_section_flags
      52  #define bfd_mach_o_bfd_merge_sections		      bfd_generic_merge_sections
      53  #define bfd_mach_o_bfd_is_group_section		      bfd_generic_is_group_section
      54  #define bfd_mach_o_bfd_group_name		      bfd_generic_group_name
      55  #define bfd_mach_o_bfd_discard_group		      bfd_generic_discard_group
      56  #define bfd_mach_o_section_already_linked	      _bfd_generic_section_already_linked
      57  #define bfd_mach_o_bfd_define_common_symbol	      bfd_generic_define_common_symbol
      58  #define bfd_mach_o_bfd_link_hide_symbol		      _bfd_generic_link_hide_symbol
      59  #define bfd_mach_o_bfd_define_start_stop	      bfd_generic_define_start_stop
      60  #define bfd_mach_o_bfd_copy_private_bfd_data	      _bfd_generic_bfd_copy_private_bfd_data
      61  #define bfd_mach_o_core_file_matches_executable_p     generic_core_file_matches_executable_p
      62  #define bfd_mach_o_core_file_pid		      _bfd_nocore_core_file_pid
      63  #define bfd_mach_o_set_reloc			      _bfd_generic_set_reloc
      64  
      65  #define bfd_mach_o_get_dynamic_symtab_upper_bound     bfd_mach_o_get_symtab_upper_bound
      66  #define bfd_mach_o_canonicalize_dynamic_symtab	      bfd_mach_o_canonicalize_symtab
      67  
      68  /* For Mach-O special archives.  */
      69  #define bfd_mach_o_read_ar_hdr			  _bfd_noarchive_read_ar_hdr
      70  #define bfd_mach_o_write_ar_hdr			  _bfd_noarchive_write_ar_hdr
      71  #define bfd_mach_o_slurp_armap			  _bfd_noarchive_slurp_armap
      72  #define bfd_mach_o_slurp_extended_name_table	  _bfd_noarchive_slurp_extended_name_table
      73  #define bfd_mach_o_construct_extended_name_table  _bfd_noarchive_construct_extended_name_table
      74  #define bfd_mach_o_truncate_arname		  _bfd_noarchive_truncate_arname
      75  #define bfd_mach_o_write_armap			  _bfd_noarchive_write_armap
      76  #define bfd_mach_o_get_elt_at_index		  _bfd_noarchive_get_elt_at_index
      77  #define bfd_mach_o_update_armap_timestamp	  _bfd_noarchive_update_armap_timestamp
      78  
      79  #define TARGET_NAME_BACKEND XCONCAT2(TARGET_NAME,_backend)
      80  
      81  #endif /* MACH_O_TARGET_COMMON_DEFINED */
      82  
      83  #ifndef TARGET_NAME
      84  #error TARGET_NAME must be defined
      85  #endif /* TARGET_NAME */
      86  
      87  #ifndef TARGET_STRING
      88  #error TARGET_STRING must be defined
      89  #endif /* TARGET_STRING */
      90  
      91  #ifndef TARGET_ARCHITECTURE
      92  #error TARGET_ARCHITECTURE must be defined
      93  #endif /* TARGET_ARCHITECTURE */
      94  
      95  #ifndef TARGET_BIG_ENDIAN
      96  #error TARGET_BIG_ENDIAN must be defined
      97  #endif /* TARGET_BIG_ENDIAN */
      98  
      99  #ifndef TARGET_ARCHIVE
     100  #error TARGET_ARCHIVE must be defined
     101  #endif /* TARGET_ARCHIVE */
     102  
     103  #ifndef TARGET_PAGESIZE
     104  #error TARGET_PAGESIZE must be defined
     105  #endif
     106  
     107  static const bfd_mach_o_backend_data TARGET_NAME_BACKEND =
     108  {
     109    TARGET_ARCHITECTURE,
     110    TARGET_PAGESIZE,
     111    bfd_mach_o_canonicalize_one_reloc,
     112    bfd_mach_o_swap_reloc_out,
     113    bfd_mach_o_print_thread,
     114    bfd_mach_o_tgt_seg_table,
     115    bfd_mach_o_section_type_valid_for_tgt
     116  };
     117  
     118  const bfd_target TARGET_NAME =
     119  {
     120    TARGET_STRING,		/* Name.  */
     121    bfd_target_mach_o_flavour,
     122  #if TARGET_BIG_ENDIAN
     123    BFD_ENDIAN_BIG,		/* Target byte order.  */
     124    BFD_ENDIAN_BIG,		/* Target headers byte order.  */
     125  #else
     126    BFD_ENDIAN_LITTLE,		/* Target byte order.  */
     127    BFD_ENDIAN_LITTLE,		/* Target headers byte order.  */
     128  #endif
     129    (HAS_RELOC | EXEC_P |		/* Object flags.  */
     130     HAS_LINENO | HAS_DEBUG |
     131     HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
     132    (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
     133     | SEC_ALLOC | SEC_LOAD | SEC_RELOC),	/* Section flags.  */
     134    '_',				/* symbol_leading_char.  */
     135    ' ',				/* ar_pad_char.  */
     136    16,				/* ar_max_namelen.  */
     137    TARGET_PRIORITY,	/* match priority.  */
     138    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
     139  
     140  #if TARGET_BIG_ENDIAN
     141    bfd_getb64, bfd_getb_signed_64, bfd_putb64,
     142    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
     143    bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
     144    bfd_getb64, bfd_getb_signed_64, bfd_putb64,
     145    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
     146    bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Hdrs.  */
     147  #else
     148    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     149    bfd_getl32, bfd_getl_signed_32, bfd_putl32,
     150    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
     151    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     152    bfd_getl32, bfd_getl_signed_32, bfd_putl32,
     153    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */
     154  #endif /* TARGET_BIG_ENDIAN */
     155  
     156    {				/* bfd_check_format.  */
     157  #if TARGET_ARCHIVE
     158      _bfd_dummy_target,
     159      _bfd_dummy_target,
     160      bfd_mach_o_archive_p,
     161      _bfd_dummy_target,
     162  #else
     163      _bfd_dummy_target,
     164      bfd_mach_o_object_p,
     165      bfd_generic_archive_p,
     166      bfd_mach_o_core_p
     167  #endif
     168    },
     169    {				/* bfd_set_format.  */
     170      _bfd_bool_bfd_false_error,
     171      bfd_mach_o_mkobject,
     172      _bfd_generic_mkarchive,
     173      bfd_mach_o_mkobject,
     174    },
     175    {				/* bfd_write_contents.  */
     176      _bfd_bool_bfd_false_error,
     177      bfd_mach_o_write_contents,
     178      _bfd_write_archive_contents,
     179      bfd_mach_o_write_contents,
     180    },
     181  
     182    BFD_JUMP_TABLE_GENERIC (bfd_mach_o),
     183    BFD_JUMP_TABLE_COPY (bfd_mach_o),
     184    BFD_JUMP_TABLE_CORE (bfd_mach_o),
     185  #if TARGET_ARCHIVE
     186    BFD_JUMP_TABLE_ARCHIVE (bfd_mach_o),
     187  #else
     188    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd44),
     189  #endif
     190    BFD_JUMP_TABLE_SYMBOLS (bfd_mach_o),
     191    BFD_JUMP_TABLE_RELOCS (bfd_mach_o),
     192    BFD_JUMP_TABLE_WRITE (bfd_mach_o),
     193    BFD_JUMP_TABLE_LINK (bfd_mach_o),
     194    BFD_JUMP_TABLE_DYNAMIC (bfd_mach_o),
     195  
     196    /* Alternative endian target.  */
     197    NULL,
     198  
     199    /* Back-end data.  */
     200    &TARGET_NAME_BACKEND
     201  };
     202