[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.7

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

CVSweb <webmaster@jp.NetBSD.org>