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