[BACK]Return to targets.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils.old / dist / bfd

Annotation of src/external/gpl3/binutils.old/dist/bfd/targets.c, Revision 1.1.1.3

1.1       christos    1: /* Generic target-file-type support for the BFD library.
1.1.1.3 ! christos    2:    Copyright (C) 1990-2016 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, \
1.1.1.3 ! christos  455: .  NAME##_bfd_link_check_relocs, \
1.1       christos  456: .  NAME##_bfd_gc_sections, \
                    457: .  NAME##_bfd_lookup_section_flags, \
                    458: .  NAME##_bfd_merge_sections, \
                    459: .  NAME##_bfd_is_group_section, \
                    460: .  NAME##_bfd_discard_group, \
                    461: .  NAME##_section_already_linked, \
                    462: .  NAME##_bfd_define_common_symbol
                    463: .
                    464: .  int         (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *);
                    465: .  bfd_byte *  (*_bfd_get_relocated_section_contents)
                    466: .    (bfd *, struct bfd_link_info *, struct bfd_link_order *,
                    467: .     bfd_byte *, bfd_boolean, struct bfd_symbol **);
                    468: .
                    469: .  bfd_boolean (*_bfd_relax_section)
                    470: .    (bfd *, struct bfd_section *, struct bfd_link_info *, bfd_boolean *);
                    471: .
                    472: .  {* Create a hash table for the linker.  Different backends store
                    473: .     different information in this table.  *}
                    474: .  struct bfd_link_hash_table *
                    475: .              (*_bfd_link_hash_table_create) (bfd *);
                    476: .
                    477: .  {* Add symbols from this object file into the hash table.  *}
                    478: .  bfd_boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *);
                    479: .
                    480: .  {* Indicate that we are only retrieving symbol values from this section.  *}
                    481: .  void        (*_bfd_link_just_syms) (asection *, struct bfd_link_info *);
                    482: .
1.1.1.2   christos  483: .  {* Copy the symbol type and other attributes for a linker script
                    484: .     assignment of one symbol to another.  *}
1.1       christos  485: .#define bfd_copy_link_hash_symbol_type(b, t, f) \
                    486: .  BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f))
                    487: .  void (*_bfd_copy_link_hash_symbol_type)
                    488: .    (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *);
                    489: .
                    490: .  {* Do a link based on the link_order structures attached to each
                    491: .     section of the BFD.  *}
                    492: .  bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *);
                    493: .
                    494: .  {* Should this section be split up into smaller pieces during linking.  *}
                    495: .  bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *);
                    496: .
1.1.1.3 ! christos  497: .  {* Check the relocations in the bfd for validity.  *}
        !           498: .  bfd_boolean (* _bfd_link_check_relocs)(bfd *, struct bfd_link_info *);
        !           499: .
1.1       christos  500: .  {* Remove sections that are not referenced from the output.  *}
                    501: .  bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
                    502: .
                    503: .  {* Sets the bitmask of allowed and disallowed section flags.  *}
                    504: .  bfd_boolean (*_bfd_lookup_section_flags) (struct bfd_link_info *,
                    505: .                                           struct flag_info *,
                    506: .                                           asection *);
                    507: .
                    508: .  {* Attempt to merge SEC_MERGE sections.  *}
                    509: .  bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
                    510: .
                    511: .  {* Is this section a member of a group?  *}
                    512: .  bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
                    513: .
                    514: .  {* Discard members of a group.  *}
                    515: .  bfd_boolean (*_bfd_discard_group) (bfd *, struct bfd_section *);
                    516: .
                    517: .  {* Check if SEC has been already linked during a reloceatable or
                    518: .     final link.  *}
                    519: .  bfd_boolean (*_section_already_linked) (bfd *, asection *,
                    520: .                                         struct bfd_link_info *);
                    521: .
                    522: .  {* Define a common symbol.  *}
                    523: .  bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *,
                    524: .                                           struct bfd_link_hash_entry *);
                    525: .
                    526: .  {* Routines to handle dynamic symbols and relocs.  *}
                    527: .#define BFD_JUMP_TABLE_DYNAMIC(NAME) \
                    528: .  NAME##_get_dynamic_symtab_upper_bound, \
                    529: .  NAME##_canonicalize_dynamic_symtab, \
                    530: .  NAME##_get_synthetic_symtab, \
                    531: .  NAME##_get_dynamic_reloc_upper_bound, \
                    532: .  NAME##_canonicalize_dynamic_reloc
                    533: .
                    534: .  {* Get the amount of memory required to hold the dynamic symbols.  *}
                    535: .  long        (*_bfd_get_dynamic_symtab_upper_bound) (bfd *);
                    536: .  {* Read in the dynamic symbols.  *}
                    537: .  long        (*_bfd_canonicalize_dynamic_symtab)
                    538: .    (bfd *, struct bfd_symbol **);
                    539: .  {* Create synthetized symbols.  *}
                    540: .  long        (*_bfd_get_synthetic_symtab)
                    541: .    (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **,
                    542: .     struct bfd_symbol **);
                    543: .  {* Get the amount of memory required to hold the dynamic relocs.  *}
                    544: .  long        (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
                    545: .  {* Read in the dynamic relocs.  *}
                    546: .  long        (*_bfd_canonicalize_dynamic_reloc)
                    547: .    (bfd *, arelent **, struct bfd_symbol **);
                    548: .
                    549:
                    550: A pointer to an alternative bfd_target in case the current one is not
                    551: satisfactory.  This can happen when the target cpu supports both big
                    552: and little endian code, and target chosen by the linker has the wrong
                    553: endianness.  The function open_output() in ld/ldlang.c uses this field
                    554: to find an alternative output format that is suitable.
                    555:
                    556: .  {* Opposite endian version of this target.  *}
                    557: .  const struct bfd_target * alternative_target;
                    558: .
                    559:
                    560: .  {* Data for use by back-end routines, which isn't
                    561: .     generic enough to belong in this structure.  *}
                    562: .  const void *backend_data;
                    563: .
                    564: .} bfd_target;
                    565: .
                    566: */
                    567:
                    568: /* All known xvecs (even those that don't compile on all systems).
                    569:    Alphabetized for easy reference.
                    570:    They are listed a second time below, since
                    571:    we can't intermix extern's and initializers.  */
1.1.1.2   christos  572: extern const bfd_target aarch64_elf32_be_vec;
                    573: extern const bfd_target aarch64_elf32_le_vec;
                    574: extern const bfd_target aarch64_elf64_be_vec;
                    575: extern const bfd_target aarch64_elf64_be_cloudabi_vec;
                    576: extern const bfd_target aarch64_elf64_le_vec;
                    577: extern const bfd_target aarch64_elf64_le_cloudabi_vec;
1.1.1.3 ! christos  578: extern const bfd_target aarch64_mach_o_vec;
1.1.1.2   christos  579: extern const bfd_target alpha_ecoff_le_vec;
                    580: extern const bfd_target alpha_elf64_vec;
                    581: extern const bfd_target alpha_elf64_fbsd_vec;
                    582: extern const bfd_target alpha_nlm32_vec;
                    583: extern const bfd_target alpha_vms_vec;
                    584: extern const bfd_target alpha_vms_lib_txt_vec;
                    585: extern const bfd_target am33_elf32_linux_vec;
                    586: extern const bfd_target aout0_be_vec;
                    587: extern const bfd_target aout64_vec;
                    588: extern const bfd_target aout_vec;
                    589: extern const bfd_target aout_adobe_vec;
                    590: extern const bfd_target arc_elf32_be_vec;
                    591: extern const bfd_target arc_elf32_le_vec;
                    592: extern const bfd_target arm_aout_be_vec;
                    593: extern const bfd_target arm_aout_le_vec;
                    594: extern const bfd_target arm_aout_nbsd_vec;
                    595: extern const bfd_target arm_aout_riscix_vec;
                    596: extern const bfd_target arm_coff_be_vec;
                    597: extern const bfd_target arm_coff_le_vec;
                    598: extern const bfd_target arm_elf32_be_vec;
                    599: extern const bfd_target arm_elf32_le_vec;
                    600: extern const bfd_target arm_elf32_nacl_be_vec;
                    601: extern const bfd_target arm_elf32_nacl_le_vec;
                    602: extern const bfd_target arm_elf32_symbian_be_vec;
                    603: extern const bfd_target arm_elf32_symbian_le_vec;
                    604: extern const bfd_target arm_elf32_vxworks_be_vec;
                    605: extern const bfd_target arm_elf32_vxworks_le_vec;
1.1.1.3 ! christos  606: extern const bfd_target arm_mach_o_vec;
1.1.1.2   christos  607: extern const bfd_target arm_pe_be_vec;
                    608: extern const bfd_target arm_pe_le_vec;
                    609: extern const bfd_target arm_pe_epoc_be_vec;
                    610: extern const bfd_target arm_pe_epoc_le_vec;
                    611: extern const bfd_target arm_pe_wince_be_vec;
                    612: extern const bfd_target arm_pe_wince_le_vec;
                    613: extern const bfd_target arm_pei_be_vec;
                    614: extern const bfd_target arm_pei_le_vec;
                    615: extern const bfd_target arm_pei_epoc_be_vec;
                    616: extern const bfd_target arm_pei_epoc_le_vec;
                    617: extern const bfd_target arm_pei_wince_be_vec;
                    618: extern const bfd_target arm_pei_wince_le_vec;
                    619: extern const bfd_target avr_elf32_vec;
                    620: extern const bfd_target bfin_elf32_vec;
                    621: extern const bfd_target bfin_elf32_fdpic_vec;
                    622: extern const bfd_target bout_be_vec;
                    623: extern const bfd_target bout_le_vec;
                    624: extern const bfd_target cr16_elf32_vec;
                    625: extern const bfd_target cr16c_elf32_vec;
1.1       christos  626: extern const bfd_target cris_aout_vec;
1.1.1.2   christos  627: extern const bfd_target cris_elf32_vec;
                    628: extern const bfd_target cris_elf32_us_vec;
                    629: extern const bfd_target crx_elf32_vec;
                    630: extern const bfd_target d10v_elf32_vec;
                    631: extern const bfd_target d30v_elf32_vec;
                    632: extern const bfd_target dlx_elf32_be_vec;
                    633: extern const bfd_target elf32_be_vec;
                    634: extern const bfd_target elf32_le_vec;
                    635: extern const bfd_target elf64_be_vec;
                    636: extern const bfd_target elf64_le_vec;
                    637: extern const bfd_target epiphany_elf32_vec;
                    638: extern const bfd_target fr30_elf32_vec;
                    639: extern const bfd_target frv_elf32_vec;
                    640: extern const bfd_target frv_elf32_fdpic_vec;
                    641: extern const bfd_target h8300_coff_vec;
                    642: extern const bfd_target h8300_elf32_vec;
                    643: extern const bfd_target h8300_elf32_linux_vec;
                    644: extern const bfd_target h8500_coff_vec;
                    645: extern const bfd_target hppa_elf32_vec;
                    646: extern const bfd_target hppa_elf32_linux_vec;
                    647: extern const bfd_target hppa_elf32_nbsd_vec;
                    648: extern const bfd_target hppa_elf64_vec;
                    649: extern const bfd_target hppa_elf64_linux_vec;
                    650: extern const bfd_target hppa_som_vec;
                    651: extern const bfd_target i370_elf32_vec;
                    652: extern const bfd_target i386_aout_vec;
                    653: extern const bfd_target i386_aout_bsd_vec;
                    654: extern const bfd_target i386_aout_dynix_vec;
                    655: extern const bfd_target i386_aout_fbsd_vec;
                    656: extern const bfd_target i386_aout_linux_vec;
                    657: extern const bfd_target i386_aout_lynx_vec;
                    658: extern const bfd_target i386_aout_mach3_vec;
                    659: extern const bfd_target i386_aout_nbsd_vec;
                    660: extern const bfd_target i386_aout_os9k_vec;
                    661: extern const bfd_target i386_coff_vec;
                    662: extern const bfd_target i386_coff_go32_vec;
                    663: extern const bfd_target i386_coff_go32stubbed_vec;
                    664: extern const bfd_target i386_coff_lynx_vec;
                    665: extern const bfd_target i386_elf32_vec;
                    666: extern const bfd_target i386_elf32_fbsd_vec;
                    667: extern const bfd_target i386_elf32_nacl_vec;
                    668: extern const bfd_target i386_elf32_sol2_vec;
                    669: extern const bfd_target i386_elf32_vxworks_vec;
                    670: extern const bfd_target i386_mach_o_vec;
                    671: extern const bfd_target i386_msdos_vec;
                    672: extern const bfd_target i386_nlm32_vec;
                    673: extern const bfd_target i386_pe_vec;
                    674: extern const bfd_target i386_pei_vec;
                    675: extern const bfd_target iamcu_elf32_vec;
                    676: extern const bfd_target i860_coff_vec;
                    677: extern const bfd_target i860_elf32_vec;
                    678: extern const bfd_target i860_elf32_le_vec;
                    679: extern const bfd_target i960_elf32_vec;
                    680: extern const bfd_target ia64_elf32_be_vec;
                    681: extern const bfd_target ia64_elf32_hpux_be_vec;
                    682: extern const bfd_target ia64_elf64_be_vec;
                    683: extern const bfd_target ia64_elf64_le_vec;
                    684: extern const bfd_target ia64_elf64_hpux_be_vec;
                    685: extern const bfd_target ia64_elf64_vms_vec;
                    686: extern const bfd_target ia64_pei_vec;
                    687: extern const bfd_target icoff_be_vec;
                    688: extern const bfd_target icoff_le_vec;
1.1       christos  689: extern const bfd_target ieee_vec;
1.1.1.2   christos  690: extern const bfd_target ip2k_elf32_vec;
                    691: extern const bfd_target iq2000_elf32_vec;
                    692: extern const bfd_target k1om_elf64_vec;
                    693: extern const bfd_target k1om_elf64_fbsd_vec;
                    694: extern const bfd_target l1om_elf64_vec;
                    695: extern const bfd_target l1om_elf64_fbsd_vec;
                    696: extern const bfd_target lm32_elf32_vec;
                    697: extern const bfd_target lm32_elf32_fdpic_vec;
                    698: extern const bfd_target m32c_elf32_vec;
                    699: extern const bfd_target m32r_elf32_vec;
                    700: extern const bfd_target m32r_elf32_le_vec;
                    701: extern const bfd_target m32r_elf32_linux_vec;
                    702: extern const bfd_target m32r_elf32_linux_le_vec;
                    703: extern const bfd_target m68hc11_elf32_vec;
                    704: extern const bfd_target m68hc12_elf32_vec;
                    705: extern const bfd_target m68k_aout_4knbsd_vec;
                    706: extern const bfd_target m68k_aout_hp300bsd_vec;
                    707: extern const bfd_target m68k_aout_hp300hpux_vec;
                    708: extern const bfd_target m68k_aout_linux_vec;
                    709: extern const bfd_target m68k_aout_nbsd_vec;
                    710: extern const bfd_target m68k_aout_newsos3_vec;
                    711: extern const bfd_target m68k_coff_vec;
                    712: extern const bfd_target m68k_coff_apollo_vec;
                    713: extern const bfd_target m68k_coff_aux_vec;
                    714: extern const bfd_target m68k_coff_sysv_vec;
                    715: extern const bfd_target m68k_coff_un_vec;
                    716: extern const bfd_target m68k_elf32_vec;
                    717: extern const bfd_target m68k_versados_vec;
                    718: extern const bfd_target m88k_aout_mach3_vec;
                    719: extern const bfd_target m88k_aout_obsd_vec;
                    720: extern const bfd_target m88k_coff_bcs_vec;
                    721: extern const bfd_target m88k_elf32_vec;
1.1       christos  722: extern const bfd_target mach_o_be_vec;
                    723: extern const bfd_target mach_o_le_vec;
                    724: extern const bfd_target mach_o_fat_vec;
1.1.1.2   christos  725: extern const bfd_target mcore_elf32_be_vec;
                    726: extern const bfd_target mcore_elf32_le_vec;
                    727: extern const bfd_target mcore_pe_be_vec;
                    728: extern const bfd_target mcore_pe_le_vec;
                    729: extern const bfd_target mcore_pei_be_vec;
                    730: extern const bfd_target mcore_pei_le_vec;
                    731: extern const bfd_target mep_elf32_vec;
                    732: extern const bfd_target mep_elf32_le_vec;
                    733: extern const bfd_target metag_elf32_vec;
                    734: extern const bfd_target microblaze_elf32_vec;
                    735: extern const bfd_target microblaze_elf32_le_vec;
                    736: extern const bfd_target mips_aout_be_vec;
                    737: extern const bfd_target mips_aout_le_vec;
                    738: extern const bfd_target mips_ecoff_be_vec;
                    739: extern const bfd_target mips_ecoff_le_vec;
                    740: extern const bfd_target mips_ecoff_bele_vec;
                    741: extern const bfd_target mips_elf32_be_vec;
                    742: extern const bfd_target mips_elf32_le_vec;
                    743: extern const bfd_target mips_elf32_n_be_vec;
                    744: extern const bfd_target mips_elf32_n_le_vec;
                    745: extern const bfd_target mips_elf32_ntrad_be_vec;
                    746: extern const bfd_target mips_elf32_ntrad_le_vec;
                    747: extern const bfd_target mips_elf32_ntradfbsd_be_vec;
                    748: extern const bfd_target mips_elf32_ntradfbsd_le_vec;
                    749: extern const bfd_target mips_elf32_trad_be_vec;
                    750: extern const bfd_target mips_elf32_trad_le_vec;
                    751: extern const bfd_target mips_elf32_tradfbsd_be_vec;
                    752: extern const bfd_target mips_elf32_tradfbsd_le_vec;
                    753: extern const bfd_target mips_elf32_vxworks_be_vec;
                    754: extern const bfd_target mips_elf32_vxworks_le_vec;
                    755: extern const bfd_target mips_elf64_be_vec;
                    756: extern const bfd_target mips_elf64_le_vec;
                    757: extern const bfd_target mips_elf64_trad_be_vec;
                    758: extern const bfd_target mips_elf64_trad_le_vec;
                    759: extern const bfd_target mips_elf64_tradfbsd_be_vec;
                    760: extern const bfd_target mips_elf64_tradfbsd_le_vec;
                    761: extern const bfd_target mips_pe_le_vec;
                    762: extern const bfd_target mips_pei_le_vec;
                    763: extern const bfd_target mmix_elf64_vec;
                    764: extern const bfd_target mmix_mmo_vec;
                    765: extern const bfd_target mn10200_elf32_vec;
                    766: extern const bfd_target mn10300_elf32_vec;
                    767: extern const bfd_target moxie_elf32_be_vec;
                    768: extern const bfd_target moxie_elf32_le_vec;
                    769: extern const bfd_target msp430_elf32_vec;
                    770: extern const bfd_target msp430_elf32_ti_vec;
                    771: extern const bfd_target mt_elf32_vec;
                    772: extern const bfd_target nds32_elf32_be_vec;
                    773: extern const bfd_target nds32_elf32_le_vec;
                    774: extern const bfd_target nds32_elf32_linux_be_vec;
                    775: extern const bfd_target nds32_elf32_linux_le_vec;
                    776: extern const bfd_target nios2_elf32_be_vec;
                    777: extern const bfd_target nios2_elf32_le_vec;
                    778: extern const bfd_target ns32k_aout_pc532mach_vec;
                    779: extern const bfd_target ns32k_aout_pc532nbsd_vec;
1.1       christos  780: extern const bfd_target oasys_vec;
1.1.1.2   christos  781: extern const bfd_target or1k_elf32_vec;
1.1       christos  782: extern const bfd_target pdp11_aout_vec;
                    783: extern const bfd_target pef_vec;
                    784: extern const bfd_target pef_xlib_vec;
1.1.1.2   christos  785: extern const bfd_target pj_elf32_vec;
                    786: extern const bfd_target pj_elf32_le_vec;
1.1       christos  787: extern const bfd_target plugin_vec;
1.1.1.2   christos  788: extern const bfd_target powerpc_boot_vec;
                    789: extern const bfd_target powerpc_elf32_vec;
                    790: extern const bfd_target powerpc_elf32_le_vec;
                    791: extern const bfd_target powerpc_elf32_fbsd_vec;
                    792: extern const bfd_target powerpc_elf32_vxworks_vec;
                    793: extern const bfd_target powerpc_elf64_vec;
                    794: extern const bfd_target powerpc_elf64_le_vec;
                    795: extern const bfd_target powerpc_elf64_fbsd_vec;
                    796: extern const bfd_target powerpc_nlm32_vec;
                    797: extern const bfd_target powerpc_pe_vec;
                    798: extern const bfd_target powerpc_pe_le_vec;
                    799: extern const bfd_target powerpc_pei_vec;
                    800: extern const bfd_target powerpc_pei_le_vec;
                    801: extern const bfd_target powerpc_xcoff_vec;
                    802: extern const bfd_target riscv_elf32_vec;
                    803: extern const bfd_target riscv_elf64_vec;
                    804: extern const bfd_target rl78_elf32_vec;
                    805: extern const bfd_target rs6000_xcoff64_vec;
                    806: extern const bfd_target rs6000_xcoff64_aix_vec;
                    807: extern const bfd_target rs6000_xcoff_vec;
                    808: extern const bfd_target rx_elf32_be_vec;
                    809: extern const bfd_target rx_elf32_be_ns_vec;
                    810: extern const bfd_target rx_elf32_le_vec;
                    811: extern const bfd_target s390_elf32_vec;
                    812: extern const bfd_target s390_elf64_vec;
                    813: extern const bfd_target score_elf32_be_vec;
                    814: extern const bfd_target score_elf32_le_vec;
                    815: extern const bfd_target sh64_elf32_vec;
                    816: extern const bfd_target sh64_elf32_le_vec;
                    817: extern const bfd_target sh64_elf32_linux_vec;
                    818: extern const bfd_target sh64_elf32_linux_be_vec;
                    819: extern const bfd_target sh64_elf32_nbsd_vec;
                    820: extern const bfd_target sh64_elf32_nbsd_le_vec;
                    821: extern const bfd_target sh64_elf64_vec;
                    822: extern const bfd_target sh64_elf64_le_vec;
                    823: extern const bfd_target sh64_elf64_linux_vec;
                    824: extern const bfd_target sh64_elf64_linux_be_vec;
                    825: extern const bfd_target sh64_elf64_nbsd_vec;
                    826: extern const bfd_target sh64_elf64_nbsd_le_vec;
                    827: extern const bfd_target sh_coff_vec;
                    828: extern const bfd_target sh_coff_le_vec;
                    829: extern const bfd_target sh_coff_small_vec;
                    830: extern const bfd_target sh_coff_small_le_vec;
                    831: extern const bfd_target sh_elf32_vec;
                    832: extern const bfd_target sh_elf32_le_vec;
                    833: extern const bfd_target sh_elf32_fdpic_be_vec;
                    834: extern const bfd_target sh_elf32_fdpic_le_vec;
                    835: extern const bfd_target sh_elf32_linux_vec;
                    836: extern const bfd_target sh_elf32_linux_be_vec;
                    837: extern const bfd_target sh_elf32_nbsd_vec;
                    838: extern const bfd_target sh_elf32_nbsd_le_vec;
                    839: extern const bfd_target sh_elf32_symbian_le_vec;
                    840: extern const bfd_target sh_elf32_vxworks_vec;
                    841: extern const bfd_target sh_elf32_vxworks_le_vec;
                    842: extern const bfd_target sh_pe_le_vec;
                    843: extern const bfd_target sh_pei_le_vec;
                    844: extern const bfd_target sparc_aout_le_vec;
                    845: extern const bfd_target sparc_aout_linux_vec;
                    846: extern const bfd_target sparc_aout_lynx_vec;
                    847: extern const bfd_target sparc_aout_nbsd_vec;
                    848: extern const bfd_target sparc_aout_sunos_be_vec;
                    849: extern const bfd_target sparc_coff_vec;
                    850: extern const bfd_target sparc_coff_lynx_vec;
                    851: extern const bfd_target sparc_elf32_vec;
                    852: extern const bfd_target sparc_elf32_sol2_vec;
                    853: extern const bfd_target sparc_elf32_vxworks_vec;
                    854: extern const bfd_target sparc_elf64_vec;
                    855: extern const bfd_target sparc_elf64_fbsd_vec;
                    856: extern const bfd_target sparc_elf64_sol2_vec;
                    857: extern const bfd_target sparc_nlm32_vec;
                    858: extern const bfd_target spu_elf32_vec;
1.1       christos  859: extern const bfd_target sym_vec;
                    860: extern const bfd_target tic30_aout_vec;
                    861: extern const bfd_target tic30_coff_vec;
                    862: extern const bfd_target tic4x_coff0_vec;
1.1.1.2   christos  863: extern const bfd_target tic4x_coff0_beh_vec;
1.1       christos  864: extern const bfd_target tic4x_coff1_vec;
1.1.1.2   christos  865: extern const bfd_target tic4x_coff1_beh_vec;
1.1       christos  866: extern const bfd_target tic4x_coff2_vec;
1.1.1.2   christos  867: extern const bfd_target tic4x_coff2_beh_vec;
1.1       christos  868: extern const bfd_target tic54x_coff0_vec;
1.1.1.2   christos  869: extern const bfd_target tic54x_coff0_beh_vec;
1.1       christos  870: extern const bfd_target tic54x_coff1_vec;
1.1.1.2   christos  871: extern const bfd_target tic54x_coff1_beh_vec;
1.1       christos  872: extern const bfd_target tic54x_coff2_vec;
1.1.1.2   christos  873: extern const bfd_target tic54x_coff2_beh_vec;
                    874: extern const bfd_target tic6x_elf32_be_vec;
                    875: extern const bfd_target tic6x_elf32_le_vec;
                    876: extern const bfd_target tic6x_elf32_c6000_be_vec;
                    877: extern const bfd_target tic6x_elf32_c6000_le_vec;
                    878: extern const bfd_target tic6x_elf32_linux_be_vec;
                    879: extern const bfd_target tic6x_elf32_linux_le_vec;
                    880: extern const bfd_target tic80_coff_vec;
                    881: extern const bfd_target tilegx_elf32_be_vec;
                    882: extern const bfd_target tilegx_elf32_le_vec;
                    883: extern const bfd_target tilegx_elf64_be_vec;
                    884: extern const bfd_target tilegx_elf64_le_vec;
                    885: extern const bfd_target tilepro_elf32_vec;
                    886: extern const bfd_target v800_elf32_vec;
                    887: extern const bfd_target v850_elf32_vec;
                    888: extern const bfd_target ft32_elf32_vec;
                    889: extern const bfd_target vax_aout_1knbsd_vec;
                    890: extern const bfd_target vax_aout_bsd_vec;
                    891: extern const bfd_target vax_aout_nbsd_vec;
                    892: extern const bfd_target vax_elf32_vec;
                    893: extern const bfd_target visium_elf32_vec;
                    894: extern const bfd_target w65_coff_vec;
                    895: extern const bfd_target we32k_coff_vec;
                    896: extern const bfd_target x86_64_coff_vec;
                    897: extern const bfd_target x86_64_elf32_vec;
                    898: extern const bfd_target x86_64_elf32_nacl_vec;
                    899: extern const bfd_target x86_64_elf64_vec;
                    900: extern const bfd_target x86_64_elf64_cloudabi_vec;
                    901: extern const bfd_target x86_64_elf64_fbsd_vec;
                    902: extern const bfd_target x86_64_elf64_nacl_vec;
                    903: extern const bfd_target x86_64_elf64_sol2_vec;
                    904: extern const bfd_target x86_64_mach_o_vec;
                    905: extern const bfd_target x86_64_pe_vec;
                    906: extern const bfd_target x86_64_pe_be_vec;
                    907: extern const bfd_target x86_64_pei_vec;
                    908: extern const bfd_target xc16x_elf32_vec;
                    909: extern const bfd_target xgate_elf32_vec;
                    910: extern const bfd_target xstormy16_elf32_vec;
                    911: extern const bfd_target xtensa_elf32_be_vec;
                    912: extern const bfd_target xtensa_elf32_le_vec;
                    913: extern const bfd_target z80_coff_vec;
                    914: extern const bfd_target z8k_coff_vec;
1.1       christos  915:
                    916: /* These are always included.  */
                    917: extern const bfd_target srec_vec;
                    918: extern const bfd_target symbolsrec_vec;
1.1.1.2   christos  919: extern const bfd_target verilog_vec;
1.1       christos  920: extern const bfd_target tekhex_vec;
                    921: extern const bfd_target binary_vec;
                    922: extern const bfd_target ihex_vec;
                    923:
                    924: /* All of the xvecs for core files.  */
1.1.1.2   christos  925: extern const bfd_target core_aix386_vec;
                    926: extern const bfd_target core_cisco_be_vec;
                    927: extern const bfd_target core_cisco_le_vec;
                    928: extern const bfd_target core_hppabsd_vec;
                    929: extern const bfd_target core_hpux_vec;
                    930: extern const bfd_target core_irix_vec;
                    931: extern const bfd_target core_netbsd_vec;
                    932: extern const bfd_target core_osf_vec;
                    933: extern const bfd_target core_ptrace_vec;
                    934: extern const bfd_target core_sco5_vec;
                    935: extern const bfd_target core_trad_vec;
1.1       christos  936:
                    937: static const bfd_target * const _bfd_target_vector[] =
                    938: {
                    939: #ifdef SELECT_VECS
                    940:
                    941:        SELECT_VECS,
                    942:
                    943: #else /* not SELECT_VECS */
                    944:
                    945: #ifdef DEFAULT_VECTOR
                    946:        &DEFAULT_VECTOR,
                    947: #endif
                    948:        /* This list is alphabetized to make it easy to compare
                    949:           with other vector lists -- the decls above and
1.1.1.2   christos  950:           the case statement in configure.ac.
                    951:           Try to keep it in order when adding new targets, and
                    952:           use a name of the form <cpu>_<format>_<other>_<endian>_vec.
                    953:           Note that sorting is done as if _<endian>_vec wasn't present.
1.1       christos  954:           Vectors that don't compile on all systems, or aren't finished,
                    955:           should have an entry here with #if 0 around it, to show that
                    956:           it wasn't omitted by mistake.  */
                    957: #ifdef BFD64
1.1.1.2   christos  958:        &aarch64_elf32_be_vec,
                    959:        &aarch64_elf32_le_vec,
                    960:        &aarch64_elf64_be_vec,
                    961:        &aarch64_elf64_be_cloudabi_vec,
                    962:        &aarch64_elf64_le_vec,
                    963:        &aarch64_elf64_le_cloudabi_vec,
1.1.1.3 ! christos  964:        &aarch64_mach_o_vec,
1.1.1.2   christos  965: #endif
                    966:
                    967: #ifdef BFD64
                    968:        &alpha_ecoff_le_vec,
                    969:        &alpha_elf64_vec,
                    970:        &alpha_elf64_fbsd_vec,
                    971:        &alpha_nlm32_vec,
                    972:        &alpha_vms_vec,
                    973: #endif
                    974:        &alpha_vms_lib_txt_vec,
                    975:
                    976:        &am33_elf32_linux_vec,
                    977:
                    978:        &aout0_be_vec,
                    979: #ifdef BFD64
                    980:        &aout64_vec,    /* Only compiled if host has long-long support.  */
1.1       christos  981: #endif
                    982: #if 0
1.1.1.2   christos  983:        /* Since a.out files lack decent magic numbers, no way to recognize
                    984:           which kind of a.out file it is.  */
                    985:        &aout_vec,
1.1       christos  986: #endif
1.1.1.2   christos  987:        &aout_adobe_vec,
                    988:
                    989:        &arc_elf32_be_vec,
                    990:        &arc_elf32_le_vec,
                    991:
1.1       christos  992: #if 0
1.1.1.2   christos  993:        /* We have no way of distinguishing these from other a.out variants.  */
                    994:        &arm_aout_be_vec,
                    995:        &arm_aout_le_vec,
1.1       christos  996: #endif
1.1.1.2   christos  997:        &arm_aout_nbsd_vec,
                    998: #if 0
                    999:        /* We have no way of distinguishing these from other a.out variants.  */
                   1000:        &arm_aout_riscix_vec,
1.1       christos 1001: #endif
1.1.1.2   christos 1002:        &arm_coff_be_vec,
                   1003:        &arm_coff_le_vec,
                   1004:        &arm_elf32_be_vec,
                   1005:        &arm_elf32_le_vec,
                   1006:        &arm_elf32_symbian_be_vec,
                   1007:        &arm_elf32_symbian_le_vec,
                   1008:        &arm_elf32_vxworks_be_vec,
                   1009:        &arm_elf32_vxworks_le_vec,
1.1.1.3 ! christos 1010:        &arm_mach_o_vec,
1.1.1.2   christos 1011:        &arm_pe_be_vec,
                   1012:        &arm_pe_le_vec,
                   1013:        &arm_pe_epoc_be_vec,
                   1014:        &arm_pe_epoc_le_vec,
                   1015:        &arm_pe_wince_be_vec,
                   1016:        &arm_pe_wince_le_vec,
                   1017:        &arm_pei_be_vec,
                   1018:        &arm_pei_le_vec,
                   1019:        &arm_pei_epoc_be_vec,
                   1020:        &arm_pei_epoc_le_vec,
                   1021:        &arm_pei_wince_be_vec,
                   1022:        &arm_pei_wince_le_vec,
                   1023:
                   1024:        &avr_elf32_vec,
                   1025:
                   1026:        &bfin_elf32_vec,
                   1027:        &bfin_elf32_fdpic_vec,
                   1028:
                   1029:        &bout_be_vec,
                   1030:        &bout_le_vec,
                   1031:
                   1032:        &cr16_elf32_vec,
                   1033:        &cr16c_elf32_vec,
                   1034:
                   1035:        &cris_aout_vec,
                   1036:        &cris_elf32_vec,
                   1037:        &cris_elf32_us_vec,
                   1038:
                   1039:        &crx_elf32_vec,
                   1040:
                   1041:        &d10v_elf32_vec,
                   1042:        &d30v_elf32_vec,
                   1043:
                   1044:        &dlx_elf32_be_vec,
1.1       christos 1045:
                   1046:        /* This, and other vectors, may not be used in any *.mt configuration.
                   1047:           But that does not mean they are unnecessary.  If configured with
                   1048:           --enable-targets=all, objdump or gdb should be able to examine
                   1049:           the file even if we don't recognize the machine type.  */
1.1.1.2   christos 1050:        &elf32_be_vec,
                   1051:        &elf32_le_vec,
1.1       christos 1052: #ifdef BFD64
1.1.1.2   christos 1053:        &elf64_be_vec,
                   1054:        &elf64_le_vec,
1.1       christos 1055: #endif
1.1.1.2   christos 1056:
                   1057:        &epiphany_elf32_vec,
                   1058:
                   1059:        &fr30_elf32_vec,
                   1060:
                   1061:        &frv_elf32_vec,
                   1062:        &frv_elf32_fdpic_vec,
                   1063:
                   1064:        &h8300_coff_vec,
                   1065:        &h8300_elf32_vec,
                   1066:        &h8300_elf32_linux_vec,
                   1067:        &h8500_coff_vec,
                   1068:
                   1069:        &hppa_elf32_vec,
                   1070:        &hppa_elf32_linux_vec,
                   1071:        &hppa_elf32_nbsd_vec,
1.1       christos 1072: #ifdef BFD64
1.1.1.2   christos 1073:        &hppa_elf64_vec,
                   1074:        &hppa_elf64_linux_vec,
1.1       christos 1075: #endif
1.1.1.2   christos 1076:        &hppa_som_vec,
                   1077:
                   1078:        &i370_elf32_vec,
                   1079:
                   1080:        &i386_aout_vec,
                   1081:        &i386_aout_bsd_vec,
1.1       christos 1082: #if 0
1.1.1.2   christos 1083:        &i386_aout_dynix_vec,
1.1       christos 1084: #endif
1.1.1.2   christos 1085:        &i386_aout_fbsd_vec,
1.1       christos 1086: #if 0
                   1087:        /* Since a.out files lack decent magic numbers, no way to recognize
                   1088:           which kind of a.out file it is.  */
1.1.1.2   christos 1089:        &i386_aout_linux_vec,
1.1       christos 1090: #endif
1.1.1.2   christos 1091:        &i386_aout_lynx_vec,
1.1       christos 1092: #if 0
                   1093:        /* No distinguishing features for Mach 3 executables.  */
1.1.1.2   christos 1094:        &i386_aout_mach3_vec,
1.1       christos 1095: #endif
1.1.1.2   christos 1096:        &i386_aout_nbsd_vec,
                   1097:        &i386_aout_os9k_vec,
                   1098:        &i386_coff_vec,
                   1099:        &i386_coff_go32_vec,
                   1100:        &i386_coff_go32stubbed_vec,
                   1101:        &i386_coff_lynx_vec,
                   1102:        &i386_elf32_vec,
                   1103:        &i386_elf32_fbsd_vec,
                   1104:        &i386_elf32_nacl_vec,
                   1105:        &i386_elf32_sol2_vec,
                   1106:        &i386_elf32_vxworks_vec,
                   1107:        &i386_mach_o_vec,
                   1108:        &i386_msdos_vec,
                   1109:        &i386_nlm32_vec,
                   1110:        &i386_pe_vec,
                   1111:        &i386_pei_vec,
                   1112:
                   1113:        &iamcu_elf32_vec,
                   1114:
                   1115:        &i860_coff_vec,
                   1116:        &i860_elf32_vec,
                   1117:        &i860_elf32_le_vec,
                   1118:
                   1119:        &i960_elf32_vec,
                   1120:
1.1       christos 1121: #ifdef BFD64
1.1.1.2   christos 1122: #if 0
                   1123:        &ia64_elf32_be_vec,
                   1124: #endif
                   1125:        &ia64_elf32_hpux_be_vec,
                   1126:        &ia64_elf64_be_vec,
                   1127:        &ia64_elf64_le_vec,
                   1128:        &ia64_elf64_hpux_be_vec,
                   1129:        &ia64_elf64_vms_vec,
                   1130:        &ia64_pei_vec,
                   1131: #endif
                   1132:
                   1133:        &icoff_be_vec,
                   1134:        &icoff_le_vec,
                   1135:
1.1       christos 1136:        &ieee_vec,
1.1.1.2   christos 1137:
                   1138:        &ip2k_elf32_vec,
                   1139:        &iq2000_elf32_vec,
                   1140:
                   1141: #ifdef BFD64
                   1142:        &k1om_elf64_vec,
                   1143:        &k1om_elf64_fbsd_vec,
                   1144:        &l1om_elf64_vec,
                   1145:        &l1om_elf64_fbsd_vec,
                   1146: #endif
                   1147:
                   1148:        &lm32_elf32_vec,
                   1149:
                   1150:        &m32c_elf32_vec,
                   1151:
                   1152:        &m32r_elf32_vec,
                   1153:        &m32r_elf32_le_vec,
                   1154:        &m32r_elf32_linux_vec,
                   1155:        &m32r_elf32_linux_le_vec,
                   1156:
                   1157:        &m68hc11_elf32_vec,
                   1158:        &m68hc12_elf32_vec,
                   1159:
1.1       christos 1160: #if 0
1.1.1.2   christos 1161:        &m68k_aout_4knbsd_vec,
                   1162:        /* Clashes with sparc_aout_sunos_be_vec magic no.  */
                   1163:        &m68k_aout_hp300bsd_vec,
1.1       christos 1164: #endif
1.1.1.2   christos 1165:        &m68k_aout_hp300hpux_vec,
1.1       christos 1166: #if 0
                   1167:        /* Since a.out files lack decent magic numbers, no way to recognize
                   1168:           which kind of a.out file it is.  */
1.1.1.2   christos 1169:        &m68k_aout_linux_vec,
                   1170: #endif
                   1171:        &m68k_aout_nbsd_vec,
                   1172:        &m68k_aout_newsos3_vec,
                   1173:        &m68k_coff_vec,
                   1174: #if 0
                   1175:        &m68k_coff_apollo_vec,
                   1176:        &m68k_coff_aux_vec,
1.1       christos 1177: #endif
1.1.1.2   christos 1178:        &m68k_coff_sysv_vec,
                   1179:        &m68k_coff_un_vec,
                   1180:        &m68k_elf32_vec,
                   1181:        &m68k_versados_vec,
                   1182:
                   1183:        &m88k_aout_mach3_vec,
                   1184:        &m88k_aout_obsd_vec,
                   1185:        &m88k_coff_bcs_vec,
                   1186:        &m88k_elf32_vec,
                   1187:
1.1       christos 1188:        &mach_o_be_vec,
                   1189:        &mach_o_le_vec,
                   1190:        &mach_o_fat_vec,
1.1.1.2   christos 1191:
                   1192:        &mcore_elf32_be_vec,
                   1193:        &mcore_elf32_le_vec,
                   1194:        &mcore_pe_be_vec,
                   1195:        &mcore_pe_le_vec,
                   1196:        &mcore_pei_be_vec,
                   1197:        &mcore_pei_le_vec,
                   1198:
                   1199:        &mep_elf32_vec,
                   1200:
                   1201:        &metag_elf32_vec,
                   1202:
                   1203:        &microblaze_elf32_vec,
                   1204:
                   1205: #if 0
                   1206:        /* No one seems to use this.  */
                   1207:        &mips_aout_be_vec,
                   1208: #endif
                   1209:        &mips_aout_le_vec,
                   1210:        &mips_ecoff_be_vec,
                   1211:        &mips_ecoff_le_vec,
                   1212:        &mips_ecoff_bele_vec,
1.1       christos 1213: #ifdef BFD64
1.1.1.2   christos 1214:        &mips_elf32_be_vec,
                   1215:        &mips_elf32_le_vec,
                   1216:        &mips_elf32_n_be_vec,
                   1217:        &mips_elf32_n_le_vec,
                   1218:        &mips_elf32_ntrad_be_vec,
                   1219:        &mips_elf32_ntrad_le_vec,
                   1220:        &mips_elf32_ntradfbsd_be_vec,
                   1221:        &mips_elf32_ntradfbsd_le_vec,
                   1222:        &mips_elf32_trad_be_vec,
                   1223:        &mips_elf32_trad_le_vec,
                   1224:        &mips_elf32_tradfbsd_be_vec,
                   1225:        &mips_elf32_tradfbsd_le_vec,
                   1226:        &mips_elf32_vxworks_be_vec,
                   1227:        &mips_elf32_vxworks_le_vec,
                   1228:        &mips_elf64_be_vec,
                   1229:        &mips_elf64_le_vec,
                   1230:        &mips_elf64_trad_be_vec,
                   1231:        &mips_elf64_trad_le_vec,
                   1232:        &mips_elf64_tradfbsd_be_vec,
                   1233:        &mips_elf64_tradfbsd_le_vec,
1.1       christos 1234: #endif
1.1.1.2   christos 1235:        &mips_pe_le_vec,
                   1236:        &mips_pei_le_vec,
                   1237:
1.1       christos 1238: #ifdef BFD64
1.1.1.2   christos 1239:        &mmix_elf64_vec,
                   1240:        &mmix_mmo_vec,
1.1       christos 1241: #endif
1.1.1.2   christos 1242:
                   1243:        &mn10200_elf32_vec,
                   1244:        &mn10300_elf32_vec,
                   1245:
                   1246:        &moxie_elf32_be_vec,
                   1247:        &moxie_elf32_le_vec,
                   1248:
                   1249:        &msp430_elf32_vec,
                   1250:        &msp430_elf32_ti_vec,
                   1251:
                   1252:        &mt_elf32_vec,
                   1253:
                   1254:        &nds32_elf32_be_vec,
                   1255:        &nds32_elf32_le_vec,
                   1256:        &nds32_elf32_linux_be_vec,
                   1257:        &nds32_elf32_linux_le_vec,
                   1258:
                   1259:        &nios2_elf32_be_vec,
                   1260:        &nios2_elf32_le_vec,
                   1261:
                   1262:        &ns32k_aout_pc532mach_vec,
                   1263:        &ns32k_aout_pc532nbsd_vec,
                   1264:
1.1       christos 1265: #if 0
                   1266:        /* We have no oasys tools anymore, so we can't test any of this
                   1267:           anymore. If you want to test the stuff yourself, go ahead...
                   1268:           steve@cygnus.com
                   1269:           Worse, since there is no magic number for archives, there
                   1270:           can be annoying target mis-matches.  */
                   1271:        &oasys_vec,
                   1272: #endif
                   1273:
1.1.1.2   christos 1274:        &or1k_elf32_vec,
                   1275:
1.1       christos 1276:        &pdp11_aout_vec,
1.1.1.2   christos 1277:
1.1       christos 1278:        &pef_vec,
                   1279:        &pef_xlib_vec,
1.1.1.2   christos 1280:
                   1281:        &pj_elf32_vec,
                   1282:        &pj_elf32_le_vec,
                   1283:
1.1       christos 1284: #if BFD_SUPPORTS_PLUGINS
                   1285:        &plugin_vec,
                   1286: #endif
1.1.1.2   christos 1287:
                   1288:        &powerpc_boot_vec,
                   1289:        &powerpc_elf32_vec,
                   1290:        &powerpc_elf32_le_vec,
                   1291:        &powerpc_elf32_fbsd_vec,
                   1292:        &powerpc_elf32_vxworks_vec,
                   1293: #ifdef BFD64
                   1294:        &powerpc_elf64_vec,
                   1295:        &powerpc_elf64_le_vec,
                   1296:        &powerpc_elf64_fbsd_vec,
                   1297: #endif
                   1298:        &powerpc_nlm32_vec,
                   1299:        &powerpc_pe_vec,
                   1300:        &powerpc_pe_le_vec,
                   1301:        &powerpc_pei_vec,
                   1302:        &powerpc_pei_le_vec,
1.1       christos 1303: #if 0
                   1304:        /* This has the same magic number as RS/6000.  */
1.1.1.2   christos 1305:        &powerpc_xcoff_vec,
1.1       christos 1306: #endif
1.1.1.2   christos 1307:
                   1308:        &riscv_elf32_vec,
                   1309:        &rl78_elf32_vec,
                   1310:
                   1311: #ifdef BFD64
                   1312:         &riscv_elf64_vec,
                   1313:        &rs6000_xcoff64_vec,
                   1314:        &rs6000_xcoff64_aix_vec,
                   1315: #endif
                   1316:        &rs6000_xcoff_vec,
                   1317:
                   1318:        &rx_elf32_be_vec,
                   1319:        &rx_elf32_be_ns_vec,
                   1320:        &rx_elf32_le_vec,
                   1321:
                   1322:        &s390_elf32_vec,
                   1323: #ifdef BFD64
                   1324:        &s390_elf64_vec,
                   1325: #endif
                   1326:
                   1327: #ifdef BFD64
                   1328:        &score_elf32_be_vec,
                   1329:        &score_elf32_le_vec,
1.1       christos 1330: #endif
1.1.1.2   christos 1331:
1.1       christos 1332: #ifdef BFD64
1.1.1.2   christos 1333:        &sh64_elf32_vec,
                   1334:        &sh64_elf32_le_vec,
                   1335:        &sh64_elf32_linux_vec,
                   1336:        &sh64_elf32_linux_be_vec,
                   1337:        &sh64_elf32_nbsd_vec,
                   1338:        &sh64_elf32_nbsd_le_vec,
                   1339:        &sh64_elf64_vec,
                   1340:        &sh64_elf64_le_vec,
                   1341:        &sh64_elf64_linux_vec,
                   1342:        &sh64_elf64_linux_be_vec,
                   1343:        &sh64_elf64_nbsd_vec,
                   1344:        &sh64_elf64_nbsd_le_vec,
                   1345: #endif
                   1346:        &sh_coff_vec,
                   1347:        &sh_coff_le_vec,
                   1348:        &sh_coff_small_vec,
                   1349:        &sh_coff_small_le_vec,
                   1350:        &sh_elf32_vec,
                   1351:        &sh_elf32_le_vec,
                   1352:        &sh_elf32_fdpic_be_vec,
                   1353:        &sh_elf32_fdpic_le_vec,
                   1354:        &sh_elf32_linux_vec,
                   1355:        &sh_elf32_linux_be_vec,
                   1356:        &sh_elf32_nbsd_vec,
                   1357:        &sh_elf32_nbsd_le_vec,
                   1358:        &sh_elf32_symbian_le_vec,
                   1359:        &sh_elf32_vxworks_vec,
                   1360:        &sh_elf32_vxworks_le_vec,
                   1361:        &sh_pe_le_vec,
                   1362:        &sh_pei_le_vec,
                   1363:
                   1364:        &sparc_aout_le_vec,
                   1365:        &sparc_aout_linux_vec,
                   1366:        &sparc_aout_lynx_vec,
                   1367:        &sparc_aout_nbsd_vec,
                   1368:        &sparc_aout_sunos_be_vec,
                   1369:        &sparc_coff_vec,
                   1370:        &sparc_coff_lynx_vec,
                   1371:        &sparc_elf32_vec,
                   1372:        &sparc_elf32_sol2_vec,
                   1373:        &sparc_elf32_vxworks_vec,
                   1374: #ifdef BFD64
                   1375:        &sparc_elf64_vec,
                   1376:        &sparc_elf64_fbsd_vec,
                   1377:        &sparc_elf64_sol2_vec,
1.1       christos 1378: #endif
1.1.1.2   christos 1379:        &sparc_nlm32_vec,
                   1380:
                   1381:        &spu_elf32_vec,
                   1382:
1.1       christos 1383:        &sym_vec,
1.1.1.2   christos 1384:
1.1       christos 1385:        &tic30_aout_vec,
                   1386:        &tic30_coff_vec,
                   1387:        &tic54x_coff0_beh_vec,
                   1388:        &tic54x_coff0_vec,
                   1389:        &tic54x_coff1_beh_vec,
                   1390:        &tic54x_coff1_vec,
                   1391:        &tic54x_coff2_beh_vec,
                   1392:        &tic54x_coff2_vec,
1.1.1.2   christos 1393:        &tic6x_elf32_be_vec,
                   1394:        &tic6x_elf32_le_vec,
                   1395:        &tic80_coff_vec,
                   1396:
                   1397:        &tilegx_elf32_be_vec,
                   1398:        &tilegx_elf32_le_vec,
1.1       christos 1399: #ifdef BFD64
1.1.1.2   christos 1400:        &tilegx_elf64_be_vec,
                   1401:        &tilegx_elf64_le_vec,
1.1       christos 1402: #endif
1.1.1.2   christos 1403:        &tilepro_elf32_vec,
                   1404:
                   1405:        &ft32_elf32_vec,
                   1406:
                   1407:        &v800_elf32_vec,
                   1408:        &v850_elf32_vec,
                   1409:
                   1410:        &vax_aout_1knbsd_vec,
                   1411:        &vax_aout_bsd_vec,
                   1412:        &vax_aout_nbsd_vec,
                   1413:        &vax_elf32_vec,
                   1414:
                   1415:        &visium_elf32_vec,
                   1416:
                   1417:        &w65_coff_vec,
                   1418:
                   1419:        &we32k_coff_vec,
                   1420:
                   1421: #ifdef BFD64
                   1422:        &x86_64_coff_vec,
                   1423:        &x86_64_elf32_vec,
                   1424:        &x86_64_elf32_nacl_vec,
                   1425:        &x86_64_elf64_vec,
                   1426:        &x86_64_elf64_cloudabi_vec,
                   1427:        &x86_64_elf64_fbsd_vec,
                   1428:        &x86_64_elf64_nacl_vec,
                   1429:        &x86_64_elf64_sol2_vec,
                   1430:        &x86_64_mach_o_vec,
                   1431:        &x86_64_pe_vec,
                   1432:        &x86_64_pe_be_vec,
                   1433:        &x86_64_pei_vec,
                   1434: #endif
                   1435:
                   1436:        &xc16x_elf32_vec,
                   1437:
                   1438:        &xgate_elf32_vec,
                   1439:
                   1440:        &xstormy16_elf32_vec,
                   1441:
                   1442:        &xtensa_elf32_be_vec,
                   1443:        &xtensa_elf32_le_vec,
                   1444:
                   1445:        &z80_coff_vec,
                   1446:
                   1447:        &z8k_coff_vec,
1.1       christos 1448: #endif /* not SELECT_VECS */
                   1449:
                   1450: /* Always support S-records, for convenience.  */
                   1451:        &srec_vec,
                   1452:        &symbolsrec_vec,
                   1453: /* And verilog.  */
                   1454:        &verilog_vec,
                   1455: /* And tekhex */
                   1456:        &tekhex_vec,
                   1457: /* Likewise for binary output.  */
                   1458:        &binary_vec,
                   1459: /* Likewise for ihex.  */
                   1460:        &ihex_vec,
                   1461:
                   1462: /* Add any required traditional-core-file-handler.  */
                   1463:
                   1464: #ifdef AIX386_CORE
1.1.1.2   christos 1465:        &core_aix386_vec,
1.1       christos 1466: #endif
                   1467: #if 0
                   1468:        /* We don't include cisco_core_*_vec.  Although it has a magic number,
                   1469:           the magic number isn't at the beginning of the file, and thus
                   1470:           might spuriously match other kinds of files.  */
1.1.1.2   christos 1471:        &core_cisco_be_vec,
                   1472:        &core_cisco_le_vec,
1.1       christos 1473: #endif
                   1474: #ifdef HPPABSD_CORE
1.1.1.2   christos 1475:        &core_hppabsd_vec,
1.1       christos 1476: #endif
                   1477: #ifdef HPUX_CORE
1.1.1.2   christos 1478:        &core_hpux_vec,
1.1       christos 1479: #endif
                   1480: #ifdef IRIX_CORE
1.1.1.2   christos 1481:        &core_irix_vec,
1.1       christos 1482: #endif
                   1483: #ifdef NETBSD_CORE
1.1.1.2   christos 1484:        &core_netbsd_vec,
1.1       christos 1485: #endif
                   1486: #ifdef OSF_CORE
1.1.1.2   christos 1487:        &core_osf_vec,
1.1       christos 1488: #endif
                   1489: #ifdef PTRACE_CORE
1.1.1.2   christos 1490:        &core_ptrace_vec,
1.1       christos 1491: #endif
                   1492: #ifdef SCO5_CORE
1.1.1.2   christos 1493:        &core_sco5_vec,
1.1       christos 1494: #endif
                   1495: #ifdef TRAD_CORE
1.1.1.2   christos 1496:        &core_trad_vec,
1.1       christos 1497: #endif
                   1498:
                   1499:        NULL /* end of list marker */
                   1500: };
                   1501: const bfd_target * const *bfd_target_vector = _bfd_target_vector;
                   1502:
                   1503: /* bfd_default_vector[0] contains either the address of the default vector,
                   1504:    if there is one, or zero if there isn't.  */
                   1505:
                   1506: const bfd_target *bfd_default_vector[] = {
                   1507: #ifdef DEFAULT_VECTOR
                   1508:        &DEFAULT_VECTOR,
                   1509: #endif
                   1510:        NULL
                   1511: };
                   1512:
                   1513: /* bfd_associated_vector[] contains the associated target vectors used
                   1514:    to reduce the ambiguity in bfd_check_format_matches.  */
                   1515:
                   1516: static const bfd_target *_bfd_associated_vector[] = {
                   1517: #ifdef ASSOCIATED_VECS
                   1518:        ASSOCIATED_VECS,
                   1519: #endif
                   1520:        NULL
                   1521: };
                   1522: const bfd_target * const *bfd_associated_vector = _bfd_associated_vector;
                   1523:
                   1524: /* When there is an ambiguous match, bfd_check_format_matches puts the
                   1525:    names of the matching targets in an array.  This variable is the maximum
                   1526:    number of entries that the array could possibly need.  */
                   1527: const size_t _bfd_target_vector_entries = sizeof (_bfd_target_vector)/sizeof (*_bfd_target_vector);
                   1528: 
                   1529: /* This array maps configuration triplets onto BFD vectors.  */
                   1530:
                   1531: struct targmatch
                   1532: {
                   1533:   /* The configuration triplet.  */
                   1534:   const char *triplet;
                   1535:   /* The BFD vector.  If this is NULL, then the vector is found by
                   1536:      searching forward for the next structure with a non NULL vector
                   1537:      field.  */
                   1538:   const bfd_target *vector;
                   1539: };
                   1540:
                   1541: /* targmatch.h is built by Makefile out of config.bfd.  */
                   1542: static const struct targmatch bfd_target_match[] = {
                   1543: #include "targmatch.h"
                   1544:   { NULL, NULL }
                   1545: };
                   1546:
                   1547: /* Find a target vector, given a name or configuration triplet.  */
                   1548:
                   1549: static const bfd_target *
                   1550: find_target (const char *name)
                   1551: {
                   1552:   const bfd_target * const *target;
                   1553:   const struct targmatch *match;
                   1554:
                   1555:   for (target = &bfd_target_vector[0]; *target != NULL; target++)
                   1556:     if (strcmp (name, (*target)->name) == 0)
                   1557:       return *target;
                   1558:
                   1559:   /* If we couldn't match on the exact name, try matching on the
                   1560:      configuration triplet.  FIXME: We should run the triplet through
                   1561:      config.sub first, but that is hard.  */
                   1562:   for (match = &bfd_target_match[0]; match->triplet != NULL; match++)
                   1563:     {
                   1564:       if (fnmatch (match->triplet, name, 0) == 0)
                   1565:        {
                   1566:          while (match->vector == NULL)
                   1567:            ++match;
                   1568:          return match->vector;
                   1569:        }
                   1570:     }
                   1571:
                   1572:   bfd_set_error (bfd_error_invalid_target);
                   1573:   return NULL;
                   1574: }
                   1575:
                   1576: /*
                   1577: FUNCTION
                   1578:        bfd_set_default_target
                   1579:
                   1580: SYNOPSIS
                   1581:        bfd_boolean bfd_set_default_target (const char *name);
                   1582:
                   1583: DESCRIPTION
                   1584:        Set the default target vector to use when recognizing a BFD.
                   1585:        This takes the name of the target, which may be a BFD target
                   1586:        name or a configuration triplet.
                   1587: */
                   1588:
                   1589: bfd_boolean
                   1590: bfd_set_default_target (const char *name)
                   1591: {
                   1592:   const bfd_target *target;
                   1593:
                   1594:   if (bfd_default_vector[0] != NULL
                   1595:       && strcmp (name, bfd_default_vector[0]->name) == 0)
                   1596:     return TRUE;
                   1597:
                   1598:   target = find_target (name);
                   1599:   if (target == NULL)
                   1600:     return FALSE;
                   1601:
                   1602:   bfd_default_vector[0] = target;
                   1603:   return TRUE;
                   1604: }
                   1605:
                   1606: /*
                   1607: FUNCTION
                   1608:        bfd_find_target
                   1609:
                   1610: SYNOPSIS
                   1611:        const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);
                   1612:
                   1613: DESCRIPTION
                   1614:        Return a pointer to the transfer vector for the object target
                   1615:        named @var{target_name}.  If @var{target_name} is <<NULL>>,
                   1616:        choose the one in the environment variable <<GNUTARGET>>; if
                   1617:        that is null or not defined, then choose the first entry in the
                   1618:        target list.  Passing in the string "default" or setting the
                   1619:        environment variable to "default" will cause the first entry in
                   1620:        the target list to be returned, and "target_defaulted" will be
                   1621:        set in the BFD if @var{abfd} isn't <<NULL>>.  This causes
                   1622:        <<bfd_check_format>> to loop over all the targets to find the
                   1623:        one that matches the file being read.
                   1624: */
                   1625:
                   1626: const bfd_target *
                   1627: bfd_find_target (const char *target_name, bfd *abfd)
                   1628: {
                   1629:   const char *targname;
                   1630:   const bfd_target *target;
                   1631:
                   1632:   if (target_name != NULL)
                   1633:     targname = target_name;
                   1634:   else
                   1635:     targname = getenv ("GNUTARGET");
                   1636:
                   1637:   /* This is safe; the vector cannot be null.  */
                   1638:   if (targname == NULL || strcmp (targname, "default") == 0)
                   1639:     {
                   1640:       if (bfd_default_vector[0] != NULL)
                   1641:        target = bfd_default_vector[0];
                   1642:       else
                   1643:        target = bfd_target_vector[0];
                   1644:       if (abfd)
                   1645:        {
                   1646:          abfd->xvec = target;
                   1647:          abfd->target_defaulted = TRUE;
                   1648:        }
                   1649:       return target;
                   1650:     }
                   1651:
                   1652:   if (abfd)
                   1653:     abfd->target_defaulted = FALSE;
                   1654:
                   1655:   target = find_target (targname);
                   1656:   if (target == NULL)
                   1657:     return NULL;
                   1658:
                   1659:   if (abfd)
                   1660:     abfd->xvec = target;
                   1661:   return target;
                   1662: }
                   1663:
                   1664: /* Helper function for bfd_get_target_info to determine the target's
                   1665:    architecture.  This method handles bfd internal target names as
                   1666:    tuples and triplets.  */
                   1667: static bfd_boolean
                   1668: _bfd_find_arch_match (const char *tname, const char **arch,
                   1669:                      const char **def_target_arch)
                   1670: {
                   1671:   if (!arch)
                   1672:     return FALSE;
                   1673:
                   1674:   while (*arch != NULL)
                   1675:     {
                   1676:       const char *in_a = strstr (*arch, tname);
                   1677:       char end_ch = (in_a ? in_a[strlen (tname)] : 0);
                   1678:
                   1679:       if (in_a && (in_a == *arch || in_a[-1] == ':')
                   1680:           && end_ch == 0)
                   1681:         {
                   1682:           *def_target_arch = *arch;
                   1683:           return TRUE;
                   1684:         }
                   1685:       arch++;
                   1686:     }
                   1687:   return FALSE;
                   1688: }
                   1689:
                   1690: /*
                   1691: FUNCTION
                   1692:        bfd_get_target_info
                   1693: SYNOPSIS
                   1694:        const bfd_target *bfd_get_target_info (const char *target_name,
                   1695:                                               bfd *abfd,
1.1.1.2   christos 1696:                                               bfd_boolean *is_bigendian,
1.1       christos 1697:                                               int *underscoring,
                   1698:                                               const char **def_target_arch);
                   1699: DESCRIPTION
                   1700:         Return a pointer to the transfer vector for the object target
                   1701:         named @var{target_name}.  If @var{target_name} is <<NULL>>,
                   1702:         choose the one in the environment variable <<GNUTARGET>>; if
                   1703:         that is null or not defined, then choose the first entry in the
                   1704:         target list.  Passing in the string "default" or setting the
                   1705:         environment variable to "default" will cause the first entry in
                   1706:         the target list to be returned, and "target_defaulted" will be
                   1707:         set in the BFD if @var{abfd} isn't <<NULL>>.  This causes
                   1708:         <<bfd_check_format>> to loop over all the targets to find the
                   1709:         one that matches the file being read.
                   1710:        If @var{is_bigendian} is not <<NULL>>, then set this value to target's
                   1711:        endian mode. True for big-endian, FALSE for little-endian or for
                   1712:        invalid target.
                   1713:        If @var{underscoring} is not <<NULL>>, then set this value to target's
                   1714:        underscoring mode. Zero for none-underscoring, -1 for invalid target,
                   1715:        else the value of target vector's symbol underscoring.
                   1716:        If @var{def_target_arch} is not <<NULL>>, then set it to the architecture
                   1717:        string specified by the target_name.
                   1718: */
                   1719: const bfd_target *
                   1720: bfd_get_target_info (const char *target_name, bfd *abfd,
                   1721:                     bfd_boolean *is_bigendian,
                   1722:                     int *underscoring, const char **def_target_arch)
                   1723: {
                   1724:   const bfd_target *target_vec;
                   1725:
                   1726:   if (is_bigendian)
                   1727:     *is_bigendian = FALSE;
                   1728:   if (underscoring)
                   1729:     *underscoring = -1;
                   1730:   if (def_target_arch)
                   1731:     *def_target_arch = NULL;
                   1732:   target_vec = bfd_find_target (target_name, abfd);
                   1733:   if (! target_vec)
                   1734:     return NULL;
                   1735:   if (is_bigendian)
                   1736:     *is_bigendian = ((target_vec->byteorder == BFD_ENDIAN_BIG) ? TRUE
                   1737:                                                               : FALSE);
                   1738:   if (underscoring)
                   1739:     *underscoring = ((int) target_vec->symbol_leading_char) & 0xff;
                   1740:
                   1741:   if (def_target_arch)
                   1742:     {
                   1743:       const char *tname = target_vec->name;
                   1744:       const char **arches = bfd_arch_list ();
                   1745:
                   1746:       if (arches && tname)
                   1747:         {
                   1748:           char *hyp = strchr (tname, '-');
                   1749:
                   1750:           if (hyp != NULL)
                   1751:             {
                   1752:               tname = ++hyp;
                   1753:
                   1754:              /* Make sure we detect architecture names
                   1755:                 for triplets like "pe-arm-wince-little".  */
                   1756:              if (!_bfd_find_arch_match (tname, arches, def_target_arch))
                   1757:                {
                   1758:                  char new_tname[50];
                   1759:
                   1760:                  strcpy (new_tname, hyp);
                   1761:                  while ((hyp = strrchr (new_tname, '-')) != NULL)
                   1762:                    {
                   1763:                      *hyp = 0;
                   1764:                      if (_bfd_find_arch_match (new_tname, arches,
1.1.1.2   christos 1765:                                                def_target_arch))
1.1       christos 1766:                        break;
                   1767:                    }
                   1768:                }
                   1769:            }
                   1770:          else
                   1771:            _bfd_find_arch_match (tname, arches, def_target_arch);
                   1772:        }
                   1773:
                   1774:       if (arches)
                   1775:         free (arches);
                   1776:     }
                   1777:   return target_vec;
                   1778: }
                   1779:
                   1780: /*
                   1781: FUNCTION
                   1782:        bfd_target_list
                   1783:
                   1784: SYNOPSIS
                   1785:        const char ** bfd_target_list (void);
                   1786:
                   1787: DESCRIPTION
                   1788:        Return a freshly malloced NULL-terminated
                   1789:        vector of the names of all the valid BFD targets. Do not
                   1790:        modify the names.
                   1791:
                   1792: */
                   1793:
                   1794: const char **
                   1795: bfd_target_list (void)
                   1796: {
                   1797:   int vec_length = 0;
                   1798:   bfd_size_type amt;
                   1799:   const bfd_target * const *target;
                   1800:   const  char **name_list, **name_ptr;
                   1801:
                   1802:   for (target = &bfd_target_vector[0]; *target != NULL; target++)
                   1803:     vec_length++;
                   1804:
                   1805:   amt = (vec_length + 1) * sizeof (char **);
                   1806:   name_ptr = name_list = (const  char **) bfd_malloc (amt);
                   1807:
                   1808:   if (name_list == NULL)
                   1809:     return NULL;
                   1810:
                   1811:   for (target = &bfd_target_vector[0]; *target != NULL; target++)
                   1812:     if (target == &bfd_target_vector[0]
                   1813:        || *target != bfd_target_vector[0])
                   1814:       *name_ptr++ = (*target)->name;
                   1815:
                   1816:   *name_ptr = NULL;
                   1817:   return name_list;
                   1818: }
                   1819:
                   1820: /*
                   1821: FUNCTION
                   1822:        bfd_seach_for_target
                   1823:
                   1824: SYNOPSIS
                   1825:        const bfd_target *bfd_search_for_target
                   1826:          (int (*search_func) (const bfd_target *, void *),
                   1827:           void *);
                   1828:
                   1829: DESCRIPTION
                   1830:        Return a pointer to the first transfer vector in the list of
                   1831:        transfer vectors maintained by BFD that produces a non-zero
                   1832:        result when passed to the function @var{search_func}.  The
                   1833:        parameter @var{data} is passed, unexamined, to the search
                   1834:        function.
                   1835: */
                   1836:
                   1837: const bfd_target *
                   1838: bfd_search_for_target (int (*search_func) (const bfd_target *, void *),
                   1839:                       void *data)
                   1840: {
                   1841:   const bfd_target * const *target;
                   1842:
                   1843:   for (target = bfd_target_vector; *target != NULL; target ++)
                   1844:     if (search_func (*target, data))
                   1845:       return *target;
                   1846:
                   1847:   return NULL;
                   1848: }
1.1.1.2   christos 1849:
                   1850: /*
                   1851: FUNCTION
                   1852:        bfd_flavour_name
                   1853:
                   1854: SYNOPSIS
                   1855:        const char *bfd_flavour_name (enum bfd_flavour flavour);
                   1856:
                   1857: DESCRIPTION
                   1858:        Return the string form of @var{flavour}.
                   1859: */
                   1860:
                   1861: const char *
                   1862: bfd_flavour_name (enum bfd_flavour flavour)
                   1863: {
                   1864:   switch (flavour)
                   1865:     {
                   1866:     case bfd_target_unknown_flavour: return "unknown file format";
                   1867:     case bfd_target_aout_flavour: return "a.out";
                   1868:     case bfd_target_coff_flavour: return "COFF";
                   1869:     case bfd_target_ecoff_flavour: return "ECOFF";
                   1870:     case bfd_target_xcoff_flavour: return "XCOFF";
                   1871:     case bfd_target_elf_flavour: return "ELF";
                   1872:     case bfd_target_ieee_flavour: return "IEEE";
                   1873:     case bfd_target_nlm_flavour: return "NLM";
                   1874:     case bfd_target_oasys_flavour: return "Oasys";
                   1875:     case bfd_target_tekhex_flavour: return "Tekhex";
                   1876:     case bfd_target_srec_flavour: return "Srec";
                   1877:     case bfd_target_verilog_flavour: return "Verilog";
                   1878:     case bfd_target_ihex_flavour: return "Ihex";
                   1879:     case bfd_target_som_flavour: return "SOM";
                   1880:     case bfd_target_os9k_flavour: return "OS9K";
                   1881:     case bfd_target_versados_flavour: return "Versados";
                   1882:     case bfd_target_msdos_flavour: return "MSDOS";
                   1883:     case bfd_target_ovax_flavour: return "Ovax";
                   1884:     case bfd_target_evax_flavour: return "Evax";
                   1885:     case bfd_target_mmo_flavour: return "mmo";
                   1886:     case bfd_target_mach_o_flavour: return "MACH_O";
                   1887:     case bfd_target_pef_flavour: return "PEF";
                   1888:     case bfd_target_pef_xlib_flavour: return "PEF_XLIB";
                   1889:     case bfd_target_sym_flavour: return "SYM";
                   1890:     /* There is no "default" case here so that -Wswitch (part of -Wall)
                   1891:        catches missing entries.  */
                   1892:     }
                   1893:
                   1894:   abort ();
                   1895: }

CVSweb <webmaster@jp.NetBSD.org>