(root)/
binutils-2.41/
bfd/
targets.c
       1  /* Generic target-file-type support for the BFD library.
       2     Copyright (C) 1990-2023 Free Software Foundation, Inc.
       3     Written by Cygnus Support.
       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; if not, write to the Free Software
      19     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      20     MA 02110-1301, USA.  */
      21  
      22  #include "sysdep.h"
      23  #include "libiberty.h"
      24  #include "bfd.h"
      25  #include "libbfd.h"
      26  #include "fnmatch.h"
      27  
      28  /*
      29     It's okay to see some:
      30  #if 0
      31     directives in this source file, as targets.c uses them to exclude
      32     certain BFD vectors.  This comment is specially formatted to catch
      33     users who grep for ^#if 0, so please keep it this way!
      34  */
      35  
      36  /*
      37  SECTION
      38  	Targets
      39  
      40  DESCRIPTION
      41  	Each port of BFD to a different machine requires the creation
      42  	of a target back end. All the back end provides to the root
      43  	part of BFD is a structure containing pointers to functions
      44  	which perform certain low level operations on files. BFD
      45  	translates the applications's requests through a pointer into
      46  	calls to the back end routines.
      47  
      48  	When a file is opened with <<bfd_openr>>, its format and
      49  	target are unknown. BFD uses various mechanisms to determine
      50  	how to interpret the file. The operations performed are:
      51  
      52  	o Create a BFD by calling the internal routine
      53  	<<_bfd_new_bfd>>, then call <<bfd_find_target>> with the
      54  	target string supplied to <<bfd_openr>> and the new BFD pointer.
      55  
      56  	o If a null target string was provided to <<bfd_find_target>>,
      57  	look up the environment variable <<GNUTARGET>> and use
      58  	that as the target string.
      59  
      60  	o If the target string is still <<NULL>>, or the target string is
      61  	<<default>>, then use the first item in the target vector
      62  	as the target type, and set <<target_defaulted>> in the BFD to
      63  	cause <<bfd_check_format>> to loop through all the targets.
      64  	@xref{bfd_target}.  @xref{Formats}.
      65  
      66  	o Otherwise, inspect the elements in the target vector
      67  	one by one, until a match on target name is found. When found,
      68  	use it.
      69  
      70  	o Otherwise return the error <<bfd_error_invalid_target>> to
      71  	<<bfd_openr>>.
      72  
      73  	o <<bfd_openr>> attempts to open the file using
      74  	<<bfd_open_file>>, and returns the BFD.
      75  
      76  	Once the BFD has been opened and the target selected, the file
      77  	format may be determined. This is done by calling
      78  	<<bfd_check_format>> on the BFD with a suggested format.
      79  	If <<target_defaulted>> has been set, each possible target
      80  	type is tried to see if it recognizes the specified format.
      81  	<<bfd_check_format>> returns <<TRUE>> when the caller guesses right.
      82  @menu
      83  @* bfd_target::
      84  @end menu
      85  */
      86  
      87  /*
      88  
      89  INODE
      90  	bfd_target,  , Targets, Targets
      91  DOCDD
      92  SUBSECTION
      93  	bfd_target
      94  
      95  DESCRIPTION
      96  	This structure contains everything that BFD knows about a
      97  	target. It includes things like its byte order, name, and which
      98  	routines to call to do various operations.
      99  
     100  	Every BFD points to a target structure with its <<xvec>>
     101  	member.
     102  
     103  	The macros below are used to dispatch to functions through the
     104  	<<bfd_target>> vector. They are used in a number of macros further
     105  	down in @file{bfd.h}, and are also used when calling various
     106  	routines by hand inside the BFD implementation.  The @var{arglist}
     107  	argument must be parenthesized; it contains all the arguments
     108  	to the called function.
     109  
     110  	They make the documentation (more) unpleasant to read, so if
     111  	someone wants to fix this and not break the above, please do.
     112  
     113  .#define BFD_SEND(bfd, message, arglist) \
     114  .  ((*((bfd)->xvec->message)) arglist)
     115  .
     116  .#ifdef DEBUG_BFD_SEND
     117  .#undef BFD_SEND
     118  .#define BFD_SEND(bfd, message, arglist) \
     119  .  (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
     120  .    ((*((bfd)->xvec->message)) arglist) : \
     121  .    (bfd_assert (__FILE__,__LINE__), NULL))
     122  .#endif
     123  
     124  	For operations which index on the BFD format:
     125  
     126  .#define BFD_SEND_FMT(bfd, message, arglist) \
     127  .  (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist)
     128  .
     129  .#ifdef DEBUG_BFD_SEND
     130  .#undef BFD_SEND_FMT
     131  .#define BFD_SEND_FMT(bfd, message, arglist) \
     132  .  (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
     133  .   (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) : \
     134  .   (bfd_assert (__FILE__,__LINE__), NULL))
     135  .#endif
     136  .
     137  .{* Defined to TRUE if unused section symbol should be kept.  *}
     138  .#ifndef TARGET_KEEP_UNUSED_SECTION_SYMBOLS
     139  .#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true
     140  .#endif
     141  .
     142  	This is the structure which defines the type of BFD this is.  The
     143  	<<xvec>> member of the struct <<bfd>> itself points here.  Each
     144  	module that implements access to a different target under BFD,
     145  	defines one of these.
     146  
     147  	FIXME, these names should be rationalised with the names of
     148  	the entry points which call them. Too bad we can't have one
     149  	macro to define them both!
     150  
     151  EXTERNAL
     152  .enum bfd_flavour
     153  .{
     154  .  {* N.B. Update bfd_flavour_name if you change this.  *}
     155  .  bfd_target_unknown_flavour,
     156  .  bfd_target_aout_flavour,
     157  .  bfd_target_coff_flavour,
     158  .  bfd_target_ecoff_flavour,
     159  .  bfd_target_xcoff_flavour,
     160  .  bfd_target_elf_flavour,
     161  .  bfd_target_tekhex_flavour,
     162  .  bfd_target_srec_flavour,
     163  .  bfd_target_verilog_flavour,
     164  .  bfd_target_ihex_flavour,
     165  .  bfd_target_som_flavour,
     166  .  bfd_target_msdos_flavour,
     167  .  bfd_target_evax_flavour,
     168  .  bfd_target_mmo_flavour,
     169  .  bfd_target_mach_o_flavour,
     170  .  bfd_target_pef_flavour,
     171  .  bfd_target_pef_xlib_flavour,
     172  .  bfd_target_sym_flavour
     173  .};
     174  .
     175  .enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
     176  .
     177  .{* Forward declarations.  *}
     178  .struct flag_info;
     179  .typedef void (*bfd_cleanup) (bfd *);
     180  .
     181  
     182  CODE_FRAGMENT
     183  .typedef struct bfd_target
     184  .{
     185  .  {* Identifies the kind of target, e.g., SunOS4, Ultrix, etc.  *}
     186  .  const char *name;
     187  .
     188  . {* The "flavour" of a back end is a general indication about
     189  .    the contents of a file.  *}
     190  .  enum bfd_flavour flavour;
     191  .
     192  .  {* The order of bytes within the data area of a file.  *}
     193  .  enum bfd_endian byteorder;
     194  .
     195  . {* The order of bytes within the header parts of a file.  *}
     196  .  enum bfd_endian header_byteorder;
     197  .
     198  .  {* A mask of all the flags which an executable may have set -
     199  .     from the set <<BFD_NO_FLAGS>>, <<HAS_RELOC>>, ...<<D_PAGED>>.  *}
     200  .  flagword object_flags;
     201  .
     202  . {* A mask of all the flags which a section may have set - from
     203  .    the set <<SEC_NO_FLAGS>>, <<SEC_ALLOC>>, ...<<SET_NEVER_LOAD>>.  *}
     204  .  flagword section_flags;
     205  .
     206  . {* The character normally found at the front of a symbol.
     207  .    (if any), perhaps `_'.  *}
     208  .  char symbol_leading_char;
     209  .
     210  . {* The pad character for file names within an archive header.  *}
     211  .  char ar_pad_char;
     212  .
     213  .  {* The maximum number of characters in an archive header.  *}
     214  .  unsigned char ar_max_namelen;
     215  .
     216  .  {* How well this target matches, used to select between various
     217  .     possible targets when more than one target matches.  *}
     218  .  unsigned char match_priority;
     219  .
     220  . {* TRUE if unused section symbols should be kept.  *}
     221  .  bool keep_unused_section_symbols;
     222  .
     223  .  {* Entries for byte swapping for data. These are different from the
     224  .     other entry points, since they don't take a BFD as the first argument.
     225  .     Certain other handlers could do the same.  *}
     226  .  uint64_t	  (*bfd_getx64) (const void *);
     227  .  int64_t	  (*bfd_getx_signed_64) (const void *);
     228  .  void		  (*bfd_putx64) (uint64_t, void *);
     229  .  bfd_vma	  (*bfd_getx32) (const void *);
     230  .  bfd_signed_vma (*bfd_getx_signed_32) (const void *);
     231  .  void		  (*bfd_putx32) (bfd_vma, void *);
     232  .  bfd_vma	  (*bfd_getx16) (const void *);
     233  .  bfd_signed_vma (*bfd_getx_signed_16) (const void *);
     234  .  void		  (*bfd_putx16) (bfd_vma, void *);
     235  .
     236  .  {* Byte swapping for the headers.  *}
     237  .  uint64_t	  (*bfd_h_getx64) (const void *);
     238  .  int64_t	  (*bfd_h_getx_signed_64) (const void *);
     239  .  void		  (*bfd_h_putx64) (uint64_t, void *);
     240  .  bfd_vma	  (*bfd_h_getx32) (const void *);
     241  .  bfd_signed_vma (*bfd_h_getx_signed_32) (const void *);
     242  .  void		  (*bfd_h_putx32) (bfd_vma, void *);
     243  .  bfd_vma	  (*bfd_h_getx16) (const void *);
     244  .  bfd_signed_vma (*bfd_h_getx_signed_16) (const void *);
     245  .  void		  (*bfd_h_putx16) (bfd_vma, void *);
     246  .
     247  .  {* Format dependent routines: these are vectors of entry points
     248  .     within the target vector structure, one for each format to check.  *}
     249  .
     250  .  {* Check the format of a file being read.  Return a <<bfd_cleanup>> on
     251  .     success or zero on failure.  *}
     252  .  bfd_cleanup (*_bfd_check_format[bfd_type_end]) (bfd *);
     253  .
     254  .  {* Set the format of a file being written.  *}
     255  .  bool (*_bfd_set_format[bfd_type_end]) (bfd *);
     256  .
     257  .  {* Write cached information into a file being written, at <<bfd_close>>.  *}
     258  .  bool (*_bfd_write_contents[bfd_type_end]) (bfd *);
     259  .
     260  
     261  The general target vector.  These vectors are initialized using the
     262  BFD_JUMP_TABLE macros.
     263  
     264  .  {* Generic entry points.  *}
     265  .#define BFD_JUMP_TABLE_GENERIC(NAME) \
     266  .  NAME##_close_and_cleanup, \
     267  .  NAME##_bfd_free_cached_info, \
     268  .  NAME##_new_section_hook, \
     269  .  NAME##_get_section_contents, \
     270  .  NAME##_get_section_contents_in_window
     271  .
     272  .  {* Called when the BFD is being closed to do any necessary cleanup.  *}
     273  .  bool (*_close_and_cleanup) (bfd *);
     274  .  {* Ask the BFD to free all cached information.  *}
     275  .  bool (*_bfd_free_cached_info) (bfd *);
     276  .  {* Called when a new section is created.  *}
     277  .  bool (*_new_section_hook) (bfd *, sec_ptr);
     278  .  {* Read the contents of a section.  *}
     279  .  bool (*_bfd_get_section_contents) (bfd *, sec_ptr, void *, file_ptr,
     280  .				      bfd_size_type);
     281  .  bool (*_bfd_get_section_contents_in_window) (bfd *, sec_ptr, bfd_window *,
     282  .						file_ptr, bfd_size_type);
     283  .
     284  .  {* Entry points to copy private data.  *}
     285  .#define BFD_JUMP_TABLE_COPY(NAME) \
     286  .  NAME##_bfd_copy_private_bfd_data, \
     287  .  NAME##_bfd_merge_private_bfd_data, \
     288  .  _bfd_generic_init_private_section_data, \
     289  .  NAME##_bfd_copy_private_section_data, \
     290  .  NAME##_bfd_copy_private_symbol_data, \
     291  .  NAME##_bfd_copy_private_header_data, \
     292  .  NAME##_bfd_set_private_flags, \
     293  .  NAME##_bfd_print_private_bfd_data
     294  .
     295  .  {* Called to copy BFD general private data from one object file
     296  .     to another.  *}
     297  .  bool (*_bfd_copy_private_bfd_data) (bfd *, bfd *);
     298  .  {* Called to merge BFD general private data from one object file
     299  .     to a common output file when linking.  *}
     300  .  bool (*_bfd_merge_private_bfd_data) (bfd *, struct bfd_link_info *);
     301  .  {* Called to initialize BFD private section data from one object file
     302  .     to another.  *}
     303  .#define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \
     304  .	BFD_SEND (obfd, _bfd_init_private_section_data, \
     305  .		  (ibfd, isec, obfd, osec, link_info))
     306  .  bool (*_bfd_init_private_section_data) (bfd *, sec_ptr, bfd *, sec_ptr,
     307  .					   struct bfd_link_info *);
     308  .  {* Called to copy BFD private section data from one object file
     309  .     to another.  *}
     310  .  bool (*_bfd_copy_private_section_data) (bfd *, sec_ptr, bfd *, sec_ptr);
     311  .  {* Called to copy BFD private symbol data from one symbol
     312  .     to another.  *}
     313  .  bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol *,
     314  .					  bfd *, asymbol *);
     315  .  {* Called to copy BFD private header data from one object file
     316  .     to another.  *}
     317  .  bool (*_bfd_copy_private_header_data) (bfd *, bfd *);
     318  .  {* Called to set private backend flags.  *}
     319  .  bool (*_bfd_set_private_flags) (bfd *, flagword);
     320  .
     321  .  {* Called to print private BFD data.  *}
     322  .  bool (*_bfd_print_private_bfd_data) (bfd *, void *);
     323  .
     324  .  {* Core file entry points.  *}
     325  .#define BFD_JUMP_TABLE_CORE(NAME) \
     326  .  NAME##_core_file_failing_command, \
     327  .  NAME##_core_file_failing_signal, \
     328  .  NAME##_core_file_matches_executable_p, \
     329  .  NAME##_core_file_pid
     330  .
     331  .  char *(*_core_file_failing_command) (bfd *);
     332  .  int   (*_core_file_failing_signal) (bfd *);
     333  .  bool  (*_core_file_matches_executable_p) (bfd *, bfd *);
     334  .  int   (*_core_file_pid) (bfd *);
     335  .
     336  .  {* Archive entry points.  *}
     337  .#define BFD_JUMP_TABLE_ARCHIVE(NAME) \
     338  .  NAME##_slurp_armap, \
     339  .  NAME##_slurp_extended_name_table, \
     340  .  NAME##_construct_extended_name_table, \
     341  .  NAME##_truncate_arname, \
     342  .  NAME##_write_armap, \
     343  .  NAME##_read_ar_hdr, \
     344  .  NAME##_write_ar_hdr, \
     345  .  NAME##_openr_next_archived_file, \
     346  .  NAME##_get_elt_at_index, \
     347  .  NAME##_generic_stat_arch_elt, \
     348  .  NAME##_update_armap_timestamp
     349  .
     350  .  bool (*_bfd_slurp_armap) (bfd *);
     351  .  bool (*_bfd_slurp_extended_name_table) (bfd *);
     352  .  bool (*_bfd_construct_extended_name_table) (bfd *, char **,
     353  .					       bfd_size_type *,
     354  .					       const char **);
     355  .  void (*_bfd_truncate_arname) (bfd *, const char *, char *);
     356  .  bool (*write_armap) (bfd *, unsigned, struct orl *, unsigned, int);
     357  .  void *(*_bfd_read_ar_hdr_fn) (bfd *);
     358  .  bool (*_bfd_write_ar_hdr_fn) (bfd *, bfd *);
     359  .  bfd *(*openr_next_archived_file) (bfd *, bfd *);
     360  .#define bfd_get_elt_at_index(b,i) \
     361  .	BFD_SEND (b, _bfd_get_elt_at_index, (b,i))
     362  .  bfd *(*_bfd_get_elt_at_index) (bfd *, symindex);
     363  .  int  (*_bfd_stat_arch_elt) (bfd *, struct stat *);
     364  .  bool (*_bfd_update_armap_timestamp) (bfd *);
     365  .
     366  .  {* Entry points used for symbols.  *}
     367  .#define BFD_JUMP_TABLE_SYMBOLS(NAME) \
     368  .  NAME##_get_symtab_upper_bound, \
     369  .  NAME##_canonicalize_symtab, \
     370  .  NAME##_make_empty_symbol, \
     371  .  NAME##_print_symbol, \
     372  .  NAME##_get_symbol_info, \
     373  .  NAME##_get_symbol_version_string, \
     374  .  NAME##_bfd_is_local_label_name, \
     375  .  NAME##_bfd_is_target_special_symbol, \
     376  .  NAME##_get_lineno, \
     377  .  NAME##_find_nearest_line, \
     378  .  NAME##_find_nearest_line_with_alt, \
     379  .  NAME##_find_line, \
     380  .  NAME##_find_inliner_info, \
     381  .  NAME##_bfd_make_debug_symbol, \
     382  .  NAME##_read_minisymbols, \
     383  .  NAME##_minisymbol_to_symbol
     384  .
     385  .  long	(*_bfd_get_symtab_upper_bound) (bfd *);
     386  .  long	(*_bfd_canonicalize_symtab) (bfd *, struct bfd_symbol **);
     387  .  struct bfd_symbol *
     388  .	(*_bfd_make_empty_symbol) (bfd *);
     389  .  void	(*_bfd_print_symbol) (bfd *, void *, struct bfd_symbol *,
     390  .			      bfd_print_symbol_type);
     391  .#define bfd_print_symbol(b,p,s,e) \
     392  .	BFD_SEND (b, _bfd_print_symbol, (b,p,s,e))
     393  .  void	 (*_bfd_get_symbol_info) (bfd *, struct bfd_symbol *, symbol_info *);
     394  .#define bfd_get_symbol_info(b,p,e) \
     395  .	BFD_SEND (b, _bfd_get_symbol_info, (b,p,e))
     396  .  const char *
     397  .	(*_bfd_get_symbol_version_string) (bfd *, struct bfd_symbol *,
     398  .					   bool, bool *);
     399  .#define bfd_get_symbol_version_string(b,s,p,h) \
     400  .	BFD_SEND (b, _bfd_get_symbol_version_string, (b,s,p,h))
     401  .  bool (*_bfd_is_local_label_name) (bfd *, const char *);
     402  .  bool (*_bfd_is_target_special_symbol) (bfd *, asymbol *);
     403  .  alent *
     404  .	(*_get_lineno) (bfd *, struct bfd_symbol *);
     405  .  bool (*_bfd_find_nearest_line) (bfd *, struct bfd_symbol **,
     406  .				   struct bfd_section *, bfd_vma,
     407  .				   const char **, const char **,
     408  .				   unsigned int *, unsigned int *);
     409  .  bool (*_bfd_find_nearest_line_with_alt) (bfd *, const char *,
     410  .					    struct bfd_symbol **,
     411  .					    struct bfd_section *, bfd_vma,
     412  .					    const char **, const char **,
     413  .					    unsigned int *, unsigned int *);
     414  .  bool (*_bfd_find_line) (bfd *, struct bfd_symbol **,
     415  .			   struct bfd_symbol *, const char **,
     416  .			   unsigned int *);
     417  .  bool (*_bfd_find_inliner_info)
     418  .    (bfd *, const char **, const char **, unsigned int *);
     419  . {* Back-door to allow format-aware applications to create debug symbols
     420  .    while using BFD for everything else.  Currently used by the assembler
     421  .    when creating COFF files.  *}
     422  .  asymbol *
     423  .	(*_bfd_make_debug_symbol) (bfd *);
     424  .#define bfd_read_minisymbols(b, d, m, s) \
     425  .	BFD_SEND (b, _read_minisymbols, (b, d, m, s))
     426  .  long	(*_read_minisymbols) (bfd *, bool, void **, unsigned int *);
     427  .#define bfd_minisymbol_to_symbol(b, d, m, f) \
     428  .	BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f))
     429  .  asymbol *
     430  .       (*_minisymbol_to_symbol) (bfd *, bool, const void *, asymbol *);
     431  .
     432  .  {* Routines for relocs.  *}
     433  .#define BFD_JUMP_TABLE_RELOCS(NAME) \
     434  .  NAME##_get_reloc_upper_bound, \
     435  .  NAME##_canonicalize_reloc, \
     436  .  NAME##_set_reloc, \
     437  .  NAME##_bfd_reloc_type_lookup, \
     438  .  NAME##_bfd_reloc_name_lookup
     439  .
     440  .  long	(*_get_reloc_upper_bound) (bfd *, sec_ptr);
     441  .  long	(*_bfd_canonicalize_reloc) (bfd *, sec_ptr, arelent **,
     442  .				    struct bfd_symbol **);
     443  .  void	(*_bfd_set_reloc) (bfd *, sec_ptr, arelent **, unsigned int);
     444  .  {* See documentation on reloc types.  *}
     445  .  reloc_howto_type *
     446  .	(*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type);
     447  .  reloc_howto_type *
     448  .	(*reloc_name_lookup) (bfd *, const char *);
     449  .
     450  .  {* Routines used when writing an object file.  *}
     451  .#define BFD_JUMP_TABLE_WRITE(NAME) \
     452  .  NAME##_set_arch_mach, \
     453  .  NAME##_set_section_contents
     454  .
     455  .  bool (*_bfd_set_arch_mach) (bfd *, enum bfd_architecture,
     456  .				      unsigned long);
     457  .  bool (*_bfd_set_section_contents) (bfd *, sec_ptr, const void *,
     458  .				      file_ptr, bfd_size_type);
     459  .
     460  .  {* Routines used by the linker.  *}
     461  .#define BFD_JUMP_TABLE_LINK(NAME) \
     462  .  NAME##_sizeof_headers, \
     463  .  NAME##_bfd_get_relocated_section_contents, \
     464  .  NAME##_bfd_relax_section, \
     465  .  NAME##_bfd_link_hash_table_create, \
     466  .  NAME##_bfd_link_add_symbols, \
     467  .  NAME##_bfd_link_just_syms, \
     468  .  NAME##_bfd_copy_link_hash_symbol_type, \
     469  .  NAME##_bfd_final_link, \
     470  .  NAME##_bfd_link_split_section, \
     471  .  NAME##_bfd_link_check_relocs, \
     472  .  NAME##_bfd_gc_sections, \
     473  .  NAME##_bfd_lookup_section_flags, \
     474  .  NAME##_bfd_merge_sections, \
     475  .  NAME##_bfd_is_group_section, \
     476  .  NAME##_bfd_group_name, \
     477  .  NAME##_bfd_discard_group, \
     478  .  NAME##_section_already_linked, \
     479  .  NAME##_bfd_define_common_symbol, \
     480  .  NAME##_bfd_link_hide_symbol, \
     481  .  NAME##_bfd_define_start_stop
     482  .
     483  .  int	(*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *);
     484  .  bfd_byte *
     485  .	(*_bfd_get_relocated_section_contents) (bfd *,
     486  .					        struct bfd_link_info *,
     487  .					        struct bfd_link_order *,
     488  .					        bfd_byte *, bool,
     489  .					        struct bfd_symbol **);
     490  .
     491  .  bool (*_bfd_relax_section) (bfd *, struct bfd_section *,
     492  .			       struct bfd_link_info *, bool *);
     493  .
     494  .  {* Create a hash table for the linker.  Different backends store
     495  .     different information in this table.  *}
     496  .  struct bfd_link_hash_table *
     497  .	(*_bfd_link_hash_table_create) (bfd *);
     498  .
     499  .  {* Add symbols from this object file into the hash table.  *}
     500  .  bool (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *);
     501  .
     502  .  {* Indicate that we are only retrieving symbol values from this section.  *}
     503  .  void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *);
     504  .
     505  .  {* Copy the symbol type and other attributes for a linker script
     506  .     assignment of one symbol to another.  *}
     507  .#define bfd_copy_link_hash_symbol_type(b, t, f) \
     508  .	BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f))
     509  .  void (*_bfd_copy_link_hash_symbol_type) (bfd *,
     510  .					    struct bfd_link_hash_entry *,
     511  .					    struct bfd_link_hash_entry *);
     512  .
     513  .  {* Do a link based on the link_order structures attached to each
     514  .     section of the BFD.  *}
     515  .  bool (*_bfd_final_link) (bfd *, struct bfd_link_info *);
     516  .
     517  .  {* Should this section be split up into smaller pieces during linking.  *}
     518  .  bool (*_bfd_link_split_section) (bfd *, struct bfd_section *);
     519  .
     520  .  {* Check the relocations in the bfd for validity.  *}
     521  .  bool (* _bfd_link_check_relocs)(bfd *, struct bfd_link_info *);
     522  .
     523  .  {* Remove sections that are not referenced from the output.  *}
     524  .  bool (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
     525  .
     526  .  {* Sets the bitmask of allowed and disallowed section flags.  *}
     527  .  bool (*_bfd_lookup_section_flags) (struct bfd_link_info *,
     528  .				      struct flag_info *, asection *);
     529  .
     530  .  {* Attempt to merge SEC_MERGE sections.  *}
     531  .  bool (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
     532  .
     533  .  {* Is this section a member of a group?  *}
     534  .  bool (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
     535  .
     536  .  {* The group name, if section is a member of a group.  *}
     537  .  const char *(*_bfd_group_name) (bfd *, const struct bfd_section *);
     538  .
     539  .  {* Discard members of a group.  *}
     540  .  bool (*_bfd_discard_group) (bfd *, struct bfd_section *);
     541  .
     542  .  {* Check if SEC has been already linked during a reloceatable or
     543  .     final link.  *}
     544  .  bool (*_section_already_linked) (bfd *, asection *,
     545  .				    struct bfd_link_info *);
     546  .
     547  .  {* Define a common symbol.  *}
     548  .  bool (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *,
     549  .				      struct bfd_link_hash_entry *);
     550  .
     551  .  {* Hide a symbol.  *}
     552  .  void (*_bfd_link_hide_symbol) (bfd *, struct bfd_link_info *,
     553  .				  struct bfd_link_hash_entry *);
     554  .
     555  .  {* Define a __start, __stop, .startof. or .sizeof. symbol.  *}
     556  .  struct bfd_link_hash_entry *
     557  .	(*_bfd_define_start_stop) (struct bfd_link_info *, const char *,
     558  .				   asection *);
     559  .
     560  .  {* Routines to handle dynamic symbols and relocs.  *}
     561  .#define BFD_JUMP_TABLE_DYNAMIC(NAME) \
     562  .  NAME##_get_dynamic_symtab_upper_bound, \
     563  .  NAME##_canonicalize_dynamic_symtab, \
     564  .  NAME##_get_synthetic_symtab, \
     565  .  NAME##_get_dynamic_reloc_upper_bound, \
     566  .  NAME##_canonicalize_dynamic_reloc
     567  .
     568  .  {* Get the amount of memory required to hold the dynamic symbols.  *}
     569  .  long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *);
     570  .  {* Read in the dynamic symbols.  *}
     571  .  long (*_bfd_canonicalize_dynamic_symtab) (bfd *, struct bfd_symbol **);
     572  .  {* Create synthetized symbols.  *}
     573  .  long (*_bfd_get_synthetic_symtab) (bfd *, long, struct bfd_symbol **,
     574  .				      long, struct bfd_symbol **,
     575  .				      struct bfd_symbol **);
     576  .  {* Get the amount of memory required to hold the dynamic relocs.  *}
     577  .  long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
     578  .  {* Read in the dynamic relocs.  *}
     579  .  long (*_bfd_canonicalize_dynamic_reloc) (bfd *, arelent **,
     580  .					    struct bfd_symbol **);
     581  .
     582  
     583  A pointer to an alternative bfd_target in case the current one is not
     584  satisfactory.  This can happen when the target cpu supports both big
     585  and little endian code, and target chosen by the linker has the wrong
     586  endianness.  The function open_output() in ld/ldlang.c uses this field
     587  to find an alternative output format that is suitable.
     588  
     589  .  {* Opposite endian version of this target.  *}
     590  .  const struct bfd_target *alternative_target;
     591  .
     592  
     593  .  {* Data for use by back-end routines, which isn't
     594  .     generic enough to belong in this structure.  *}
     595  .  const void *backend_data;
     596  .
     597  .} bfd_target;
     598  .
     599  .static inline const char *
     600  .bfd_get_target (const bfd *abfd)
     601  .{
     602  .  return abfd->xvec->name;
     603  .}
     604  .
     605  .static inline enum bfd_flavour
     606  .bfd_get_flavour (const bfd *abfd)
     607  .{
     608  .  return abfd->xvec->flavour;
     609  .}
     610  .
     611  .static inline flagword
     612  .bfd_applicable_file_flags (const bfd *abfd)
     613  .{
     614  .  return abfd->xvec->object_flags;
     615  .}
     616  .
     617  .static inline bool
     618  .bfd_family_coff (const bfd *abfd)
     619  .{
     620  .  return (bfd_get_flavour (abfd) == bfd_target_coff_flavour
     621  .          || bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
     622  .}
     623  .
     624  .static inline bool
     625  .bfd_big_endian (const bfd *abfd)
     626  .{
     627  .  return abfd->xvec->byteorder == BFD_ENDIAN_BIG;
     628  .}
     629  .static inline bool
     630  .bfd_little_endian (const bfd *abfd)
     631  .{
     632  .  return abfd->xvec->byteorder == BFD_ENDIAN_LITTLE;
     633  .}
     634  .
     635  .static inline bool
     636  .bfd_header_big_endian (const bfd *abfd)
     637  .{
     638  .  return abfd->xvec->header_byteorder == BFD_ENDIAN_BIG;
     639  .}
     640  .
     641  .static inline bool
     642  .bfd_header_little_endian (const bfd *abfd)
     643  .{
     644  .  return abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE;
     645  .}
     646  .
     647  .static inline flagword
     648  .bfd_applicable_section_flags (const bfd *abfd)
     649  .{
     650  .  return abfd->xvec->section_flags;
     651  .}
     652  .
     653  .static inline char
     654  .bfd_get_symbol_leading_char (const bfd *abfd)
     655  .{
     656  .  return abfd->xvec->symbol_leading_char;
     657  .}
     658  .
     659  .static inline enum bfd_flavour
     660  .bfd_asymbol_flavour (const asymbol *sy)
     661  .{
     662  .  if ((sy->flags & BSF_SYNTHETIC) != 0)
     663  .    return bfd_target_unknown_flavour;
     664  .  return sy->the_bfd->xvec->flavour;
     665  .}
     666  .
     667  .static inline bool
     668  .bfd_keep_unused_section_symbols (const bfd *abfd)
     669  .{
     670  .  return abfd->xvec->keep_unused_section_symbols;
     671  .}
     672  .
     673  */
     674  
     675  /* All known xvecs (even those that don't compile on all systems).
     676     Alphabetized for easy reference.
     677     They are listed a second time below, since
     678     we can't intermix extern's and initializers.  */
     679  extern const bfd_target aarch64_elf32_be_vec;
     680  extern const bfd_target aarch64_elf32_le_vec;
     681  extern const bfd_target aarch64_elf64_be_vec;
     682  extern const bfd_target aarch64_elf64_be_cloudabi_vec;
     683  extern const bfd_target aarch64_elf64_le_vec;
     684  extern const bfd_target aarch64_elf64_le_cloudabi_vec;
     685  extern const bfd_target aarch64_mach_o_vec;
     686  extern const bfd_target aarch64_pei_le_vec;
     687  extern const bfd_target aarch64_pe_le_vec;
     688  extern const bfd_target alpha_ecoff_le_vec;
     689  extern const bfd_target alpha_elf64_vec;
     690  extern const bfd_target alpha_elf64_fbsd_vec;
     691  extern const bfd_target alpha_vms_vec;
     692  extern const bfd_target alpha_vms_lib_txt_vec;
     693  extern const bfd_target am33_elf32_linux_vec;
     694  extern const bfd_target amdgcn_elf64_le_vec;
     695  extern const bfd_target aout_vec;
     696  extern const bfd_target arc_elf32_be_vec;
     697  extern const bfd_target arc_elf32_le_vec;
     698  extern const bfd_target arm_elf32_be_vec;
     699  extern const bfd_target arm_elf32_le_vec;
     700  extern const bfd_target arm_elf32_fdpic_be_vec;
     701  extern const bfd_target arm_elf32_fdpic_le_vec;
     702  extern const bfd_target arm_elf32_nacl_be_vec;
     703  extern const bfd_target arm_elf32_nacl_le_vec;
     704  extern const bfd_target arm_elf32_vxworks_be_vec;
     705  extern const bfd_target arm_elf32_vxworks_le_vec;
     706  extern const bfd_target arm_mach_o_vec;
     707  extern const bfd_target arm_pe_be_vec;
     708  extern const bfd_target arm_pe_le_vec;
     709  extern const bfd_target arm_pe_wince_be_vec;
     710  extern const bfd_target arm_pe_wince_le_vec;
     711  extern const bfd_target arm_pei_be_vec;
     712  extern const bfd_target arm_pei_le_vec;
     713  extern const bfd_target arm_pei_wince_be_vec;
     714  extern const bfd_target arm_pei_wince_le_vec;
     715  extern const bfd_target avr_elf32_vec;
     716  extern const bfd_target bfin_elf32_vec;
     717  extern const bfd_target bfin_elf32_fdpic_vec;
     718  extern const bfd_target cr16_elf32_vec;
     719  extern const bfd_target cris_aout_vec;
     720  extern const bfd_target cris_elf32_vec;
     721  extern const bfd_target cris_elf32_us_vec;
     722  extern const bfd_target crx_elf32_vec;
     723  extern const bfd_target csky_elf32_be_vec;
     724  extern const bfd_target csky_elf32_le_vec;
     725  extern const bfd_target d10v_elf32_vec;
     726  extern const bfd_target d30v_elf32_vec;
     727  extern const bfd_target dlx_elf32_be_vec;
     728  extern const bfd_target elf32_be_vec;
     729  extern const bfd_target elf32_le_vec;
     730  extern const bfd_target elf64_be_vec;
     731  extern const bfd_target elf64_le_vec;
     732  extern const bfd_target bpf_elf64_le_vec;
     733  extern const bfd_target bpf_elf64_be_vec;
     734  extern const bfd_target epiphany_elf32_vec;
     735  extern const bfd_target fr30_elf32_vec;
     736  extern const bfd_target frv_elf32_vec;
     737  extern const bfd_target frv_elf32_fdpic_vec;
     738  extern const bfd_target h8300_elf32_vec;
     739  extern const bfd_target h8300_elf32_linux_vec;
     740  extern const bfd_target hppa_elf32_vec;
     741  extern const bfd_target hppa_elf32_linux_vec;
     742  extern const bfd_target hppa_elf32_nbsd_vec;
     743  extern const bfd_target hppa_elf64_vec;
     744  extern const bfd_target hppa_elf64_linux_vec;
     745  extern const bfd_target hppa_som_vec;
     746  extern const bfd_target i386_aout_vec;
     747  extern const bfd_target i386_aout_bsd_vec;
     748  extern const bfd_target i386_aout_lynx_vec;
     749  extern const bfd_target i386_coff_vec;
     750  extern const bfd_target i386_coff_go32_vec;
     751  extern const bfd_target i386_coff_go32stubbed_vec;
     752  extern const bfd_target i386_coff_lynx_vec;
     753  extern const bfd_target i386_elf32_vec;
     754  extern const bfd_target i386_elf32_fbsd_vec;
     755  extern const bfd_target i386_elf32_sol2_vec;
     756  extern const bfd_target i386_elf32_vxworks_vec;
     757  extern const bfd_target i386_mach_o_vec;
     758  extern const bfd_target i386_msdos_vec;
     759  extern const bfd_target i386_pe_vec;
     760  extern const bfd_target i386_pe_big_vec;
     761  extern const bfd_target i386_pei_vec;
     762  extern const bfd_target iamcu_elf32_vec;
     763  extern const bfd_target ia64_elf32_be_vec;
     764  extern const bfd_target ia64_elf32_hpux_be_vec;
     765  extern const bfd_target ia64_elf64_be_vec;
     766  extern const bfd_target ia64_elf64_le_vec;
     767  extern const bfd_target ia64_elf64_hpux_be_vec;
     768  extern const bfd_target ia64_elf64_vms_vec;
     769  extern const bfd_target ia64_pei_vec;
     770  extern const bfd_target ip2k_elf32_vec;
     771  extern const bfd_target iq2000_elf32_vec;
     772  extern const bfd_target lm32_elf32_vec;
     773  extern const bfd_target lm32_elf32_fdpic_vec;
     774  extern const bfd_target loongarch_elf64_vec;
     775  extern const bfd_target loongarch_elf32_vec;
     776  extern const bfd_target loongarch64_pei_vec;
     777  extern const bfd_target m32c_elf32_vec;
     778  extern const bfd_target m32r_elf32_vec;
     779  extern const bfd_target m32r_elf32_le_vec;
     780  extern const bfd_target m32r_elf32_linux_vec;
     781  extern const bfd_target m32r_elf32_linux_le_vec;
     782  extern const bfd_target m68hc11_elf32_vec;
     783  extern const bfd_target m68hc12_elf32_vec;
     784  extern const bfd_target m68k_elf32_vec;
     785  extern const bfd_target s12z_elf32_vec;
     786  extern const bfd_target mach_o_be_vec;
     787  extern const bfd_target mach_o_le_vec;
     788  extern const bfd_target mach_o_fat_vec;
     789  extern const bfd_target mcore_elf32_be_vec;
     790  extern const bfd_target mcore_elf32_le_vec;
     791  extern const bfd_target mcore_pe_be_vec;
     792  extern const bfd_target mcore_pe_le_vec;
     793  extern const bfd_target mcore_pei_be_vec;
     794  extern const bfd_target mcore_pei_le_vec;
     795  extern const bfd_target mep_elf32_vec;
     796  extern const bfd_target mep_elf32_le_vec;
     797  extern const bfd_target metag_elf32_vec;
     798  extern const bfd_target microblaze_elf32_vec;
     799  extern const bfd_target microblaze_elf32_le_vec;
     800  extern const bfd_target mips_ecoff_be_vec;
     801  extern const bfd_target mips_ecoff_le_vec;
     802  extern const bfd_target mips_ecoff_bele_vec;
     803  extern const bfd_target mips_elf32_be_vec;
     804  extern const bfd_target mips_elf32_le_vec;
     805  extern const bfd_target mips_elf32_n_be_vec;
     806  extern const bfd_target mips_elf32_n_le_vec;
     807  extern const bfd_target mips_elf32_ntrad_be_vec;
     808  extern const bfd_target mips_elf32_ntrad_le_vec;
     809  extern const bfd_target mips_elf32_ntradfbsd_be_vec;
     810  extern const bfd_target mips_elf32_ntradfbsd_le_vec;
     811  extern const bfd_target mips_elf32_trad_be_vec;
     812  extern const bfd_target mips_elf32_trad_le_vec;
     813  extern const bfd_target mips_elf32_tradfbsd_be_vec;
     814  extern const bfd_target mips_elf32_tradfbsd_le_vec;
     815  extern const bfd_target mips_elf32_vxworks_be_vec;
     816  extern const bfd_target mips_elf32_vxworks_le_vec;
     817  extern const bfd_target mips_elf64_be_vec;
     818  extern const bfd_target mips_elf64_le_vec;
     819  extern const bfd_target mips_elf64_trad_be_vec;
     820  extern const bfd_target mips_elf64_trad_le_vec;
     821  extern const bfd_target mips_elf64_tradfbsd_be_vec;
     822  extern const bfd_target mips_elf64_tradfbsd_le_vec;
     823  extern const bfd_target mmix_elf64_vec;
     824  extern const bfd_target mmix_mmo_vec;
     825  extern const bfd_target mn10200_elf32_vec;
     826  extern const bfd_target mn10300_elf32_vec;
     827  extern const bfd_target moxie_elf32_be_vec;
     828  extern const bfd_target moxie_elf32_le_vec;
     829  extern const bfd_target msp430_elf32_vec;
     830  extern const bfd_target msp430_elf32_ti_vec;
     831  extern const bfd_target mt_elf32_vec;
     832  extern const bfd_target nds32_elf32_be_vec;
     833  extern const bfd_target nds32_elf32_le_vec;
     834  extern const bfd_target nds32_elf32_linux_be_vec;
     835  extern const bfd_target nds32_elf32_linux_le_vec;
     836  extern const bfd_target nfp_elf64_vec;
     837  extern const bfd_target nios2_elf32_be_vec;
     838  extern const bfd_target nios2_elf32_le_vec;
     839  extern const bfd_target ns32k_aout_pc532mach_vec;
     840  extern const bfd_target ns32k_aout_pc532nbsd_vec;
     841  extern const bfd_target or1k_elf32_vec;
     842  extern const bfd_target pdb_vec;
     843  extern const bfd_target pdp11_aout_vec;
     844  extern const bfd_target pef_vec;
     845  extern const bfd_target pef_xlib_vec;
     846  extern const bfd_target pj_elf32_vec;
     847  extern const bfd_target pj_elf32_le_vec;
     848  extern const bfd_target plugin_vec;
     849  extern const bfd_target powerpc_boot_vec;
     850  extern const bfd_target powerpc_elf32_vec;
     851  extern const bfd_target powerpc_elf32_le_vec;
     852  extern const bfd_target powerpc_elf32_fbsd_vec;
     853  extern const bfd_target powerpc_elf32_vxworks_vec;
     854  extern const bfd_target powerpc_elf64_vec;
     855  extern const bfd_target powerpc_elf64_le_vec;
     856  extern const bfd_target powerpc_elf64_fbsd_vec;
     857  extern const bfd_target powerpc_elf64_fbsd_le_vec;
     858  extern const bfd_target powerpc_xcoff_vec;
     859  extern const bfd_target pru_elf32_vec;
     860  extern const bfd_target riscv_elf32_vec;
     861  extern const bfd_target riscv_elf64_vec;
     862  extern const bfd_target riscv_elf32_be_vec;
     863  extern const bfd_target riscv_elf64_be_vec;
     864  extern const bfd_target rl78_elf32_vec;
     865  extern const bfd_target rs6000_xcoff64_vec;
     866  extern const bfd_target rs6000_xcoff64_aix_vec;
     867  extern const bfd_target rs6000_xcoff_vec;
     868  extern const bfd_target rx_elf32_be_vec;
     869  extern const bfd_target rx_elf32_be_ns_vec;
     870  extern const bfd_target rx_elf32_le_vec;
     871  extern const bfd_target rx_elf32_linux_le_vec;
     872  extern const bfd_target s390_elf32_vec;
     873  extern const bfd_target s390_elf64_vec;
     874  extern const bfd_target score_elf32_be_vec;
     875  extern const bfd_target score_elf32_le_vec;
     876  extern const bfd_target sh_coff_vec;
     877  extern const bfd_target sh_coff_le_vec;
     878  extern const bfd_target sh_coff_small_vec;
     879  extern const bfd_target sh_coff_small_le_vec;
     880  extern const bfd_target sh_elf32_vec;
     881  extern const bfd_target sh_elf32_le_vec;
     882  extern const bfd_target sh_elf32_fdpic_be_vec;
     883  extern const bfd_target sh_elf32_fdpic_le_vec;
     884  extern const bfd_target sh_elf32_linux_vec;
     885  extern const bfd_target sh_elf32_linux_be_vec;
     886  extern const bfd_target sh_elf32_nbsd_vec;
     887  extern const bfd_target sh_elf32_nbsd_le_vec;
     888  extern const bfd_target sh_elf32_vxworks_vec;
     889  extern const bfd_target sh_elf32_vxworks_le_vec;
     890  extern const bfd_target sh_pe_le_vec;
     891  extern const bfd_target sh_pei_le_vec;
     892  extern const bfd_target sparc_elf32_vec;
     893  extern const bfd_target sparc_elf32_sol2_vec;
     894  extern const bfd_target sparc_elf32_vxworks_vec;
     895  extern const bfd_target sparc_elf64_vec;
     896  extern const bfd_target sparc_elf64_fbsd_vec;
     897  extern const bfd_target sparc_elf64_sol2_vec;
     898  extern const bfd_target spu_elf32_vec;
     899  extern const bfd_target sym_vec;
     900  extern const bfd_target tic30_coff_vec;
     901  extern const bfd_target tic4x_coff0_vec;
     902  extern const bfd_target tic4x_coff0_beh_vec;
     903  extern const bfd_target tic4x_coff1_vec;
     904  extern const bfd_target tic4x_coff1_beh_vec;
     905  extern const bfd_target tic4x_coff2_vec;
     906  extern const bfd_target tic4x_coff2_beh_vec;
     907  extern const bfd_target tic54x_coff0_vec;
     908  extern const bfd_target tic54x_coff0_beh_vec;
     909  extern const bfd_target tic54x_coff1_vec;
     910  extern const bfd_target tic54x_coff1_beh_vec;
     911  extern const bfd_target tic54x_coff2_vec;
     912  extern const bfd_target tic54x_coff2_beh_vec;
     913  extern const bfd_target tic6x_elf32_be_vec;
     914  extern const bfd_target tic6x_elf32_le_vec;
     915  extern const bfd_target tic6x_elf32_c6000_be_vec;
     916  extern const bfd_target tic6x_elf32_c6000_le_vec;
     917  extern const bfd_target tic6x_elf32_linux_be_vec;
     918  extern const bfd_target tic6x_elf32_linux_le_vec;
     919  extern const bfd_target tilegx_elf32_be_vec;
     920  extern const bfd_target tilegx_elf32_le_vec;
     921  extern const bfd_target tilegx_elf64_be_vec;
     922  extern const bfd_target tilegx_elf64_le_vec;
     923  extern const bfd_target tilepro_elf32_vec;
     924  extern const bfd_target v800_elf32_vec;
     925  extern const bfd_target v850_elf32_vec;
     926  extern const bfd_target ft32_elf32_vec;
     927  extern const bfd_target vax_aout_1knbsd_vec;
     928  extern const bfd_target vax_aout_nbsd_vec;
     929  extern const bfd_target vax_elf32_vec;
     930  extern const bfd_target visium_elf32_vec;
     931  extern const bfd_target wasm_vec;
     932  extern const bfd_target wasm32_elf32_vec;
     933  extern const bfd_target x86_64_coff_vec;
     934  extern const bfd_target x86_64_elf32_vec;
     935  extern const bfd_target x86_64_elf64_vec;
     936  extern const bfd_target x86_64_elf64_cloudabi_vec;
     937  extern const bfd_target x86_64_elf64_fbsd_vec;
     938  extern const bfd_target x86_64_elf64_sol2_vec;
     939  extern const bfd_target x86_64_mach_o_vec;
     940  extern const bfd_target x86_64_pe_vec;
     941  extern const bfd_target x86_64_pe_big_vec;
     942  extern const bfd_target x86_64_pei_vec;
     943  extern const bfd_target xgate_elf32_vec;
     944  extern const bfd_target xstormy16_elf32_vec;
     945  extern const bfd_target xtensa_elf32_be_vec;
     946  extern const bfd_target xtensa_elf32_le_vec;
     947  extern const bfd_target z80_coff_vec;
     948  extern const bfd_target z80_elf32_vec;
     949  extern const bfd_target z8k_coff_vec;
     950  
     951  /* These are always included.  */
     952  extern const bfd_target srec_vec;
     953  extern const bfd_target symbolsrec_vec;
     954  extern const bfd_target verilog_vec;
     955  extern const bfd_target tekhex_vec;
     956  extern const bfd_target binary_vec;
     957  extern const bfd_target ihex_vec;
     958  
     959  /* All of the xvecs for core files.  */
     960  extern const bfd_target core_cisco_be_vec;
     961  extern const bfd_target core_cisco_le_vec;
     962  extern const bfd_target core_hppabsd_vec;
     963  extern const bfd_target core_hpux_vec;
     964  extern const bfd_target core_irix_vec;
     965  extern const bfd_target core_netbsd_vec;
     966  extern const bfd_target core_osf_vec;
     967  extern const bfd_target core_ptrace_vec;
     968  extern const bfd_target core_trad_vec;
     969  
     970  static const bfd_target * const _bfd_target_vector[] =
     971  {
     972  #ifdef SELECT_VECS
     973  
     974  	SELECT_VECS,
     975  
     976  #else /* not SELECT_VECS */
     977  
     978  #ifdef DEFAULT_VECTOR
     979  	&DEFAULT_VECTOR,
     980  #endif
     981  	/* This list is alphabetized to make it easy to compare
     982  	   with other vector lists -- the decls above and
     983  	   the case statement in configure.ac.
     984  	   Try to keep it in order when adding new targets, and
     985  	   use a name of the form <cpu>_<format>_<other>_<endian>_vec.
     986  	   Note that sorting is done as if _<endian>_vec wasn't present.
     987  	   Vectors that don't compile on all systems, or aren't finished,
     988  	   should have an entry here with #if 0 around it, to show that
     989  	   it wasn't omitted by mistake.  */
     990  #ifdef BFD64
     991  	&aarch64_elf32_be_vec,
     992  	&aarch64_elf32_le_vec,
     993  	&aarch64_elf64_be_vec,
     994  	&aarch64_elf64_be_cloudabi_vec,
     995  	&aarch64_elf64_le_vec,
     996  	&aarch64_elf64_le_cloudabi_vec,
     997  	&aarch64_mach_o_vec,
     998  	&aarch64_pe_le_vec,
     999  	&aarch64_pei_le_vec,
    1000  #endif
    1001  
    1002  #ifdef BFD64
    1003  	&amdgcn_elf64_le_vec,
    1004  #endif
    1005  
    1006  #ifdef BFD64
    1007  	&alpha_ecoff_le_vec,
    1008  	&alpha_elf64_vec,
    1009  	&alpha_elf64_fbsd_vec,
    1010  	&alpha_vms_vec,
    1011  #endif
    1012  	&alpha_vms_lib_txt_vec,
    1013  
    1014  	&am33_elf32_linux_vec,
    1015  
    1016  #if 0
    1017  	/* Since a.out files lack decent magic numbers, no way to recognize
    1018  	   which kind of a.out file it is.  */
    1019  	&aout_vec,
    1020  #endif
    1021  
    1022  	&arc_elf32_be_vec,
    1023  	&arc_elf32_le_vec,
    1024  
    1025  	&arm_elf32_be_vec,
    1026  	&arm_elf32_le_vec,
    1027  	&arm_elf32_fdpic_be_vec,
    1028  	&arm_elf32_fdpic_le_vec,
    1029  	&arm_elf32_vxworks_be_vec,
    1030  	&arm_elf32_vxworks_le_vec,
    1031  	&arm_mach_o_vec,
    1032  	&arm_pe_be_vec,
    1033  	&arm_pe_le_vec,
    1034  	&arm_pe_wince_be_vec,
    1035  	&arm_pe_wince_le_vec,
    1036  	&arm_pei_be_vec,
    1037  	&arm_pei_le_vec,
    1038  	&arm_pei_wince_be_vec,
    1039  	&arm_pei_wince_le_vec,
    1040  
    1041  	&avr_elf32_vec,
    1042  
    1043  	&bfin_elf32_vec,
    1044  	&bfin_elf32_fdpic_vec,
    1045  
    1046  	&cr16_elf32_vec,
    1047  
    1048  	&cris_aout_vec,
    1049  	&cris_elf32_vec,
    1050  	&cris_elf32_us_vec,
    1051  
    1052  	&crx_elf32_vec,
    1053  
    1054  	&csky_elf32_be_vec,
    1055  	&csky_elf32_le_vec,
    1056  
    1057  	&d10v_elf32_vec,
    1058  	&d30v_elf32_vec,
    1059  
    1060  	&dlx_elf32_be_vec,
    1061  
    1062  	/* This, and other vectors, may not be used in any *.mt configuration.
    1063  	   But that does not mean they are unnecessary.  If configured with
    1064  	   --enable-targets=all, objdump or gdb should be able to examine
    1065  	   the file even if we don't recognize the machine type.  */
    1066  	&elf32_be_vec,
    1067  	&elf32_le_vec,
    1068  #ifdef BFD64
    1069  	&elf64_be_vec,
    1070  	&elf64_le_vec,
    1071  #endif
    1072  
    1073  	&epiphany_elf32_vec,
    1074  
    1075  	&fr30_elf32_vec,
    1076  
    1077  	&frv_elf32_vec,
    1078  	&frv_elf32_fdpic_vec,
    1079  
    1080  	&h8300_elf32_vec,
    1081  	&h8300_elf32_linux_vec,
    1082  
    1083  	&hppa_elf32_vec,
    1084  	&hppa_elf32_linux_vec,
    1085  	&hppa_elf32_nbsd_vec,
    1086  #ifdef BFD64
    1087  	&hppa_elf64_vec,
    1088  	&hppa_elf64_linux_vec,
    1089  #endif
    1090  	&hppa_som_vec,
    1091  
    1092  	&i386_aout_vec,
    1093  	&i386_aout_bsd_vec,
    1094  	&i386_aout_lynx_vec,
    1095  	&i386_coff_vec,
    1096  	&i386_coff_go32_vec,
    1097  	&i386_coff_go32stubbed_vec,
    1098  	&i386_coff_lynx_vec,
    1099  	&i386_elf32_vec,
    1100  	&i386_elf32_fbsd_vec,
    1101  	&i386_elf32_sol2_vec,
    1102  	&i386_elf32_vxworks_vec,
    1103  	&i386_mach_o_vec,
    1104  	&i386_msdos_vec,
    1105  	&i386_pe_vec,
    1106  	&i386_pe_big_vec,
    1107  	&i386_pei_vec,
    1108  
    1109  	&iamcu_elf32_vec,
    1110  
    1111  #ifdef BFD64
    1112  	&bpf_elf64_be_vec,
    1113  	&bpf_elf64_le_vec,
    1114  #endif
    1115  
    1116  #ifdef BFD64
    1117  #if 0
    1118  	&ia64_elf32_be_vec,
    1119  #endif
    1120  	&ia64_elf32_hpux_be_vec,
    1121  	&ia64_elf64_be_vec,
    1122  	&ia64_elf64_le_vec,
    1123  	&ia64_elf64_hpux_be_vec,
    1124  	&ia64_elf64_vms_vec,
    1125  	&ia64_pei_vec,
    1126  #endif
    1127  
    1128  	&ip2k_elf32_vec,
    1129  	&iq2000_elf32_vec,
    1130  
    1131  	&lm32_elf32_vec,
    1132  
    1133  	&m32c_elf32_vec,
    1134  
    1135  	&m32r_elf32_vec,
    1136  	&m32r_elf32_le_vec,
    1137  	&m32r_elf32_linux_vec,
    1138  	&m32r_elf32_linux_le_vec,
    1139  
    1140  	&m68hc11_elf32_vec,
    1141  	&m68hc12_elf32_vec,
    1142  
    1143  	&m68k_elf32_vec,
    1144  
    1145  	&s12z_elf32_vec,
    1146  
    1147  	&mach_o_be_vec,
    1148  	&mach_o_le_vec,
    1149  	&mach_o_fat_vec,
    1150  
    1151  	&mcore_elf32_be_vec,
    1152  	&mcore_elf32_le_vec,
    1153  	&mcore_pe_be_vec,
    1154  	&mcore_pe_le_vec,
    1155  	&mcore_pei_be_vec,
    1156  	&mcore_pei_le_vec,
    1157  
    1158  	&mep_elf32_vec,
    1159  
    1160  	&metag_elf32_vec,
    1161  
    1162  	&microblaze_elf32_vec,
    1163  
    1164  	&mips_ecoff_be_vec,
    1165  	&mips_ecoff_le_vec,
    1166  	&mips_ecoff_bele_vec,
    1167  #ifdef BFD64
    1168  	&mips_elf32_be_vec,
    1169  	&mips_elf32_le_vec,
    1170  	&mips_elf32_n_be_vec,
    1171  	&mips_elf32_n_le_vec,
    1172  	&mips_elf32_ntrad_be_vec,
    1173  	&mips_elf32_ntrad_le_vec,
    1174  	&mips_elf32_ntradfbsd_be_vec,
    1175  	&mips_elf32_ntradfbsd_le_vec,
    1176  	&mips_elf32_trad_be_vec,
    1177  	&mips_elf32_trad_le_vec,
    1178  	&mips_elf32_tradfbsd_be_vec,
    1179  	&mips_elf32_tradfbsd_le_vec,
    1180  	&mips_elf32_vxworks_be_vec,
    1181  	&mips_elf32_vxworks_le_vec,
    1182  	&mips_elf64_be_vec,
    1183  	&mips_elf64_le_vec,
    1184  	&mips_elf64_trad_be_vec,
    1185  	&mips_elf64_trad_le_vec,
    1186  	&mips_elf64_tradfbsd_be_vec,
    1187  	&mips_elf64_tradfbsd_le_vec,
    1188  #endif
    1189  
    1190  #ifdef BFD64
    1191  	&mmix_elf64_vec,
    1192  	&mmix_mmo_vec,
    1193  #endif
    1194  
    1195  	&mn10200_elf32_vec,
    1196  	&mn10300_elf32_vec,
    1197  
    1198  	&moxie_elf32_be_vec,
    1199  	&moxie_elf32_le_vec,
    1200  
    1201  	&msp430_elf32_vec,
    1202  	&msp430_elf32_ti_vec,
    1203  
    1204  	&mt_elf32_vec,
    1205  
    1206  	&nds32_elf32_be_vec,
    1207  	&nds32_elf32_le_vec,
    1208  	&nds32_elf32_linux_be_vec,
    1209  	&nds32_elf32_linux_le_vec,
    1210  
    1211  #ifdef BFD64
    1212  	&nfp_elf64_vec,
    1213  #endif
    1214  
    1215  	&nios2_elf32_be_vec,
    1216  	&nios2_elf32_le_vec,
    1217  
    1218  	&ns32k_aout_pc532mach_vec,
    1219  	&ns32k_aout_pc532nbsd_vec,
    1220  
    1221  	&or1k_elf32_vec,
    1222  
    1223  	&pdb_vec,
    1224  
    1225  	&pdp11_aout_vec,
    1226  
    1227  	&pef_vec,
    1228  	&pef_xlib_vec,
    1229  
    1230  	&pj_elf32_vec,
    1231  	&pj_elf32_le_vec,
    1232  
    1233  	&powerpc_boot_vec,
    1234  	&powerpc_elf32_vec,
    1235  	&powerpc_elf32_le_vec,
    1236  	&powerpc_elf32_fbsd_vec,
    1237  	&powerpc_elf32_vxworks_vec,
    1238  #ifdef BFD64
    1239  	&powerpc_elf64_vec,
    1240  	&powerpc_elf64_le_vec,
    1241  	&powerpc_elf64_fbsd_vec,
    1242  	&powerpc_elf64_fbsd_le_vec,
    1243  #endif
    1244  #if 0
    1245  	/* This has the same magic number as RS/6000.  */
    1246  	&powerpc_xcoff_vec,
    1247  #endif
    1248  
    1249  	&pru_elf32_vec,
    1250  
    1251  #ifdef BFD64
    1252  	&riscv_elf32_vec,
    1253  	&riscv_elf64_vec,
    1254  	&riscv_elf32_be_vec,
    1255  	&riscv_elf64_be_vec,
    1256  #endif
    1257  	&rl78_elf32_vec,
    1258  
    1259  #ifdef BFD64
    1260  	&rs6000_xcoff64_vec,
    1261  	&rs6000_xcoff64_aix_vec,
    1262  #endif
    1263  	&rs6000_xcoff_vec,
    1264  
    1265  	&rx_elf32_be_vec,
    1266  	&rx_elf32_be_ns_vec,
    1267  	&rx_elf32_le_vec,
    1268  
    1269  	&s390_elf32_vec,
    1270  #ifdef BFD64
    1271  	&s390_elf64_vec,
    1272  #endif
    1273  
    1274  #ifdef BFD64
    1275  	&score_elf32_be_vec,
    1276  	&score_elf32_le_vec,
    1277  #endif
    1278  
    1279  	&sh_coff_vec,
    1280  	&sh_coff_le_vec,
    1281  	&sh_coff_small_vec,
    1282  	&sh_coff_small_le_vec,
    1283  	&sh_elf32_vec,
    1284  	&sh_elf32_le_vec,
    1285  	&sh_elf32_fdpic_be_vec,
    1286  	&sh_elf32_fdpic_le_vec,
    1287  	&sh_elf32_linux_vec,
    1288  	&sh_elf32_linux_be_vec,
    1289  	&sh_elf32_nbsd_vec,
    1290  	&sh_elf32_nbsd_le_vec,
    1291  	&sh_elf32_vxworks_vec,
    1292  	&sh_elf32_vxworks_le_vec,
    1293  	&sh_pe_le_vec,
    1294  	&sh_pei_le_vec,
    1295  
    1296  	&sparc_elf32_vec,
    1297  	&sparc_elf32_sol2_vec,
    1298  	&sparc_elf32_vxworks_vec,
    1299  #ifdef BFD64
    1300  	&sparc_elf64_vec,
    1301  	&sparc_elf64_fbsd_vec,
    1302  	&sparc_elf64_sol2_vec,
    1303  #endif
    1304  
    1305  	&spu_elf32_vec,
    1306  
    1307  	&sym_vec,
    1308  
    1309  	&tic30_coff_vec,
    1310  	&tic54x_coff0_beh_vec,
    1311  	&tic54x_coff0_vec,
    1312  	&tic54x_coff1_beh_vec,
    1313  	&tic54x_coff1_vec,
    1314  	&tic54x_coff2_beh_vec,
    1315  	&tic54x_coff2_vec,
    1316  	&tic6x_elf32_be_vec,
    1317  	&tic6x_elf32_le_vec,
    1318  
    1319  	&tilegx_elf32_be_vec,
    1320  	&tilegx_elf32_le_vec,
    1321  #ifdef BFD64
    1322  	&tilegx_elf64_be_vec,
    1323  	&tilegx_elf64_le_vec,
    1324  #endif
    1325  	&tilepro_elf32_vec,
    1326  
    1327  	&ft32_elf32_vec,
    1328  
    1329  	&v800_elf32_vec,
    1330  	&v850_elf32_vec,
    1331  
    1332  	&vax_aout_1knbsd_vec,
    1333  	&vax_aout_nbsd_vec,
    1334  	&vax_elf32_vec,
    1335  
    1336  	&visium_elf32_vec,
    1337  
    1338  	&wasm_vec,
    1339  	&wasm32_elf32_vec,
    1340  
    1341  #ifdef BFD64
    1342  	&x86_64_coff_vec,
    1343  	&x86_64_elf32_vec,
    1344  	&x86_64_elf64_vec,
    1345  	&x86_64_elf64_cloudabi_vec,
    1346  	&x86_64_elf64_fbsd_vec,
    1347  	&x86_64_elf64_sol2_vec,
    1348  	&x86_64_mach_o_vec,
    1349  	&x86_64_pe_vec,
    1350  	&x86_64_pe_big_vec,
    1351  	&x86_64_pei_vec,
    1352  #endif
    1353  
    1354  	&xgate_elf32_vec,
    1355  
    1356  	&xstormy16_elf32_vec,
    1357  
    1358  	&xtensa_elf32_be_vec,
    1359  	&xtensa_elf32_le_vec,
    1360  
    1361  	&z80_coff_vec,
    1362  	&z80_elf32_vec,
    1363  
    1364  	&z8k_coff_vec,
    1365  
    1366  #ifdef BFD64
    1367  	&loongarch_elf32_vec,
    1368  	&loongarch_elf64_vec,
    1369  	&loongarch64_pei_vec,
    1370  #endif
    1371  
    1372  #endif /* not SELECT_VECS */
    1373  
    1374  /* Always support S-records, for convenience.  */
    1375  	&srec_vec,
    1376  	&symbolsrec_vec,
    1377  /* And verilog.  */
    1378  	&verilog_vec,
    1379  /* And tekhex */
    1380  	&tekhex_vec,
    1381  /* Likewise for binary output.  */
    1382  	&binary_vec,
    1383  /* Likewise for ihex.  */
    1384  	&ihex_vec,
    1385  
    1386  #if BFD_SUPPORTS_PLUGINS
    1387  	&plugin_vec,
    1388  #endif
    1389  
    1390  /* Add any required traditional-core-file-handler.  */
    1391  
    1392  #if 0
    1393  	/* We don't include cisco_core_*_vec.  Although it has a magic number,
    1394  	   the magic number isn't at the beginning of the file, and thus
    1395  	   might spuriously match other kinds of files.  */
    1396  	&core_cisco_be_vec,
    1397  	&core_cisco_le_vec,
    1398  #endif
    1399  #ifdef HPPABSD_CORE
    1400  	&core_hppabsd_vec,
    1401  #endif
    1402  #ifdef HPUX_CORE
    1403  	&core_hpux_vec,
    1404  #endif
    1405  #ifdef IRIX_CORE
    1406  	&core_irix_vec,
    1407  #endif
    1408  #ifdef NETBSD_CORE
    1409  	&core_netbsd_vec,
    1410  #endif
    1411  #ifdef OSF_CORE
    1412  	&core_osf_vec,
    1413  #endif
    1414  #ifdef PTRACE_CORE
    1415  	&core_ptrace_vec,
    1416  #endif
    1417  #ifdef TRAD_CORE
    1418  	&core_trad_vec,
    1419  #endif
    1420  
    1421  	NULL /* end of list marker */
    1422  };
    1423  const bfd_target *const *const bfd_target_vector = _bfd_target_vector;
    1424  
    1425  /* bfd_default_vector[0] contains either the address of the default vector,
    1426     if there is one, or zero if there isn't.  */
    1427  
    1428  const bfd_target *bfd_default_vector[] = {
    1429  #ifdef DEFAULT_VECTOR
    1430  	&DEFAULT_VECTOR,
    1431  #endif
    1432  	NULL
    1433  };
    1434  
    1435  /* bfd_associated_vector[] contains the associated target vectors used
    1436     to reduce the ambiguity in bfd_check_format_matches.  */
    1437  
    1438  static const bfd_target *const _bfd_associated_vector[] = {
    1439  #ifdef ASSOCIATED_VECS
    1440  	ASSOCIATED_VECS,
    1441  #endif
    1442  	NULL
    1443  };
    1444  const bfd_target *const *const bfd_associated_vector = _bfd_associated_vector;
    1445  
    1446  /* When there is an ambiguous match, bfd_check_format_matches puts the
    1447     names of the matching targets in an array.  This variable is the maximum
    1448     number of entries that the array could possibly need.  */
    1449  const size_t _bfd_target_vector_entries = ARRAY_SIZE (_bfd_target_vector);
    1450  
    1451  /* A place to stash a warning from _bfd_check_format.  */
    1452  static struct per_xvec_message *per_xvec_warn[ARRAY_SIZE (_bfd_target_vector)
    1453  					      + 1];
    1454  
    1455  /* This array maps configuration triplets onto BFD vectors.  */
    1456  
    1457  struct targmatch
    1458  {
    1459    /* The configuration triplet.  */
    1460    const char *triplet;
    1461    /* The BFD vector.  If this is NULL, then the vector is found by
    1462       searching forward for the next structure with a non NULL vector
    1463       field.  */
    1464    const bfd_target *vector;
    1465  };
    1466  
    1467  /* targmatch.h is built by Makefile out of config.bfd.  */
    1468  static const struct targmatch bfd_target_match[] = {
    1469  #include "targmatch.h"
    1470    { NULL, NULL }
    1471  };
    1472  
    1473  /*
    1474  INTERNAL
    1475  .{* Cached _bfd_check_format messages are put in this.  *}
    1476  .struct per_xvec_message
    1477  .{
    1478  .  struct per_xvec_message *next;
    1479  .  char message[];
    1480  .};
    1481  .
    1482  INTERNAL_FUNCTION
    1483  	_bfd_per_xvec_warn
    1484  
    1485  SYNOPSIS
    1486  	struct per_xvec_message **_bfd_per_xvec_warn (const bfd_target *, size_t);
    1487  
    1488  DESCRIPTION
    1489  	Return a location for the given target xvec to use for
    1490  	warnings specific to that target.  If TARG is NULL, returns
    1491  	the array of per_xvec_message pointers, otherwise if ALLOC is
    1492  	zero, returns a pointer to a pointer to the list of messages
    1493  	for TARG, otherwise (both TARG and ALLOC non-zero), allocates
    1494  	a new 	per_xvec_message with space for a string of ALLOC
    1495  	bytes and returns a pointer to a pointer to it.  May return a
    1496  	pointer to a NULL pointer on allocation failure.
    1497  */
    1498  
    1499  struct per_xvec_message **
    1500  _bfd_per_xvec_warn (const bfd_target *targ, size_t alloc)
    1501  {
    1502    size_t idx;
    1503  
    1504    if (!targ)
    1505      return per_xvec_warn;
    1506    for (idx = 0; idx < ARRAY_SIZE (_bfd_target_vector); idx++)
    1507      if (_bfd_target_vector[idx] == targ)
    1508        break;
    1509    struct per_xvec_message **m = per_xvec_warn + idx;
    1510    if (!alloc)
    1511      return m;
    1512    int count = 0;
    1513    while (*m)
    1514      {
    1515        m = &(*m)->next;
    1516        count++;
    1517      }
    1518    /* Anti-fuzzer measure.  Don't cache more than 5 messages.  */
    1519    if (count < 5)
    1520      {
    1521        *m = bfd_malloc (sizeof (**m) + alloc);
    1522        if (*m != NULL)
    1523  	(*m)->next = NULL;
    1524      }
    1525    return m;
    1526  }
    1527  
    1528  /* Find a target vector, given a name or configuration triplet.  */
    1529  
    1530  static const bfd_target *
    1531  find_target (const char *name)
    1532  {
    1533    const bfd_target * const *target;
    1534    const struct targmatch *match;
    1535  
    1536    for (target = &bfd_target_vector[0]; *target != NULL; target++)
    1537      if (strcmp (name, (*target)->name) == 0)
    1538        return *target;
    1539  
    1540    /* If we couldn't match on the exact name, try matching on the
    1541       configuration triplet.  FIXME: We should run the triplet through
    1542       config.sub first, but that is hard.  */
    1543    for (match = &bfd_target_match[0]; match->triplet != NULL; match++)
    1544      {
    1545        if (fnmatch (match->triplet, name, 0) == 0)
    1546  	{
    1547  	  while (match->vector == NULL)
    1548  	    ++match;
    1549  	  return match->vector;
    1550  	}
    1551      }
    1552  
    1553    bfd_set_error (bfd_error_invalid_target);
    1554    return NULL;
    1555  }
    1556  
    1557  /*
    1558  FUNCTION
    1559  	bfd_set_default_target
    1560  
    1561  SYNOPSIS
    1562  	bool bfd_set_default_target (const char *name);
    1563  
    1564  DESCRIPTION
    1565  	Set the default target vector to use when recognizing a BFD.
    1566  	This takes the name of the target, which may be a BFD target
    1567  	name or a configuration triplet.
    1568  */
    1569  
    1570  bool
    1571  bfd_set_default_target (const char *name)
    1572  {
    1573    const bfd_target *target;
    1574  
    1575    if (bfd_default_vector[0] != NULL
    1576        && strcmp (name, bfd_default_vector[0]->name) == 0)
    1577      return true;
    1578  
    1579    target = find_target (name);
    1580    if (target == NULL)
    1581      return false;
    1582  
    1583    bfd_default_vector[0] = target;
    1584    return true;
    1585  }
    1586  
    1587  /*
    1588  FUNCTION
    1589  	bfd_find_target
    1590  
    1591  SYNOPSIS
    1592  	const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);
    1593  
    1594  DESCRIPTION
    1595  	Return a pointer to the transfer vector for the object target
    1596  	named @var{target_name}.  If @var{target_name} is <<NULL>>,
    1597  	choose the one in the environment variable <<GNUTARGET>>; if
    1598  	that is null or not defined, then choose the first entry in the
    1599  	target list.  Passing in the string "default" or setting the
    1600  	environment variable to "default" will cause the first entry in
    1601  	the target list to be returned, and "target_defaulted" will be
    1602  	set in the BFD if @var{abfd} isn't <<NULL>>.  This causes
    1603  	<<bfd_check_format>> to loop over all the targets to find the
    1604  	one that matches the file being read.
    1605  */
    1606  
    1607  const bfd_target *
    1608  bfd_find_target (const char *target_name, bfd *abfd)
    1609  {
    1610    const char *targname;
    1611    const bfd_target *target;
    1612  
    1613    if (target_name != NULL)
    1614      targname = target_name;
    1615    else
    1616      targname = getenv ("GNUTARGET");
    1617  
    1618    /* This is safe; the vector cannot be null.  */
    1619    if (targname == NULL || strcmp (targname, "default") == 0)
    1620      {
    1621        if (bfd_default_vector[0] != NULL)
    1622  	target = bfd_default_vector[0];
    1623        else
    1624  	target = bfd_target_vector[0];
    1625        if (abfd)
    1626  	{
    1627  	  abfd->xvec = target;
    1628  	  abfd->target_defaulted = true;
    1629  	}
    1630        return target;
    1631      }
    1632  
    1633    if (abfd)
    1634      abfd->target_defaulted = false;
    1635  
    1636    target = find_target (targname);
    1637    if (target == NULL)
    1638      return NULL;
    1639  
    1640    if (abfd)
    1641      abfd->xvec = target;
    1642    return target;
    1643  }
    1644  
    1645  /* Helper function for bfd_get_target_info to determine the target's
    1646     architecture.  This method handles bfd internal target names as
    1647     tuples and triplets.  */
    1648  static bool
    1649  _bfd_find_arch_match (const char *tname, const char **arch,
    1650  		      const char **def_target_arch)
    1651  {
    1652    if (!arch)
    1653      return false;
    1654  
    1655    while (*arch != NULL)
    1656      {
    1657        const char *in_a = strstr (*arch, tname);
    1658        char end_ch = (in_a ? in_a[strlen (tname)] : 0);
    1659  
    1660        if (in_a && (in_a == *arch || in_a[-1] == ':')
    1661  	  && end_ch == 0)
    1662  	{
    1663  	  *def_target_arch = *arch;
    1664  	  return true;
    1665  	}
    1666        arch++;
    1667      }
    1668    return false;
    1669  }
    1670  
    1671  /*
    1672  FUNCTION
    1673  	bfd_get_target_info
    1674  SYNOPSIS
    1675  	const bfd_target *bfd_get_target_info (const char *target_name,
    1676  					       bfd *abfd,
    1677  					       bool *is_bigendian,
    1678  					       int *underscoring,
    1679  					       const char **def_target_arch);
    1680  DESCRIPTION
    1681  	Return a pointer to the transfer vector for the object target
    1682  	named @var{target_name}.  If @var{target_name} is <<NULL>>,
    1683  	choose the one in the environment variable <<GNUTARGET>>; if
    1684  	that is null or not defined, then choose the first entry in the
    1685  	target list.  Passing in the string "default" or setting the
    1686  	environment variable to "default" will cause the first entry in
    1687  	the target list to be returned, and "target_defaulted" will be
    1688  	set in the BFD if @var{abfd} isn't <<NULL>>.  This causes
    1689  	<<bfd_check_format>> to loop over all the targets to find the
    1690  	one that matches the file being read.
    1691  	If @var{is_bigendian} is not <<NULL>>, then set this value to target's
    1692  	endian mode. True for big-endian, FALSE for little-endian or for
    1693  	invalid target.
    1694  	If @var{underscoring} is not <<NULL>>, then set this value to target's
    1695  	underscoring mode. Zero for none-underscoring, -1 for invalid target,
    1696  	else the value of target vector's symbol underscoring.
    1697  	If @var{def_target_arch} is not <<NULL>>, then set it to the architecture
    1698  	string specified by the target_name.
    1699  */
    1700  const bfd_target *
    1701  bfd_get_target_info (const char *target_name, bfd *abfd,
    1702  		     bool *is_bigendian,
    1703  		     int *underscoring, const char **def_target_arch)
    1704  {
    1705    const bfd_target *target_vec;
    1706  
    1707    if (is_bigendian)
    1708      *is_bigendian = false;
    1709    if (underscoring)
    1710      *underscoring = -1;
    1711    if (def_target_arch)
    1712      *def_target_arch = NULL;
    1713    target_vec = bfd_find_target (target_name, abfd);
    1714    if (! target_vec)
    1715      return NULL;
    1716    if (is_bigendian)
    1717      *is_bigendian = target_vec->byteorder == BFD_ENDIAN_BIG;
    1718    if (underscoring)
    1719      *underscoring = ((int) target_vec->symbol_leading_char) & 0xff;
    1720  
    1721    if (def_target_arch)
    1722      {
    1723        const char *tname = target_vec->name;
    1724        const char **arches = bfd_arch_list ();
    1725  
    1726        if (arches && tname)
    1727  	{
    1728  	  char *hyp = strchr (tname, '-');
    1729  
    1730  	  if (hyp != NULL)
    1731  	    {
    1732  	      tname = ++hyp;
    1733  
    1734  	      /* Make sure we detect architecture names
    1735  		 for triplets like "pe-arm-wince-little".  */
    1736  	      if (!_bfd_find_arch_match (tname, arches, def_target_arch))
    1737  		{
    1738  		  char new_tname[50];
    1739  
    1740  		  strcpy (new_tname, hyp);
    1741  		  while ((hyp = strrchr (new_tname, '-')) != NULL)
    1742  		    {
    1743  		      *hyp = 0;
    1744  		      if (_bfd_find_arch_match (new_tname, arches,
    1745  						def_target_arch))
    1746  			break;
    1747  		    }
    1748  		}
    1749  	    }
    1750  	  else
    1751  	    _bfd_find_arch_match (tname, arches, def_target_arch);
    1752  	}
    1753  
    1754        free (arches);
    1755      }
    1756    return target_vec;
    1757  }
    1758  
    1759  /*
    1760  FUNCTION
    1761  	bfd_target_list
    1762  
    1763  SYNOPSIS
    1764  	const char ** bfd_target_list (void);
    1765  
    1766  DESCRIPTION
    1767  	Return a freshly malloced NULL-terminated
    1768  	vector of the names of all the valid BFD targets. Do not
    1769  	modify the names.
    1770  
    1771  */
    1772  
    1773  const char **
    1774  bfd_target_list (void)
    1775  {
    1776    int vec_length = 0;
    1777    size_t amt;
    1778    const bfd_target * const *target;
    1779    const  char **name_list, **name_ptr;
    1780  
    1781    for (target = &bfd_target_vector[0]; *target != NULL; target++)
    1782      vec_length++;
    1783  
    1784    amt = (vec_length + 1) * sizeof (char **);
    1785    name_ptr = name_list = (const  char **) bfd_malloc (amt);
    1786  
    1787    if (name_list == NULL)
    1788      return NULL;
    1789  
    1790    for (target = &bfd_target_vector[0]; *target != NULL; target++)
    1791      if (target == &bfd_target_vector[0]
    1792  	|| *target != bfd_target_vector[0])
    1793        *name_ptr++ = (*target)->name;
    1794  
    1795    *name_ptr = NULL;
    1796    return name_list;
    1797  }
    1798  
    1799  /*
    1800  FUNCTION
    1801  	bfd_iterate_over_targets
    1802  
    1803  SYNOPSIS
    1804  	const bfd_target *bfd_iterate_over_targets
    1805  	  (int (*func) (const bfd_target *, void *),
    1806  	   void *data);
    1807  
    1808  DESCRIPTION
    1809  	Call @var{func} for each target in the list of BFD target
    1810  	vectors, passing @var{data} to @var{func}.  Stop iterating if
    1811  	@var{func} returns a non-zero result, and return that target
    1812  	vector.  Return NULL if @var{func} always returns zero.
    1813  */
    1814  
    1815  const bfd_target *
    1816  bfd_iterate_over_targets (int (*func) (const bfd_target *, void *),
    1817  			  void *data)
    1818  {
    1819    const bfd_target *const *target;
    1820  
    1821    for (target = bfd_target_vector; *target != NULL; ++target)
    1822      if (func (*target, data))
    1823        return *target;
    1824  
    1825    return NULL;
    1826  }
    1827  
    1828  /*
    1829  FUNCTION
    1830  	bfd_flavour_name
    1831  
    1832  SYNOPSIS
    1833  	const char *bfd_flavour_name (enum bfd_flavour flavour);
    1834  
    1835  DESCRIPTION
    1836  	Return the string form of @var{flavour}.
    1837  */
    1838  
    1839  const char *
    1840  bfd_flavour_name (enum bfd_flavour flavour)
    1841  {
    1842    switch (flavour)
    1843      {
    1844      case bfd_target_unknown_flavour: return "unknown file format";
    1845      case bfd_target_aout_flavour: return "a.out";
    1846      case bfd_target_coff_flavour: return "COFF";
    1847      case bfd_target_ecoff_flavour: return "ECOFF";
    1848      case bfd_target_xcoff_flavour: return "XCOFF";
    1849      case bfd_target_elf_flavour: return "ELF";
    1850      case bfd_target_tekhex_flavour: return "Tekhex";
    1851      case bfd_target_srec_flavour: return "Srec";
    1852      case bfd_target_verilog_flavour: return "Verilog";
    1853      case bfd_target_ihex_flavour: return "Ihex";
    1854      case bfd_target_som_flavour: return "SOM";
    1855      case bfd_target_msdos_flavour: return "MSDOS";
    1856      case bfd_target_evax_flavour: return "Evax";
    1857      case bfd_target_mmo_flavour: return "mmo";
    1858      case bfd_target_mach_o_flavour: return "MACH_O";
    1859      case bfd_target_pef_flavour: return "PEF";
    1860      case bfd_target_pef_xlib_flavour: return "PEF_XLIB";
    1861      case bfd_target_sym_flavour: return "SYM";
    1862      /* There is no "default" case here so that -Wswitch (part of -Wall)
    1863         catches missing entries.  */
    1864      }
    1865  
    1866    abort ();
    1867  }