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