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 µblaze_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