Annotation of src/external/gpl3/binutils.old/dist/bfd/targets.c, Revision 1.1.1.2
1.1 christos 1: /* Generic target-file-type support for the BFD library.
1.1.1.2 ! christos 2: Copyright (C) 1990-2015 Free Software Foundation, Inc.
1.1 christos 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 <<bfd_openr>>, 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 <<bfd_find_target>> with the
53: target string supplied to <<bfd_openr>> and the new BFD pointer.
54:
55: o If a null target string was provided to <<bfd_find_target>>,
56: look up the environment variable <<GNUTARGET>> and use
57: that as the target string.
58:
59: o If the target string is still <<NULL>>, or the target string is
60: <<default>>, then use the first item in the target vector
61: as the target type, and set <<target_defaulted>> in the BFD to
62: cause <<bfd_check_format>> 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 <<bfd_error_invalid_target>> to
70: <<bfd_openr>>.
71:
72: o <<bfd_openr>> attempts to open the file using
73: <<bfd_open_file>>, 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: <<bfd_check_format>> on the BFD with a suggested format.
78: If <<target_defaulted>> has been set, each possible target
79: type is tried to see if it recognizes the specified format.
80: <<bfd_check_format>> returns <<TRUE>> 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 <<xvec>>
100: member.
101:
102: The macros below are used to dispatch to functions through the
103: <<bfd_target>> 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: <<xvec>> member of the struct <<bfd>> 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: .{
1.1.1.2 ! christos 147: . {* N.B. Update bfd_flavour_name if you change this. *}
1.1 christos 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 <<BFD_NO_FLAGS>>, <<HAS_RELOC>>, ...<<D_PAGED>>. *}
199: . flagword object_flags;
200: .
201: . {* A mask of all the flags which a section may have set - from
202: . the set <<SEC_NO_FLAGS>>, <<SEC_ALLOC>>, ...<<SET_NEVER_LOAD>>. *}
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 <<bfd_target *>> 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 <<bfd_close>>. *}
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, \
1.1.1.2 ! christos 367: . NAME##_get_symbol_version_string, \
1.1 christos 368: . NAME##_bfd_is_local_label_name, \
369: . NAME##_bfd_is_target_special_symbol, \
370: . NAME##_get_lineno, \
371: . NAME##_find_nearest_line, \
1.1.1.2 ! christos 372: . NAME##_find_line, \
1.1 christos 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))
1.1.1.2 ! christos 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))
1.1 christos 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)
1.1.1.2 ! christos 396: . (bfd *, struct bfd_symbol **, struct bfd_section *, bfd_vma,
1.1 christos 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: .
1.1.1.2 ! christos 482: . {* Copy the symbol type and other attributes for a linker script
! 483: . assignment of one symbol to another. *}
1.1 christos 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. */
1.1.1.2 ! christos 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;
1.1 christos 620: extern const bfd_target cris_aout_vec;
1.1.1.2 ! christos 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;
1.1 christos 683: extern const bfd_target ieee_vec;
1.1.1.2 ! christos 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;
1.1 christos 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;
1.1.1.2 ! christos 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;
1.1 christos 774: extern const bfd_target oasys_vec;
1.1.1.2 ! christos 775: extern const bfd_target or1k_elf32_vec;
1.1 christos 776: extern const bfd_target pdp11_aout_vec;
777: extern const bfd_target pef_vec;
778: extern const bfd_target pef_xlib_vec;
1.1.1.2 ! christos 779: extern const bfd_target pj_elf32_vec;
! 780: extern const bfd_target pj_elf32_le_vec;
1.1 christos 781: extern const bfd_target plugin_vec;
1.1.1.2 ! christos 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 riscv_elf32_vec;
! 797: extern const bfd_target riscv_elf64_vec;
! 798: extern const bfd_target rl78_elf32_vec;
! 799: extern const bfd_target rs6000_xcoff64_vec;
! 800: extern const bfd_target rs6000_xcoff64_aix_vec;
! 801: extern const bfd_target rs6000_xcoff_vec;
! 802: extern const bfd_target rx_elf32_be_vec;
! 803: extern const bfd_target rx_elf32_be_ns_vec;
! 804: extern const bfd_target rx_elf32_le_vec;
! 805: extern const bfd_target s390_elf32_vec;
! 806: extern const bfd_target s390_elf64_vec;
! 807: extern const bfd_target score_elf32_be_vec;
! 808: extern const bfd_target score_elf32_le_vec;
! 809: extern const bfd_target sh64_elf32_vec;
! 810: extern const bfd_target sh64_elf32_le_vec;
! 811: extern const bfd_target sh64_elf32_linux_vec;
! 812: extern const bfd_target sh64_elf32_linux_be_vec;
! 813: extern const bfd_target sh64_elf32_nbsd_vec;
! 814: extern const bfd_target sh64_elf32_nbsd_le_vec;
! 815: extern const bfd_target sh64_elf64_vec;
! 816: extern const bfd_target sh64_elf64_le_vec;
! 817: extern const bfd_target sh64_elf64_linux_vec;
! 818: extern const bfd_target sh64_elf64_linux_be_vec;
! 819: extern const bfd_target sh64_elf64_nbsd_vec;
! 820: extern const bfd_target sh64_elf64_nbsd_le_vec;
! 821: extern const bfd_target sh_coff_vec;
! 822: extern const bfd_target sh_coff_le_vec;
! 823: extern const bfd_target sh_coff_small_vec;
! 824: extern const bfd_target sh_coff_small_le_vec;
! 825: extern const bfd_target sh_elf32_vec;
! 826: extern const bfd_target sh_elf32_le_vec;
! 827: extern const bfd_target sh_elf32_fdpic_be_vec;
! 828: extern const bfd_target sh_elf32_fdpic_le_vec;
! 829: extern const bfd_target sh_elf32_linux_vec;
! 830: extern const bfd_target sh_elf32_linux_be_vec;
! 831: extern const bfd_target sh_elf32_nbsd_vec;
! 832: extern const bfd_target sh_elf32_nbsd_le_vec;
! 833: extern const bfd_target sh_elf32_symbian_le_vec;
! 834: extern const bfd_target sh_elf32_vxworks_vec;
! 835: extern const bfd_target sh_elf32_vxworks_le_vec;
! 836: extern const bfd_target sh_pe_le_vec;
! 837: extern const bfd_target sh_pei_le_vec;
! 838: extern const bfd_target sparc_aout_le_vec;
! 839: extern const bfd_target sparc_aout_linux_vec;
! 840: extern const bfd_target sparc_aout_lynx_vec;
! 841: extern const bfd_target sparc_aout_nbsd_vec;
! 842: extern const bfd_target sparc_aout_sunos_be_vec;
! 843: extern const bfd_target sparc_coff_vec;
! 844: extern const bfd_target sparc_coff_lynx_vec;
! 845: extern const bfd_target sparc_elf32_vec;
! 846: extern const bfd_target sparc_elf32_sol2_vec;
! 847: extern const bfd_target sparc_elf32_vxworks_vec;
! 848: extern const bfd_target sparc_elf64_vec;
! 849: extern const bfd_target sparc_elf64_fbsd_vec;
! 850: extern const bfd_target sparc_elf64_sol2_vec;
! 851: extern const bfd_target sparc_nlm32_vec;
! 852: extern const bfd_target spu_elf32_vec;
1.1 christos 853: extern const bfd_target sym_vec;
854: extern const bfd_target tic30_aout_vec;
855: extern const bfd_target tic30_coff_vec;
856: extern const bfd_target tic4x_coff0_vec;
1.1.1.2 ! christos 857: extern const bfd_target tic4x_coff0_beh_vec;
1.1 christos 858: extern const bfd_target tic4x_coff1_vec;
1.1.1.2 ! christos 859: extern const bfd_target tic4x_coff1_beh_vec;
1.1 christos 860: extern const bfd_target tic4x_coff2_vec;
1.1.1.2 ! christos 861: extern const bfd_target tic4x_coff2_beh_vec;
1.1 christos 862: extern const bfd_target tic54x_coff0_vec;
1.1.1.2 ! christos 863: extern const bfd_target tic54x_coff0_beh_vec;
1.1 christos 864: extern const bfd_target tic54x_coff1_vec;
1.1.1.2 ! christos 865: extern const bfd_target tic54x_coff1_beh_vec;
1.1 christos 866: extern const bfd_target tic54x_coff2_vec;
1.1.1.2 ! christos 867: extern const bfd_target tic54x_coff2_beh_vec;
! 868: extern const bfd_target tic6x_elf32_be_vec;
! 869: extern const bfd_target tic6x_elf32_le_vec;
! 870: extern const bfd_target tic6x_elf32_c6000_be_vec;
! 871: extern const bfd_target tic6x_elf32_c6000_le_vec;
! 872: extern const bfd_target tic6x_elf32_linux_be_vec;
! 873: extern const bfd_target tic6x_elf32_linux_le_vec;
! 874: extern const bfd_target tic80_coff_vec;
! 875: extern const bfd_target tilegx_elf32_be_vec;
! 876: extern const bfd_target tilegx_elf32_le_vec;
! 877: extern const bfd_target tilegx_elf64_be_vec;
! 878: extern const bfd_target tilegx_elf64_le_vec;
! 879: extern const bfd_target tilepro_elf32_vec;
! 880: extern const bfd_target v800_elf32_vec;
! 881: extern const bfd_target v850_elf32_vec;
! 882: extern const bfd_target ft32_elf32_vec;
! 883: extern const bfd_target vax_aout_1knbsd_vec;
! 884: extern const bfd_target vax_aout_bsd_vec;
! 885: extern const bfd_target vax_aout_nbsd_vec;
! 886: extern const bfd_target vax_elf32_vec;
! 887: extern const bfd_target visium_elf32_vec;
! 888: extern const bfd_target w65_coff_vec;
! 889: extern const bfd_target we32k_coff_vec;
! 890: extern const bfd_target x86_64_coff_vec;
! 891: extern const bfd_target x86_64_elf32_vec;
! 892: extern const bfd_target x86_64_elf32_nacl_vec;
! 893: extern const bfd_target x86_64_elf64_vec;
! 894: extern const bfd_target x86_64_elf64_cloudabi_vec;
! 895: extern const bfd_target x86_64_elf64_fbsd_vec;
! 896: extern const bfd_target x86_64_elf64_nacl_vec;
! 897: extern const bfd_target x86_64_elf64_sol2_vec;
! 898: extern const bfd_target x86_64_mach_o_vec;
! 899: extern const bfd_target x86_64_pe_vec;
! 900: extern const bfd_target x86_64_pe_be_vec;
! 901: extern const bfd_target x86_64_pei_vec;
! 902: extern const bfd_target xc16x_elf32_vec;
! 903: extern const bfd_target xgate_elf32_vec;
! 904: extern const bfd_target xstormy16_elf32_vec;
! 905: extern const bfd_target xtensa_elf32_be_vec;
! 906: extern const bfd_target xtensa_elf32_le_vec;
! 907: extern const bfd_target z80_coff_vec;
! 908: extern const bfd_target z8k_coff_vec;
1.1 christos 909:
910: /* These are always included. */
911: extern const bfd_target srec_vec;
912: extern const bfd_target symbolsrec_vec;
1.1.1.2 ! christos 913: extern const bfd_target verilog_vec;
1.1 christos 914: extern const bfd_target tekhex_vec;
915: extern const bfd_target binary_vec;
916: extern const bfd_target ihex_vec;
917:
918: /* All of the xvecs for core files. */
1.1.1.2 ! christos 919: extern const bfd_target core_aix386_vec;
! 920: extern const bfd_target core_cisco_be_vec;
! 921: extern const bfd_target core_cisco_le_vec;
! 922: extern const bfd_target core_hppabsd_vec;
! 923: extern const bfd_target core_hpux_vec;
! 924: extern const bfd_target core_irix_vec;
! 925: extern const bfd_target core_netbsd_vec;
! 926: extern const bfd_target core_osf_vec;
! 927: extern const bfd_target core_ptrace_vec;
! 928: extern const bfd_target core_sco5_vec;
! 929: extern const bfd_target core_trad_vec;
1.1 christos 930:
931: static const bfd_target * const _bfd_target_vector[] =
932: {
933: #ifdef SELECT_VECS
934:
935: SELECT_VECS,
936:
937: #else /* not SELECT_VECS */
938:
939: #ifdef DEFAULT_VECTOR
940: &DEFAULT_VECTOR,
941: #endif
942: /* This list is alphabetized to make it easy to compare
943: with other vector lists -- the decls above and
1.1.1.2 ! christos 944: the case statement in configure.ac.
! 945: Try to keep it in order when adding new targets, and
! 946: use a name of the form <cpu>_<format>_<other>_<endian>_vec.
! 947: Note that sorting is done as if _<endian>_vec wasn't present.
1.1 christos 948: Vectors that don't compile on all systems, or aren't finished,
949: should have an entry here with #if 0 around it, to show that
950: it wasn't omitted by mistake. */
951: #ifdef BFD64
1.1.1.2 ! christos 952: &aarch64_elf32_be_vec,
! 953: &aarch64_elf32_le_vec,
! 954: &aarch64_elf64_be_vec,
! 955: &aarch64_elf64_be_cloudabi_vec,
! 956: &aarch64_elf64_le_vec,
! 957: &aarch64_elf64_le_cloudabi_vec,
! 958: #endif
! 959:
! 960: #ifdef BFD64
! 961: &alpha_ecoff_le_vec,
! 962: &alpha_elf64_vec,
! 963: &alpha_elf64_fbsd_vec,
! 964: &alpha_nlm32_vec,
! 965: &alpha_vms_vec,
! 966: #endif
! 967: &alpha_vms_lib_txt_vec,
! 968:
! 969: &am33_elf32_linux_vec,
! 970:
! 971: &aout0_be_vec,
! 972: #ifdef BFD64
! 973: &aout64_vec, /* Only compiled if host has long-long support. */
1.1 christos 974: #endif
975: #if 0
1.1.1.2 ! christos 976: /* Since a.out files lack decent magic numbers, no way to recognize
! 977: which kind of a.out file it is. */
! 978: &aout_vec,
1.1 christos 979: #endif
1.1.1.2 ! christos 980: &aout_adobe_vec,
! 981:
! 982: &arc_elf32_be_vec,
! 983: &arc_elf32_le_vec,
! 984:
1.1 christos 985: #if 0
1.1.1.2 ! christos 986: /* We have no way of distinguishing these from other a.out variants. */
! 987: &arm_aout_be_vec,
! 988: &arm_aout_le_vec,
1.1 christos 989: #endif
1.1.1.2 ! christos 990: &arm_aout_nbsd_vec,
! 991: #if 0
! 992: /* We have no way of distinguishing these from other a.out variants. */
! 993: &arm_aout_riscix_vec,
1.1 christos 994: #endif
1.1.1.2 ! christos 995: &arm_coff_be_vec,
! 996: &arm_coff_le_vec,
! 997: &arm_elf32_be_vec,
! 998: &arm_elf32_le_vec,
! 999: &arm_elf32_symbian_be_vec,
! 1000: &arm_elf32_symbian_le_vec,
! 1001: &arm_elf32_vxworks_be_vec,
! 1002: &arm_elf32_vxworks_le_vec,
! 1003: &arm_pe_be_vec,
! 1004: &arm_pe_le_vec,
! 1005: &arm_pe_epoc_be_vec,
! 1006: &arm_pe_epoc_le_vec,
! 1007: &arm_pe_wince_be_vec,
! 1008: &arm_pe_wince_le_vec,
! 1009: &arm_pei_be_vec,
! 1010: &arm_pei_le_vec,
! 1011: &arm_pei_epoc_be_vec,
! 1012: &arm_pei_epoc_le_vec,
! 1013: &arm_pei_wince_be_vec,
! 1014: &arm_pei_wince_le_vec,
! 1015:
! 1016: &avr_elf32_vec,
! 1017:
! 1018: &bfin_elf32_vec,
! 1019: &bfin_elf32_fdpic_vec,
! 1020:
! 1021: &bout_be_vec,
! 1022: &bout_le_vec,
! 1023:
! 1024: &cr16_elf32_vec,
! 1025: &cr16c_elf32_vec,
! 1026:
! 1027: &cris_aout_vec,
! 1028: &cris_elf32_vec,
! 1029: &cris_elf32_us_vec,
! 1030:
! 1031: &crx_elf32_vec,
! 1032:
! 1033: &d10v_elf32_vec,
! 1034: &d30v_elf32_vec,
! 1035:
! 1036: &dlx_elf32_be_vec,
1.1 christos 1037:
1038: /* This, and other vectors, may not be used in any *.mt configuration.
1039: But that does not mean they are unnecessary. If configured with
1040: --enable-targets=all, objdump or gdb should be able to examine
1041: the file even if we don't recognize the machine type. */
1.1.1.2 ! christos 1042: &elf32_be_vec,
! 1043: &elf32_le_vec,
1.1 christos 1044: #ifdef BFD64
1.1.1.2 ! christos 1045: &elf64_be_vec,
! 1046: &elf64_le_vec,
1.1 christos 1047: #endif
1.1.1.2 ! christos 1048:
! 1049: &epiphany_elf32_vec,
! 1050:
! 1051: &fr30_elf32_vec,
! 1052:
! 1053: &frv_elf32_vec,
! 1054: &frv_elf32_fdpic_vec,
! 1055:
! 1056: &h8300_coff_vec,
! 1057: &h8300_elf32_vec,
! 1058: &h8300_elf32_linux_vec,
! 1059: &h8500_coff_vec,
! 1060:
! 1061: &hppa_elf32_vec,
! 1062: &hppa_elf32_linux_vec,
! 1063: &hppa_elf32_nbsd_vec,
1.1 christos 1064: #ifdef BFD64
1.1.1.2 ! christos 1065: &hppa_elf64_vec,
! 1066: &hppa_elf64_linux_vec,
1.1 christos 1067: #endif
1.1.1.2 ! christos 1068: &hppa_som_vec,
! 1069:
! 1070: &i370_elf32_vec,
! 1071:
! 1072: &i386_aout_vec,
! 1073: &i386_aout_bsd_vec,
1.1 christos 1074: #if 0
1.1.1.2 ! christos 1075: &i386_aout_dynix_vec,
1.1 christos 1076: #endif
1.1.1.2 ! christos 1077: &i386_aout_fbsd_vec,
1.1 christos 1078: #if 0
1079: /* Since a.out files lack decent magic numbers, no way to recognize
1080: which kind of a.out file it is. */
1.1.1.2 ! christos 1081: &i386_aout_linux_vec,
1.1 christos 1082: #endif
1.1.1.2 ! christos 1083: &i386_aout_lynx_vec,
1.1 christos 1084: #if 0
1085: /* No distinguishing features for Mach 3 executables. */
1.1.1.2 ! christos 1086: &i386_aout_mach3_vec,
1.1 christos 1087: #endif
1.1.1.2 ! christos 1088: &i386_aout_nbsd_vec,
! 1089: &i386_aout_os9k_vec,
! 1090: &i386_coff_vec,
! 1091: &i386_coff_go32_vec,
! 1092: &i386_coff_go32stubbed_vec,
! 1093: &i386_coff_lynx_vec,
! 1094: &i386_elf32_vec,
! 1095: &i386_elf32_fbsd_vec,
! 1096: &i386_elf32_nacl_vec,
! 1097: &i386_elf32_sol2_vec,
! 1098: &i386_elf32_vxworks_vec,
! 1099: &i386_mach_o_vec,
! 1100: &i386_msdos_vec,
! 1101: &i386_nlm32_vec,
! 1102: &i386_pe_vec,
! 1103: &i386_pei_vec,
! 1104:
! 1105: &iamcu_elf32_vec,
! 1106:
! 1107: &i860_coff_vec,
! 1108: &i860_elf32_vec,
! 1109: &i860_elf32_le_vec,
! 1110:
! 1111: &i960_elf32_vec,
! 1112:
1.1 christos 1113: #ifdef BFD64
1.1.1.2 ! christos 1114: #if 0
! 1115: &ia64_elf32_be_vec,
! 1116: #endif
! 1117: &ia64_elf32_hpux_be_vec,
! 1118: &ia64_elf64_be_vec,
! 1119: &ia64_elf64_le_vec,
! 1120: &ia64_elf64_hpux_be_vec,
! 1121: &ia64_elf64_vms_vec,
! 1122: &ia64_pei_vec,
! 1123: #endif
! 1124:
! 1125: &icoff_be_vec,
! 1126: &icoff_le_vec,
! 1127:
1.1 christos 1128: &ieee_vec,
1.1.1.2 ! christos 1129:
! 1130: &ip2k_elf32_vec,
! 1131: &iq2000_elf32_vec,
! 1132:
! 1133: #ifdef BFD64
! 1134: &k1om_elf64_vec,
! 1135: &k1om_elf64_fbsd_vec,
! 1136: &l1om_elf64_vec,
! 1137: &l1om_elf64_fbsd_vec,
! 1138: #endif
! 1139:
! 1140: &lm32_elf32_vec,
! 1141:
! 1142: &m32c_elf32_vec,
! 1143:
! 1144: &m32r_elf32_vec,
! 1145: &m32r_elf32_le_vec,
! 1146: &m32r_elf32_linux_vec,
! 1147: &m32r_elf32_linux_le_vec,
! 1148:
! 1149: &m68hc11_elf32_vec,
! 1150: &m68hc12_elf32_vec,
! 1151:
1.1 christos 1152: #if 0
1.1.1.2 ! christos 1153: &m68k_aout_4knbsd_vec,
! 1154: /* Clashes with sparc_aout_sunos_be_vec magic no. */
! 1155: &m68k_aout_hp300bsd_vec,
1.1 christos 1156: #endif
1.1.1.2 ! christos 1157: &m68k_aout_hp300hpux_vec,
1.1 christos 1158: #if 0
1159: /* Since a.out files lack decent magic numbers, no way to recognize
1160: which kind of a.out file it is. */
1.1.1.2 ! christos 1161: &m68k_aout_linux_vec,
! 1162: #endif
! 1163: &m68k_aout_nbsd_vec,
! 1164: &m68k_aout_newsos3_vec,
! 1165: &m68k_coff_vec,
! 1166: #if 0
! 1167: &m68k_coff_apollo_vec,
! 1168: &m68k_coff_aux_vec,
1.1 christos 1169: #endif
1.1.1.2 ! christos 1170: &m68k_coff_sysv_vec,
! 1171: &m68k_coff_un_vec,
! 1172: &m68k_elf32_vec,
! 1173: &m68k_versados_vec,
! 1174:
! 1175: &m88k_aout_mach3_vec,
! 1176: &m88k_aout_obsd_vec,
! 1177: &m88k_coff_bcs_vec,
! 1178: &m88k_elf32_vec,
! 1179:
1.1 christos 1180: &mach_o_be_vec,
1181: &mach_o_le_vec,
1182: &mach_o_fat_vec,
1.1.1.2 ! christos 1183:
! 1184: &mcore_elf32_be_vec,
! 1185: &mcore_elf32_le_vec,
! 1186: &mcore_pe_be_vec,
! 1187: &mcore_pe_le_vec,
! 1188: &mcore_pei_be_vec,
! 1189: &mcore_pei_le_vec,
! 1190:
! 1191: &mep_elf32_vec,
! 1192:
! 1193: &metag_elf32_vec,
! 1194:
! 1195: µblaze_elf32_vec,
! 1196:
! 1197: #if 0
! 1198: /* No one seems to use this. */
! 1199: &mips_aout_be_vec,
! 1200: #endif
! 1201: &mips_aout_le_vec,
! 1202: &mips_ecoff_be_vec,
! 1203: &mips_ecoff_le_vec,
! 1204: &mips_ecoff_bele_vec,
1.1 christos 1205: #ifdef BFD64
1.1.1.2 ! christos 1206: &mips_elf32_be_vec,
! 1207: &mips_elf32_le_vec,
! 1208: &mips_elf32_n_be_vec,
! 1209: &mips_elf32_n_le_vec,
! 1210: &mips_elf32_ntrad_be_vec,
! 1211: &mips_elf32_ntrad_le_vec,
! 1212: &mips_elf32_ntradfbsd_be_vec,
! 1213: &mips_elf32_ntradfbsd_le_vec,
! 1214: &mips_elf32_trad_be_vec,
! 1215: &mips_elf32_trad_le_vec,
! 1216: &mips_elf32_tradfbsd_be_vec,
! 1217: &mips_elf32_tradfbsd_le_vec,
! 1218: &mips_elf32_vxworks_be_vec,
! 1219: &mips_elf32_vxworks_le_vec,
! 1220: &mips_elf64_be_vec,
! 1221: &mips_elf64_le_vec,
! 1222: &mips_elf64_trad_be_vec,
! 1223: &mips_elf64_trad_le_vec,
! 1224: &mips_elf64_tradfbsd_be_vec,
! 1225: &mips_elf64_tradfbsd_le_vec,
1.1 christos 1226: #endif
1.1.1.2 ! christos 1227: &mips_pe_le_vec,
! 1228: &mips_pei_le_vec,
! 1229:
1.1 christos 1230: #ifdef BFD64
1.1.1.2 ! christos 1231: &mmix_elf64_vec,
! 1232: &mmix_mmo_vec,
1.1 christos 1233: #endif
1.1.1.2 ! christos 1234:
! 1235: &mn10200_elf32_vec,
! 1236: &mn10300_elf32_vec,
! 1237:
! 1238: &moxie_elf32_be_vec,
! 1239: &moxie_elf32_le_vec,
! 1240:
! 1241: &msp430_elf32_vec,
! 1242: &msp430_elf32_ti_vec,
! 1243:
! 1244: &mt_elf32_vec,
! 1245:
! 1246: &nds32_elf32_be_vec,
! 1247: &nds32_elf32_le_vec,
! 1248: &nds32_elf32_linux_be_vec,
! 1249: &nds32_elf32_linux_le_vec,
! 1250:
! 1251: &nios2_elf32_be_vec,
! 1252: &nios2_elf32_le_vec,
! 1253:
! 1254: &ns32k_aout_pc532mach_vec,
! 1255: &ns32k_aout_pc532nbsd_vec,
! 1256:
1.1 christos 1257: #if 0
1258: /* We have no oasys tools anymore, so we can't test any of this
1259: anymore. If you want to test the stuff yourself, go ahead...
1260: steve@cygnus.com
1261: Worse, since there is no magic number for archives, there
1262: can be annoying target mis-matches. */
1263: &oasys_vec,
1264: #endif
1265:
1.1.1.2 ! christos 1266: &or1k_elf32_vec,
! 1267:
1.1 christos 1268: &pdp11_aout_vec,
1.1.1.2 ! christos 1269:
1.1 christos 1270: &pef_vec,
1271: &pef_xlib_vec,
1.1.1.2 ! christos 1272:
! 1273: &pj_elf32_vec,
! 1274: &pj_elf32_le_vec,
! 1275:
1.1 christos 1276: #if BFD_SUPPORTS_PLUGINS
1277: &plugin_vec,
1278: #endif
1.1.1.2 ! christos 1279:
! 1280: &powerpc_boot_vec,
! 1281: &powerpc_elf32_vec,
! 1282: &powerpc_elf32_le_vec,
! 1283: &powerpc_elf32_fbsd_vec,
! 1284: &powerpc_elf32_vxworks_vec,
! 1285: #ifdef BFD64
! 1286: &powerpc_elf64_vec,
! 1287: &powerpc_elf64_le_vec,
! 1288: &powerpc_elf64_fbsd_vec,
! 1289: #endif
! 1290: &powerpc_nlm32_vec,
! 1291: &powerpc_pe_vec,
! 1292: &powerpc_pe_le_vec,
! 1293: &powerpc_pei_vec,
! 1294: &powerpc_pei_le_vec,
1.1 christos 1295: #if 0
1296: /* This has the same magic number as RS/6000. */
1.1.1.2 ! christos 1297: &powerpc_xcoff_vec,
1.1 christos 1298: #endif
1.1.1.2 ! christos 1299:
! 1300: &riscv_elf32_vec,
! 1301: &rl78_elf32_vec,
! 1302:
! 1303: #ifdef BFD64
! 1304: &riscv_elf64_vec,
! 1305: &rs6000_xcoff64_vec,
! 1306: &rs6000_xcoff64_aix_vec,
! 1307: #endif
! 1308: &rs6000_xcoff_vec,
! 1309:
! 1310: &rx_elf32_be_vec,
! 1311: &rx_elf32_be_ns_vec,
! 1312: &rx_elf32_le_vec,
! 1313:
! 1314: &s390_elf32_vec,
! 1315: #ifdef BFD64
! 1316: &s390_elf64_vec,
! 1317: #endif
! 1318:
! 1319: #ifdef BFD64
! 1320: &score_elf32_be_vec,
! 1321: &score_elf32_le_vec,
1.1 christos 1322: #endif
1.1.1.2 ! christos 1323:
1.1 christos 1324: #ifdef BFD64
1.1.1.2 ! christos 1325: &sh64_elf32_vec,
! 1326: &sh64_elf32_le_vec,
! 1327: &sh64_elf32_linux_vec,
! 1328: &sh64_elf32_linux_be_vec,
! 1329: &sh64_elf32_nbsd_vec,
! 1330: &sh64_elf32_nbsd_le_vec,
! 1331: &sh64_elf64_vec,
! 1332: &sh64_elf64_le_vec,
! 1333: &sh64_elf64_linux_vec,
! 1334: &sh64_elf64_linux_be_vec,
! 1335: &sh64_elf64_nbsd_vec,
! 1336: &sh64_elf64_nbsd_le_vec,
! 1337: #endif
! 1338: &sh_coff_vec,
! 1339: &sh_coff_le_vec,
! 1340: &sh_coff_small_vec,
! 1341: &sh_coff_small_le_vec,
! 1342: &sh_elf32_vec,
! 1343: &sh_elf32_le_vec,
! 1344: &sh_elf32_fdpic_be_vec,
! 1345: &sh_elf32_fdpic_le_vec,
! 1346: &sh_elf32_linux_vec,
! 1347: &sh_elf32_linux_be_vec,
! 1348: &sh_elf32_nbsd_vec,
! 1349: &sh_elf32_nbsd_le_vec,
! 1350: &sh_elf32_symbian_le_vec,
! 1351: &sh_elf32_vxworks_vec,
! 1352: &sh_elf32_vxworks_le_vec,
! 1353: &sh_pe_le_vec,
! 1354: &sh_pei_le_vec,
! 1355:
! 1356: &sparc_aout_le_vec,
! 1357: &sparc_aout_linux_vec,
! 1358: &sparc_aout_lynx_vec,
! 1359: &sparc_aout_nbsd_vec,
! 1360: &sparc_aout_sunos_be_vec,
! 1361: &sparc_coff_vec,
! 1362: &sparc_coff_lynx_vec,
! 1363: &sparc_elf32_vec,
! 1364: &sparc_elf32_sol2_vec,
! 1365: &sparc_elf32_vxworks_vec,
! 1366: #ifdef BFD64
! 1367: &sparc_elf64_vec,
! 1368: &sparc_elf64_fbsd_vec,
! 1369: &sparc_elf64_sol2_vec,
1.1 christos 1370: #endif
1.1.1.2 ! christos 1371: &sparc_nlm32_vec,
! 1372:
! 1373: &spu_elf32_vec,
! 1374:
1.1 christos 1375: &sym_vec,
1.1.1.2 ! christos 1376:
1.1 christos 1377: &tic30_aout_vec,
1378: &tic30_coff_vec,
1379: &tic54x_coff0_beh_vec,
1380: &tic54x_coff0_vec,
1381: &tic54x_coff1_beh_vec,
1382: &tic54x_coff1_vec,
1383: &tic54x_coff2_beh_vec,
1384: &tic54x_coff2_vec,
1.1.1.2 ! christos 1385: &tic6x_elf32_be_vec,
! 1386: &tic6x_elf32_le_vec,
! 1387: &tic80_coff_vec,
! 1388:
! 1389: &tilegx_elf32_be_vec,
! 1390: &tilegx_elf32_le_vec,
1.1 christos 1391: #ifdef BFD64
1.1.1.2 ! christos 1392: &tilegx_elf64_be_vec,
! 1393: &tilegx_elf64_le_vec,
1.1 christos 1394: #endif
1.1.1.2 ! christos 1395: &tilepro_elf32_vec,
! 1396:
! 1397: &ft32_elf32_vec,
! 1398:
! 1399: &v800_elf32_vec,
! 1400: &v850_elf32_vec,
! 1401:
! 1402: &vax_aout_1knbsd_vec,
! 1403: &vax_aout_bsd_vec,
! 1404: &vax_aout_nbsd_vec,
! 1405: &vax_elf32_vec,
! 1406:
! 1407: &visium_elf32_vec,
! 1408:
! 1409: &w65_coff_vec,
! 1410:
! 1411: &we32k_coff_vec,
! 1412:
! 1413: #ifdef BFD64
! 1414: &x86_64_coff_vec,
! 1415: &x86_64_elf32_vec,
! 1416: &x86_64_elf32_nacl_vec,
! 1417: &x86_64_elf64_vec,
! 1418: &x86_64_elf64_cloudabi_vec,
! 1419: &x86_64_elf64_fbsd_vec,
! 1420: &x86_64_elf64_nacl_vec,
! 1421: &x86_64_elf64_sol2_vec,
! 1422: &x86_64_mach_o_vec,
! 1423: &x86_64_pe_vec,
! 1424: &x86_64_pe_be_vec,
! 1425: &x86_64_pei_vec,
! 1426: #endif
! 1427:
! 1428: &xc16x_elf32_vec,
! 1429:
! 1430: &xgate_elf32_vec,
! 1431:
! 1432: &xstormy16_elf32_vec,
! 1433:
! 1434: &xtensa_elf32_be_vec,
! 1435: &xtensa_elf32_le_vec,
! 1436:
! 1437: &z80_coff_vec,
! 1438:
! 1439: &z8k_coff_vec,
1.1 christos 1440: #endif /* not SELECT_VECS */
1441:
1442: /* Always support S-records, for convenience. */
1443: &srec_vec,
1444: &symbolsrec_vec,
1445: /* And verilog. */
1446: &verilog_vec,
1447: /* And tekhex */
1448: &tekhex_vec,
1449: /* Likewise for binary output. */
1450: &binary_vec,
1451: /* Likewise for ihex. */
1452: &ihex_vec,
1453:
1454: /* Add any required traditional-core-file-handler. */
1455:
1456: #ifdef AIX386_CORE
1.1.1.2 ! christos 1457: &core_aix386_vec,
1.1 christos 1458: #endif
1459: #if 0
1460: /* We don't include cisco_core_*_vec. Although it has a magic number,
1461: the magic number isn't at the beginning of the file, and thus
1462: might spuriously match other kinds of files. */
1.1.1.2 ! christos 1463: &core_cisco_be_vec,
! 1464: &core_cisco_le_vec,
1.1 christos 1465: #endif
1466: #ifdef HPPABSD_CORE
1.1.1.2 ! christos 1467: &core_hppabsd_vec,
1.1 christos 1468: #endif
1469: #ifdef HPUX_CORE
1.1.1.2 ! christos 1470: &core_hpux_vec,
1.1 christos 1471: #endif
1472: #ifdef IRIX_CORE
1.1.1.2 ! christos 1473: &core_irix_vec,
1.1 christos 1474: #endif
1475: #ifdef NETBSD_CORE
1.1.1.2 ! christos 1476: &core_netbsd_vec,
1.1 christos 1477: #endif
1478: #ifdef OSF_CORE
1.1.1.2 ! christos 1479: &core_osf_vec,
1.1 christos 1480: #endif
1481: #ifdef PTRACE_CORE
1.1.1.2 ! christos 1482: &core_ptrace_vec,
1.1 christos 1483: #endif
1484: #ifdef SCO5_CORE
1.1.1.2 ! christos 1485: &core_sco5_vec,
1.1 christos 1486: #endif
1487: #ifdef TRAD_CORE
1.1.1.2 ! christos 1488: &core_trad_vec,
1.1 christos 1489: #endif
1490:
1491: NULL /* end of list marker */
1492: };
1493: const bfd_target * const *bfd_target_vector = _bfd_target_vector;
1494:
1495: /* bfd_default_vector[0] contains either the address of the default vector,
1496: if there is one, or zero if there isn't. */
1497:
1498: const bfd_target *bfd_default_vector[] = {
1499: #ifdef DEFAULT_VECTOR
1500: &DEFAULT_VECTOR,
1501: #endif
1502: NULL
1503: };
1504:
1505: /* bfd_associated_vector[] contains the associated target vectors used
1506: to reduce the ambiguity in bfd_check_format_matches. */
1507:
1508: static const bfd_target *_bfd_associated_vector[] = {
1509: #ifdef ASSOCIATED_VECS
1510: ASSOCIATED_VECS,
1511: #endif
1512: NULL
1513: };
1514: const bfd_target * const *bfd_associated_vector = _bfd_associated_vector;
1515:
1516: /* When there is an ambiguous match, bfd_check_format_matches puts the
1517: names of the matching targets in an array. This variable is the maximum
1518: number of entries that the array could possibly need. */
1519: const size_t _bfd_target_vector_entries = sizeof (_bfd_target_vector)/sizeof (*_bfd_target_vector);
1520:
1521: /* This array maps configuration triplets onto BFD vectors. */
1522:
1523: struct targmatch
1524: {
1525: /* The configuration triplet. */
1526: const char *triplet;
1527: /* The BFD vector. If this is NULL, then the vector is found by
1528: searching forward for the next structure with a non NULL vector
1529: field. */
1530: const bfd_target *vector;
1531: };
1532:
1533: /* targmatch.h is built by Makefile out of config.bfd. */
1534: static const struct targmatch bfd_target_match[] = {
1535: #include "targmatch.h"
1536: { NULL, NULL }
1537: };
1538:
1539: /* Find a target vector, given a name or configuration triplet. */
1540:
1541: static const bfd_target *
1542: find_target (const char *name)
1543: {
1544: const bfd_target * const *target;
1545: const struct targmatch *match;
1546:
1547: for (target = &bfd_target_vector[0]; *target != NULL; target++)
1548: if (strcmp (name, (*target)->name) == 0)
1549: return *target;
1550:
1551: /* If we couldn't match on the exact name, try matching on the
1552: configuration triplet. FIXME: We should run the triplet through
1553: config.sub first, but that is hard. */
1554: for (match = &bfd_target_match[0]; match->triplet != NULL; match++)
1555: {
1556: if (fnmatch (match->triplet, name, 0) == 0)
1557: {
1558: while (match->vector == NULL)
1559: ++match;
1560: return match->vector;
1561: }
1562: }
1563:
1564: bfd_set_error (bfd_error_invalid_target);
1565: return NULL;
1566: }
1567:
1568: /*
1569: FUNCTION
1570: bfd_set_default_target
1571:
1572: SYNOPSIS
1573: bfd_boolean bfd_set_default_target (const char *name);
1574:
1575: DESCRIPTION
1576: Set the default target vector to use when recognizing a BFD.
1577: This takes the name of the target, which may be a BFD target
1578: name or a configuration triplet.
1579: */
1580:
1581: bfd_boolean
1582: bfd_set_default_target (const char *name)
1583: {
1584: const bfd_target *target;
1585:
1586: if (bfd_default_vector[0] != NULL
1587: && strcmp (name, bfd_default_vector[0]->name) == 0)
1588: return TRUE;
1589:
1590: target = find_target (name);
1591: if (target == NULL)
1592: return FALSE;
1593:
1594: bfd_default_vector[0] = target;
1595: return TRUE;
1596: }
1597:
1598: /*
1599: FUNCTION
1600: bfd_find_target
1601:
1602: SYNOPSIS
1603: const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);
1604:
1605: DESCRIPTION
1606: Return a pointer to the transfer vector for the object target
1607: named @var{target_name}. If @var{target_name} is <<NULL>>,
1608: choose the one in the environment variable <<GNUTARGET>>; if
1609: that is null or not defined, then choose the first entry in the
1610: target list. Passing in the string "default" or setting the
1611: environment variable to "default" will cause the first entry in
1612: the target list to be returned, and "target_defaulted" will be
1613: set in the BFD if @var{abfd} isn't <<NULL>>. This causes
1614: <<bfd_check_format>> to loop over all the targets to find the
1615: one that matches the file being read.
1616: */
1617:
1618: const bfd_target *
1619: bfd_find_target (const char *target_name, bfd *abfd)
1620: {
1621: const char *targname;
1622: const bfd_target *target;
1623:
1624: if (target_name != NULL)
1625: targname = target_name;
1626: else
1627: targname = getenv ("GNUTARGET");
1628:
1629: /* This is safe; the vector cannot be null. */
1630: if (targname == NULL || strcmp (targname, "default") == 0)
1631: {
1632: if (bfd_default_vector[0] != NULL)
1633: target = bfd_default_vector[0];
1634: else
1635: target = bfd_target_vector[0];
1636: if (abfd)
1637: {
1638: abfd->xvec = target;
1639: abfd->target_defaulted = TRUE;
1640: }
1641: return target;
1642: }
1643:
1644: if (abfd)
1645: abfd->target_defaulted = FALSE;
1646:
1647: target = find_target (targname);
1648: if (target == NULL)
1649: return NULL;
1650:
1651: if (abfd)
1652: abfd->xvec = target;
1653: return target;
1654: }
1655:
1656: /* Helper function for bfd_get_target_info to determine the target's
1657: architecture. This method handles bfd internal target names as
1658: tuples and triplets. */
1659: static bfd_boolean
1660: _bfd_find_arch_match (const char *tname, const char **arch,
1661: const char **def_target_arch)
1662: {
1663: if (!arch)
1664: return FALSE;
1665:
1666: while (*arch != NULL)
1667: {
1668: const char *in_a = strstr (*arch, tname);
1669: char end_ch = (in_a ? in_a[strlen (tname)] : 0);
1670:
1671: if (in_a && (in_a == *arch || in_a[-1] == ':')
1672: && end_ch == 0)
1673: {
1674: *def_target_arch = *arch;
1675: return TRUE;
1676: }
1677: arch++;
1678: }
1679: return FALSE;
1680: }
1681:
1682: /*
1683: FUNCTION
1684: bfd_get_target_info
1685: SYNOPSIS
1686: const bfd_target *bfd_get_target_info (const char *target_name,
1687: bfd *abfd,
1.1.1.2 ! christos 1688: bfd_boolean *is_bigendian,
1.1 christos 1689: int *underscoring,
1690: const char **def_target_arch);
1691: DESCRIPTION
1692: Return a pointer to the transfer vector for the object target
1693: named @var{target_name}. If @var{target_name} is <<NULL>>,
1694: choose the one in the environment variable <<GNUTARGET>>; if
1695: that is null or not defined, then choose the first entry in the
1696: target list. Passing in the string "default" or setting the
1697: environment variable to "default" will cause the first entry in
1698: the target list to be returned, and "target_defaulted" will be
1699: set in the BFD if @var{abfd} isn't <<NULL>>. This causes
1700: <<bfd_check_format>> to loop over all the targets to find the
1701: one that matches the file being read.
1702: If @var{is_bigendian} is not <<NULL>>, then set this value to target's
1703: endian mode. True for big-endian, FALSE for little-endian or for
1704: invalid target.
1705: If @var{underscoring} is not <<NULL>>, then set this value to target's
1706: underscoring mode. Zero for none-underscoring, -1 for invalid target,
1707: else the value of target vector's symbol underscoring.
1708: If @var{def_target_arch} is not <<NULL>>, then set it to the architecture
1709: string specified by the target_name.
1710: */
1711: const bfd_target *
1712: bfd_get_target_info (const char *target_name, bfd *abfd,
1713: bfd_boolean *is_bigendian,
1714: int *underscoring, const char **def_target_arch)
1715: {
1716: const bfd_target *target_vec;
1717:
1718: if (is_bigendian)
1719: *is_bigendian = FALSE;
1720: if (underscoring)
1721: *underscoring = -1;
1722: if (def_target_arch)
1723: *def_target_arch = NULL;
1724: target_vec = bfd_find_target (target_name, abfd);
1725: if (! target_vec)
1726: return NULL;
1727: if (is_bigendian)
1728: *is_bigendian = ((target_vec->byteorder == BFD_ENDIAN_BIG) ? TRUE
1729: : FALSE);
1730: if (underscoring)
1731: *underscoring = ((int) target_vec->symbol_leading_char) & 0xff;
1732:
1733: if (def_target_arch)
1734: {
1735: const char *tname = target_vec->name;
1736: const char **arches = bfd_arch_list ();
1737:
1738: if (arches && tname)
1739: {
1740: char *hyp = strchr (tname, '-');
1741:
1742: if (hyp != NULL)
1743: {
1744: tname = ++hyp;
1745:
1746: /* Make sure we detect architecture names
1747: for triplets like "pe-arm-wince-little". */
1748: if (!_bfd_find_arch_match (tname, arches, def_target_arch))
1749: {
1750: char new_tname[50];
1751:
1752: strcpy (new_tname, hyp);
1753: while ((hyp = strrchr (new_tname, '-')) != NULL)
1754: {
1755: *hyp = 0;
1756: if (_bfd_find_arch_match (new_tname, arches,
1.1.1.2 ! christos 1757: def_target_arch))
1.1 christos 1758: break;
1759: }
1760: }
1761: }
1762: else
1763: _bfd_find_arch_match (tname, arches, def_target_arch);
1764: }
1765:
1766: if (arches)
1767: free (arches);
1768: }
1769: return target_vec;
1770: }
1771:
1772: /*
1773: FUNCTION
1774: bfd_target_list
1775:
1776: SYNOPSIS
1777: const char ** bfd_target_list (void);
1778:
1779: DESCRIPTION
1780: Return a freshly malloced NULL-terminated
1781: vector of the names of all the valid BFD targets. Do not
1782: modify the names.
1783:
1784: */
1785:
1786: const char **
1787: bfd_target_list (void)
1788: {
1789: int vec_length = 0;
1790: bfd_size_type amt;
1791: const bfd_target * const *target;
1792: const char **name_list, **name_ptr;
1793:
1794: for (target = &bfd_target_vector[0]; *target != NULL; target++)
1795: vec_length++;
1796:
1797: amt = (vec_length + 1) * sizeof (char **);
1798: name_ptr = name_list = (const char **) bfd_malloc (amt);
1799:
1800: if (name_list == NULL)
1801: return NULL;
1802:
1803: for (target = &bfd_target_vector[0]; *target != NULL; target++)
1804: if (target == &bfd_target_vector[0]
1805: || *target != bfd_target_vector[0])
1806: *name_ptr++ = (*target)->name;
1807:
1808: *name_ptr = NULL;
1809: return name_list;
1810: }
1811:
1812: /*
1813: FUNCTION
1814: bfd_seach_for_target
1815:
1816: SYNOPSIS
1817: const bfd_target *bfd_search_for_target
1818: (int (*search_func) (const bfd_target *, void *),
1819: void *);
1820:
1821: DESCRIPTION
1822: Return a pointer to the first transfer vector in the list of
1823: transfer vectors maintained by BFD that produces a non-zero
1824: result when passed to the function @var{search_func}. The
1825: parameter @var{data} is passed, unexamined, to the search
1826: function.
1827: */
1828:
1829: const bfd_target *
1830: bfd_search_for_target (int (*search_func) (const bfd_target *, void *),
1831: void *data)
1832: {
1833: const bfd_target * const *target;
1834:
1835: for (target = bfd_target_vector; *target != NULL; target ++)
1836: if (search_func (*target, data))
1837: return *target;
1838:
1839: return NULL;
1840: }
1.1.1.2 ! christos 1841:
! 1842: /*
! 1843: FUNCTION
! 1844: bfd_flavour_name
! 1845:
! 1846: SYNOPSIS
! 1847: const char *bfd_flavour_name (enum bfd_flavour flavour);
! 1848:
! 1849: DESCRIPTION
! 1850: Return the string form of @var{flavour}.
! 1851: */
! 1852:
! 1853: const char *
! 1854: bfd_flavour_name (enum bfd_flavour flavour)
! 1855: {
! 1856: switch (flavour)
! 1857: {
! 1858: case bfd_target_unknown_flavour: return "unknown file format";
! 1859: case bfd_target_aout_flavour: return "a.out";
! 1860: case bfd_target_coff_flavour: return "COFF";
! 1861: case bfd_target_ecoff_flavour: return "ECOFF";
! 1862: case bfd_target_xcoff_flavour: return "XCOFF";
! 1863: case bfd_target_elf_flavour: return "ELF";
! 1864: case bfd_target_ieee_flavour: return "IEEE";
! 1865: case bfd_target_nlm_flavour: return "NLM";
! 1866: case bfd_target_oasys_flavour: return "Oasys";
! 1867: case bfd_target_tekhex_flavour: return "Tekhex";
! 1868: case bfd_target_srec_flavour: return "Srec";
! 1869: case bfd_target_verilog_flavour: return "Verilog";
! 1870: case bfd_target_ihex_flavour: return "Ihex";
! 1871: case bfd_target_som_flavour: return "SOM";
! 1872: case bfd_target_os9k_flavour: return "OS9K";
! 1873: case bfd_target_versados_flavour: return "Versados";
! 1874: case bfd_target_msdos_flavour: return "MSDOS";
! 1875: case bfd_target_ovax_flavour: return "Ovax";
! 1876: case bfd_target_evax_flavour: return "Evax";
! 1877: case bfd_target_mmo_flavour: return "mmo";
! 1878: case bfd_target_mach_o_flavour: return "MACH_O";
! 1879: case bfd_target_pef_flavour: return "PEF";
! 1880: case bfd_target_pef_xlib_flavour: return "PEF_XLIB";
! 1881: case bfd_target_sym_flavour: return "SYM";
! 1882: /* There is no "default" case here so that -Wswitch (part of -Wall)
! 1883: catches missing entries. */
! 1884: }
! 1885:
! 1886: abort ();
! 1887: }
CVSweb <webmaster@jp.NetBSD.org>