Subversion Repositories Kolibri OS

Rev

Rev 5197 | Details | Compare with Previous | Last modification | View Log | RSS feed

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