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