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