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