X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Ftargets.c;h=d8264d23f369b25f5c46858b3c015e8544ef3970;hb=b3baf5d0a8293b5f823c0d7848494507edb373fb;hp=c9f7f959b541884ae3f0d30bc2d46fe10c013397;hpb=60bcf0fa8c115b4e71d7b1372aca3efccffc9607;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/targets.c b/bfd/targets.c index c9f7f959b5..d8264d23f3 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -1,5 +1,6 @@ /* Generic target-file-type support for the BFD library. - Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001 Free Software Foundation, Inc. Written by Cygnus Support. @@ -25,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "fnmatch.h" /* -SECTION +SECTION Targets DESCRIPTION @@ -34,7 +35,7 @@ DESCRIPTION part of BFD is a structure containing pointers to functions which perform certain low level operations on files. BFD translates the applications's requests through a pointer into - calls to the back end routines. + calls to the back end routines. When a file is opened with <>, its format and target are unknown. BFD uses various mechanisms to determine @@ -42,11 +43,11 @@ DESCRIPTION o Create a BFD by calling the internal routine <<_bfd_new_bfd>>, then call <> with the - target string supplied to <> and the new BFD pointer. + target string supplied to <> and the new BFD pointer. o If a null target string was provided to <>, look up the environment variable <> and use - that as the target string. + that as the target string. o If the target string is still <>, or the target string is <>, then use the first item in the target vector @@ -56,7 +57,7 @@ DESCRIPTION o Otherwise, inspect the elements in the target vector one by one, until a match on target name is found. When found, - use it. + use it. o Otherwise return the error <> to <>. @@ -66,7 +67,7 @@ DESCRIPTION Once the BFD has been opened and the target selected, the file format may be determined. This is done by calling - <> on the BFD with a suggested format. + <> on the BFD with a suggested format. If <> has been set, each possible target type is tried to see if it recognizes the specified format. <> returns <> when the caller guesses right. @@ -75,7 +76,6 @@ DESCRIPTION @end menu */ - /* INODE @@ -87,17 +87,17 @@ SUBSECTION DESCRIPTION This structure contains everything that BFD knows about a target. It includes things like its byte order, name, and which - routines to call to do various operations. + routines to call to do various operations. Every BFD points to a target structure with its <> - member. + member. The macros below are used to dispatch to functions through the <> vector. They are used in a number of macros further down in @file{bfd.h}, and are also used when calling various routines by hand inside the BFD implementation. The @var{arglist} argument must be parenthesized; it contains all the arguments - to the called function. + to the called function. They make the documentation (more) unpleasant to read, so if someone wants to fix this and not break the above, please do. @@ -116,13 +116,13 @@ DESCRIPTION For operations which index on the BFD format: .#define BFD_SEND_FMT(bfd, message, arglist) \ -. (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) +. (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) . .#ifdef DEBUG_BFD_SEND .#undef BFD_SEND_FMT .#define BFD_SEND_FMT(bfd, message, arglist) \ . (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ -. (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) : \ +. (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) : \ . (bfd_assert (__FILE__,__LINE__), NULL)) .#endif @@ -131,10 +131,9 @@ DESCRIPTION module that implements access to a different target under BFD, defines one of these. - FIXME, these names should be rationalised with the names of the entry points which call them. Too bad we can't have one - macro to define them both! + macro to define them both! .enum bfd_flavour { . bfd_target_unknown_flavour, @@ -185,21 +184,21 @@ The order of bytes within the header parts of a file. A mask of all the flags which an executable may have set - from the set <>, <>, ...<>. -. flagword object_flags; +. flagword object_flags; A mask of all the flags which a section may have set - from the set <>, <>, ...<>. . flagword section_flags; -The character normally found at the front of a symbol +The character normally found at the front of a symbol (if any), perhaps `_'. . char symbol_leading_char; The pad character for file names within an archive header. -. char ar_pad_char; +. char ar_pad_char; The maximum number of characters in an archive header. @@ -234,15 +233,15 @@ Byte swapping for the headers Format dependent routines: these are vectors of entry points within the target vector structure, one for each format to check. -Check the format of a file being read. Return a <> or zero. +Check the format of a file being read. Return a <> or zero. . const struct bfd_target *(*_bfd_check_format[bfd_type_end]) PARAMS ((bfd *)); -Set the format of a file being written. +Set the format of a file being written. . boolean (*_bfd_set_format[bfd_type_end]) PARAMS ((bfd *)); -Write cached information into a file being written, at <>. +Write cached information into a file being written, at <>. . boolean (*_bfd_write_contents[bfd_type_end]) PARAMS ((bfd *)); @@ -265,7 +264,7 @@ BFD_JUMP_TABLE macros. . {* Called when a new section is created. *} . boolean (*_new_section_hook) PARAMS ((bfd *, sec_ptr)); . {* Read the contents of a section. *} -. boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, +. boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, . file_ptr, bfd_size_type)); . boolean (*_bfd_get_section_contents_in_window) . PARAMS ((bfd *, sec_ptr, bfd_window *, @@ -289,7 +288,7 @@ BFD_JUMP_TABLE macros. . to another. *} . boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr, . bfd *, sec_ptr)); -. {* Called to copy BFD private symbol data from one symbol +. {* Called to copy BFD private symbol data from one symbol . to another. *} . boolean (*_bfd_copy_private_symbol_data) PARAMS ((bfd *, asymbol *, . bfd *, asymbol *)); @@ -325,10 +324,10 @@ BFD_JUMP_TABLE macros. . boolean (*_bfd_construct_extended_name_table) . PARAMS ((bfd *, char **, bfd_size_type *, const char **)); . void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *)); -. boolean (*write_armap) PARAMS ((bfd *arch, +. boolean (*write_armap) PARAMS ((bfd *arch, . unsigned int elength, . struct orl *map, -. unsigned int orl_count, +. unsigned int orl_count, . int stridx)); . PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); . bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); @@ -468,15 +467,15 @@ and little endian code, and target chosen by the linker has the wrong endianness. The function open_output() in ld/ldlang.c uses this field to find an alternative output format that is suitable. -. {* Opposite endian version of this target. *} +. {* Opposite endian version of this target. *} . const struct bfd_target * alternative_target; -. +. Data for use by back-end routines, which isn't generic enough to belong in this structure. . PTR backend_data; -. +. .} bfd_target; */ @@ -487,107 +486,126 @@ in this structure. we can't intermix extern's and initializers. */ extern const bfd_target a29kcoff_big_vec; extern const bfd_target a_out_adobe_vec; +extern const bfd_target aout0_big_vec; extern const bfd_target aout_arm_big_vec; extern const bfd_target aout_arm_little_vec; extern const bfd_target aout_mips_big_vec; extern const bfd_target aout_mips_little_vec; -extern const bfd_target aout0_big_vec; extern const bfd_target apollocoff_vec; -extern const bfd_target armcoff_little_vec; +extern const bfd_target arm_epoc_pe_big_vec; +extern const bfd_target arm_epoc_pe_little_vec; +extern const bfd_target arm_epoc_pei_big_vec; +extern const bfd_target arm_epoc_pei_little_vec; extern const bfd_target armcoff_big_vec; +extern const bfd_target armcoff_little_vec; extern const bfd_target armnetbsd_vec; -extern const bfd_target armpe_little_vec; extern const bfd_target armpe_big_vec; -extern const bfd_target armpei_little_vec; +extern const bfd_target armpe_little_vec; extern const bfd_target armpei_big_vec; -extern const bfd_target arm_epoc_pe_little_vec; -extern const bfd_target arm_epoc_pe_big_vec; -extern const bfd_target arm_epoc_pei_little_vec; -extern const bfd_target arm_epoc_pei_big_vec; +extern const bfd_target armpei_little_vec; extern const bfd_target b_out_vec_big_host; extern const bfd_target b_out_vec_little_host; extern const bfd_target bfd_efi_app_ia32_vec; extern const bfd_target bfd_efi_app_ia64_vec; -extern const bfd_target bfd_elf64_alpha_vec; -extern const bfd_target bfd_elf64_hppa_vec; -extern const bfd_target bfd_elf64_ia64_little_vec; -extern const bfd_target bfd_elf64_ia64_big_vec; extern const bfd_target bfd_elf32_avr_vec; +extern const bfd_target bfd_elf32_big_generic_vec; extern const bfd_target bfd_elf32_bigarc_vec; -extern const bfd_target bfd_elf32_bigarm_vec; extern const bfd_target bfd_elf32_bigarm_oabi_vec; -extern const bfd_target bfd_elf32_littlearc_vec; -extern const bfd_target bfd_elf32_littlearm_vec; -extern const bfd_target bfd_elf32_littlearm_oabi_vec; -extern const bfd_target bfd_elf32_big_generic_vec; +extern const bfd_target bfd_elf32_bigarm_vec; extern const bfd_target bfd_elf32_bigmips_vec; -extern const bfd_target bfd_elf64_bigmips_vec; +extern const bfd_target bfd_elf32_cris_vec; extern const bfd_target bfd_elf32_d10v_vec; extern const bfd_target bfd_elf32_d30v_vec; +extern const bfd_target bfd_elf32_fr30_vec; +extern const bfd_target bfd_elf32_hppa_linux_vec; extern const bfd_target bfd_elf32_hppa_vec; extern const bfd_target bfd_elf32_i370_vec; extern const bfd_target bfd_elf32_i386_vec; +extern const bfd_target bfd_elf32_i860_little_vec; extern const bfd_target bfd_elf32_i860_vec; extern const bfd_target bfd_elf32_i960_vec; +extern const bfd_target bfd_elf32_ia64_big_vec; extern const bfd_target bfd_elf32_little_generic_vec; +extern const bfd_target bfd_elf32_littlearc_vec; +extern const bfd_target bfd_elf32_littlearm_oabi_vec; +extern const bfd_target bfd_elf32_littlearm_vec; extern const bfd_target bfd_elf32_littlemips_vec; -extern const bfd_target bfd_elf64_littlemips_vec; extern const bfd_target bfd_elf32_m32r_vec; extern const bfd_target bfd_elf32_m68hc11_vec; extern const bfd_target bfd_elf32_m68hc12_vec; extern const bfd_target bfd_elf32_m68k_vec; extern const bfd_target bfd_elf32_m88k_vec; +extern const bfd_target bfd_elf32_mcore_big_vec; +extern const bfd_target bfd_elf32_mcore_little_vec; extern const bfd_target bfd_elf32_mn10200_vec; extern const bfd_target bfd_elf32_mn10300_vec; +extern const bfd_target bfd_elf32_openrisc_vec; extern const bfd_target bfd_elf32_pj_vec; extern const bfd_target bfd_elf32_pjl_vec; extern const bfd_target bfd_elf32_powerpc_vec; extern const bfd_target bfd_elf32_powerpcle_vec; +extern const bfd_target bfd_elf32_s390_vec; extern const bfd_target bfd_elf32_sh_vec; +extern const bfd_target bfd_elf32_shblin_vec; extern const bfd_target bfd_elf32_shl_vec; +extern const bfd_target bfd_elf32_shlin_vec; extern const bfd_target bfd_elf32_sparc_vec; +extern const bfd_target bfd_elf32_tradbigmips_vec; +extern const bfd_target bfd_elf32_tradlittlemips_vec; +extern const bfd_target bfd_elf32_us_cris_vec; extern const bfd_target bfd_elf32_v850_vec; -extern const bfd_target bfd_elf32_fr30_vec; -extern const bfd_target bfd_elf32_mcore_big_vec; -extern const bfd_target bfd_elf32_mcore_little_vec; +extern const bfd_target bfd_elf64_alpha_vec; extern const bfd_target bfd_elf64_big_generic_vec; +extern const bfd_target bfd_elf64_bigmips_vec; +extern const bfd_target bfd_elf64_hppa_linux_vec; +extern const bfd_target bfd_elf64_hppa_vec; +extern const bfd_target bfd_elf64_ia64_aix_big_vec; +extern const bfd_target bfd_elf64_ia64_aix_little_vec; +extern const bfd_target bfd_elf64_ia64_big_vec; +extern const bfd_target bfd_elf64_ia64_little_vec; extern const bfd_target bfd_elf64_little_generic_vec; +extern const bfd_target bfd_elf64_littlemips_vec; +extern const bfd_target bfd_elf64_tradbigmips_vec; +extern const bfd_target bfd_elf64_tradlittlemips_vec; +extern const bfd_target bfd_elf64_s390_vec; extern const bfd_target bfd_elf64_sparc_vec; +extern const bfd_target bfd_elf64_x86_64_vec; +extern const bfd_target bfd_powerpc_pe_vec; +extern const bfd_target bfd_powerpc_pei_vec; +extern const bfd_target bfd_powerpcle_pe_vec; +extern const bfd_target bfd_powerpcle_pei_vec; +extern const bfd_target cris_aout_vec; extern const bfd_target demo_64_vec; extern const bfd_target ecoff_big_vec; -extern const bfd_target ecoff_little_vec; extern const bfd_target ecoff_biglittle_vec; +extern const bfd_target ecoff_little_vec; extern const bfd_target ecoffalpha_little_vec; +extern const bfd_target go32coff_vec; +extern const bfd_target go32stubbedcoff_vec; extern const bfd_target h8300coff_vec; extern const bfd_target h8500coff_vec; extern const bfd_target host_aout_vec; extern const bfd_target hp300bsd_vec; extern const bfd_target hp300hpux_vec; -extern const bfd_target som_vec; extern const bfd_target i386aout_vec; extern const bfd_target i386bsd_vec; +extern const bfd_target i386coff_vec; extern const bfd_target i386dynix_vec; extern const bfd_target i386freebsd_vec; -extern const bfd_target i386os9k_vec; -extern const bfd_target i386coff_vec; -extern const bfd_target bfd_powerpc_pe_vec; -extern const bfd_target bfd_powerpcle_pe_vec; -extern const bfd_target bfd_powerpc_pei_vec; -extern const bfd_target bfd_powerpcle_pei_vec; -extern const bfd_target i386pe_vec; -extern const bfd_target i386pei_vec; -extern const bfd_target go32coff_vec; -extern const bfd_target go32stubbedcoff_vec; extern const bfd_target i386linux_vec; extern const bfd_target i386lynx_aout_vec; extern const bfd_target i386lynx_coff_vec; extern const bfd_target i386mach3_vec; extern const bfd_target i386msdos_vec; extern const bfd_target i386netbsd_vec; +extern const bfd_target i386os9k_vec; +extern const bfd_target i386pe_vec; +extern const bfd_target i386pei_vec; extern const bfd_target i860coff_vec; extern const bfd_target icoff_big_vec; extern const bfd_target icoff_little_vec; extern const bfd_target ieee_vec; +extern const bfd_target m68k4knetbsd_vec; extern const bfd_target m68kaux_coff_vec; extern const bfd_target m68kcoff_vec; extern const bfd_target m68kcoffun_vec; @@ -596,57 +614,58 @@ extern const bfd_target m68klynx_aout_vec; extern const bfd_target m68klynx_coff_vec; extern const bfd_target m68knetbsd_vec; extern const bfd_target m68ksysvcoff_vec; -extern const bfd_target m68k4knetbsd_vec; extern const bfd_target m88kbcs_vec; extern const bfd_target m88kmach3_vec; -extern const bfd_target mipslpe_vec; -extern const bfd_target mipslpei_vec; extern const bfd_target mcore_pe_big_vec; extern const bfd_target mcore_pe_little_vec; extern const bfd_target mcore_pei_big_vec; extern const bfd_target mcore_pei_little_vec; +extern const bfd_target mipslpe_vec; +extern const bfd_target mipslpei_vec; extern const bfd_target newsos3_vec; -extern const bfd_target nlm32_i386_vec; -extern const bfd_target nlm32_sparc_vec; extern const bfd_target nlm32_alpha_vec; +extern const bfd_target nlm32_i386_vec; extern const bfd_target nlm32_powerpc_vec; -extern const bfd_target pc532netbsd_vec; +extern const bfd_target nlm32_sparc_vec; extern const bfd_target oasys_vec; extern const bfd_target pc532machaout_vec; +extern const bfd_target pc532netbsd_vec; +extern const bfd_target pdp11_aout_vec; +extern const bfd_target pmac_xcoff_vec; extern const bfd_target ppcboot_vec; extern const bfd_target riscix_vec; -extern const bfd_target pmac_xcoff_vec; -extern const bfd_target rs6000coff_vec; extern const bfd_target rs6000coff64_vec; -extern const bfd_target shcoff_vec; -extern const bfd_target shlcoff_vec; +extern const bfd_target rs6000coff_vec; extern const bfd_target shcoff_small_vec; +extern const bfd_target shcoff_vec; extern const bfd_target shlcoff_small_vec; +extern const bfd_target shlcoff_vec; extern const bfd_target shlpe_vec; extern const bfd_target shlpei_vec; +extern const bfd_target som_vec; +extern const bfd_target sparccoff_vec; extern const bfd_target sparcle_aout_vec; extern const bfd_target sparclinux_vec; extern const bfd_target sparclynx_aout_vec; extern const bfd_target sparclynx_coff_vec; extern const bfd_target sparcnetbsd_vec; -extern const bfd_target sparccoff_vec; extern const bfd_target sunos_big_vec; extern const bfd_target tekhex_vec; extern const bfd_target tic30_aout_vec; extern const bfd_target tic30_coff_vec; -extern const bfd_target tic54x_coff0_vec; extern const bfd_target tic54x_coff0_beh_vec; -extern const bfd_target tic54x_coff1_vec; +extern const bfd_target tic54x_coff0_vec; extern const bfd_target tic54x_coff1_beh_vec; -extern const bfd_target tic54x_coff2_vec; +extern const bfd_target tic54x_coff1_vec; extern const bfd_target tic54x_coff2_beh_vec; +extern const bfd_target tic54x_coff2_vec; extern const bfd_target tic80coff_vec; extern const bfd_target vaxnetbsd_vec; extern const bfd_target versados_vec; extern const bfd_target vms_alpha_vec; extern const bfd_target vms_vax_vec; -extern const bfd_target we32kcoff_vec; extern const bfd_target w65_vec; +extern const bfd_target we32kcoff_vec; extern const bfd_target z8kcoff_vec; /* srec is always included. */ @@ -672,7 +691,7 @@ extern const bfd_target sco5_core_vec; extern const bfd_target trad_core_vec; extern const bfd_target ptrace_core_vec; -const bfd_target * const bfd_target_vector[] = { +static const bfd_target * const _bfd_target_vector[] = { #ifdef SELECT_VECS @@ -711,6 +730,9 @@ const bfd_target * const bfd_target_vector[] = { #ifdef BFD64 &bfd_elf64_alpha_vec, &bfd_elf64_hppa_vec, + &bfd_elf64_hppa_linux_vec, + &bfd_elf64_ia64_aix_little_vec, + &bfd_elf64_ia64_aix_big_vec, &bfd_elf64_ia64_little_vec, &bfd_elf64_ia64_big_vec, #endif @@ -722,12 +744,19 @@ const bfd_target * const bfd_target_vector[] = { #ifdef BFD64 &bfd_elf64_bigmips_vec, #endif + &bfd_elf32_cris_vec, + &bfd_elf32_us_cris_vec, &bfd_elf32_d10v_vec, &bfd_elf32_d30v_vec, &bfd_elf32_hppa_vec, + &bfd_elf32_hppa_linux_vec, &bfd_elf32_i370_vec, &bfd_elf32_i386_vec, +#ifdef BFD64 + &bfd_elf64_x86_64_vec, +#endif &bfd_elf32_i860_vec, + &bfd_elf32_i860_little_vec, &bfd_elf32_i960_vec, &bfd_elf32_little_generic_vec, &bfd_elf32_littlearc_vec, @@ -753,7 +782,12 @@ const bfd_target * const bfd_target_vector[] = { &bfd_elf32_fr30_vec, &bfd_elf32_mcore_big_vec, &bfd_elf32_mcore_little_vec, -#ifdef BFD64 /* No one seems to use this. */ + &bfd_elf32_tradbigmips_vec, + &bfd_elf32_tradlittlemips_vec, +#ifdef BFD64 + &bfd_elf64_tradbigmips_vec, + &bfd_elf64_tradlittlemips_vec, + /* No one seems to use this. */ &bfd_elf64_big_generic_vec, &bfd_elf64_little_generic_vec, #endif @@ -763,6 +797,8 @@ const bfd_target * const bfd_target_vector[] = { /* We don't include cisco_core_*_vec. Although it has a magic number, the magic number isn't at the beginning of the file, and thus might spuriously match other kinds of files. */ + + &cris_aout_vec, #ifdef BFD64 &demo_64_vec, /* Only compiled if host has long-long support */ #endif @@ -860,6 +896,7 @@ const bfd_target * const bfd_target_vector[] = { &oasys_vec, #endif &pc532machaout_vec, + &pdp11_aout_vec, #if 0 /* We have no way of distinguishing these from other a.out variants */ &aout_arm_big_vec, @@ -867,7 +904,7 @@ const bfd_target * const bfd_target_vector[] = { &riscix_vec, #endif #if 0 - /* This has the same magic number as RS/6000. */ + /* This has the same magic number as RS/6000. */ &pmac_xcoff_vec, #endif &rs6000coff_vec, @@ -903,7 +940,10 @@ const bfd_target * const bfd_target_vector[] = { &vms_vax_vec, &we32kcoff_vec, &z8kcoff_vec, - + &bfd_elf32_s390_vec, +#ifdef BFD64 + &bfd_elf64_s390_vec, +#endif #endif /* not SELECT_VECS */ /* Always support S-records, for convenience. */ @@ -949,6 +989,7 @@ const bfd_target * const bfd_target_vector[] = { NULL /* end of list marker */ }; +const bfd_target * const *bfd_target_vector = _bfd_target_vector; /* bfd_default_vector[0] contains either the address of the default vector, if there is one, or zero if there isn't. */ @@ -963,7 +1004,7 @@ const bfd_target *bfd_default_vector[] = { /* When there is an ambiguous match, bfd_check_format_matches puts the names of the matching targets in an array. This variable is the maximum number of entries that the array could possibly need. */ -const size_t _bfd_target_vector_entries = sizeof(bfd_target_vector)/sizeof(*bfd_target_vector); +const size_t _bfd_target_vector_entries = sizeof (bfd_target_vector)/sizeof (*bfd_target_vector); /* This array maps configuration triplets onto BFD vectors. */ @@ -1063,7 +1104,7 @@ DESCRIPTION variable to "default" will cause the first entry in the target list to be returned, and "target_defaulted" will be set in the BFD. This causes <> to loop over all the - targets to find the one that matches the file being read. + targets to find the one that matches the file being read. */ const bfd_target * @@ -1146,7 +1187,7 @@ FUNCTION bfd_seach_for_target SYNOPSIS - const bfd_target * bfd_search_for_target (int (* search_func)(const bfd_target *, void *), void *); + const bfd_target * bfd_search_for_target (int (* search_func) (const bfd_target *, void *), void *); DESCRIPTION Return a pointer to the first transfer vector in the list of