* bfd.c (struct bfd_preserve): New.
[binutils-gdb.git] / bfd / targets.c
index 7c6f4f3c94a08e8957892c75a10251826cd31d61..6a68eaa13f0e2dab081a4ee6f399dd3748be7d39 100644 (file)
@@ -4,21 +4,21 @@
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "bfd.h"
 #include "sysdep.h"
@@ -155,7 +155,11 @@ DESCRIPTION
 .  bfd_target_msdos_flavour,
 .  bfd_target_ovax_flavour,
 .  bfd_target_evax_flavour,
-.  bfd_target_mmo_flavour
+.  bfd_target_mmo_flavour,
+.  bfd_target_mach_o_flavour,
+.  bfd_target_pef_flavour,
+.  bfd_target_pef_xlib_flavour,
+.  bfd_target_sym_flavour
 .};
 .
 .enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
@@ -481,6 +485,7 @@ to find an alternative output format that is suitable.
    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 aix5coff64_vec;
 extern const bfd_target aout0_big_vec;
 extern const bfd_target aout_arm_big_vec;
 extern const bfd_target aout_arm_little_vec;
@@ -513,17 +518,19 @@ extern const bfd_target bfd_elf32_d10v_vec;
 extern const bfd_target bfd_elf32_d30v_vec;
 extern const bfd_target bfd_elf32_dlx_big_vec;
 extern const bfd_target bfd_elf32_fr30_vec;
+extern const bfd_target bfd_elf32_frv_vec;
 extern const bfd_target bfd_elf32_h8300_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_freebsd_vec;
 extern const bfd_target bfd_elf32_i386_vec;
-extern const bfd_target bfd_elf32_i386qnx_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_ia64_hpux_big_vec;
+extern const bfd_target bfd_elf32_ip2k_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;
@@ -538,6 +545,10 @@ 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_nbigmips_vec;
+extern const bfd_target bfd_elf32_nlittlemips_vec;
+extern const bfd_target bfd_elf32_ntradbigmips_vec;
+extern const bfd_target bfd_elf32_ntradlittlemips_vec;
 extern const bfd_target bfd_elf32_openrisc_vec;
 extern const bfd_target bfd_elf32_or32_big_vec;
 extern const bfd_target bfd_elf32_pj_vec;
@@ -545,6 +556,12 @@ 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_sh64_vec;
+extern const bfd_target bfd_elf32_sh64l_vec;
+extern const bfd_target bfd_elf32_sh64lin_vec;
+extern const bfd_target bfd_elf32_sh64blin_vec;
+extern const bfd_target bfd_elf32_sh64lnbsd_vec;
+extern const bfd_target bfd_elf32_sh64nbsd_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;
@@ -558,6 +575,7 @@ extern const bfd_target bfd_elf32_us_cris_vec;
 extern const bfd_target bfd_elf32_v850_vec;
 extern const bfd_target bfd_elf32_vax_vec;
 extern const bfd_target bfd_elf32_xstormy16_vec;
+extern const bfd_target bfd_elf64_alpha_freebsd_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;
@@ -574,6 +592,12 @@ extern const bfd_target bfd_elf64_mmix_vec;
 extern const bfd_target bfd_elf64_powerpc_vec;
 extern const bfd_target bfd_elf64_powerpcle_vec;
 extern const bfd_target bfd_elf64_s390_vec;
+extern const bfd_target bfd_elf64_sh64_vec;
+extern const bfd_target bfd_elf64_sh64l_vec;
+extern const bfd_target bfd_elf64_sh64lin_vec;
+extern const bfd_target bfd_elf64_sh64blin_vec;
+extern const bfd_target bfd_elf64_sh64lnbsd_vec;
+extern const bfd_target bfd_elf64_sh64nbsd_vec;
 extern const bfd_target bfd_elf64_sparc_vec;
 extern const bfd_target bfd_elf64_tradbigmips_vec;
 extern const bfd_target bfd_elf64_tradlittlemips_vec;
@@ -625,6 +649,9 @@ extern const bfd_target m68knetbsd_vec;
 extern const bfd_target m68ksysvcoff_vec;
 extern const bfd_target m88kbcs_vec;
 extern const bfd_target m88kmach3_vec;
+extern const bfd_target mach_o_be_vec;
+extern const bfd_target mach_o_le_vec;
+extern const bfd_target mach_o_fat_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;
@@ -641,12 +668,13 @@ extern const bfd_target or32coff_big_vec;
 extern const bfd_target pc532machaout_vec;
 extern const bfd_target pc532netbsd_vec;
 extern const bfd_target pdp11_aout_vec;
+extern const bfd_target pef_vec;
+extern const bfd_target pef_xlib_vec;
 extern const bfd_target pmac_xcoff_vec;
 extern const bfd_target ppcboot_vec;
 extern const bfd_target riscix_vec;
 extern const bfd_target rs6000coff64_vec;
 extern const bfd_target rs6000coff_vec;
-extern const bfd_target aix5coff64_vec;
 extern const bfd_target shcoff_small_vec;
 extern const bfd_target shcoff_vec;
 extern const bfd_target shlcoff_small_vec;
@@ -661,8 +689,15 @@ extern const bfd_target sparclynx_aout_vec;
 extern const bfd_target sparclynx_coff_vec;
 extern const bfd_target sparcnetbsd_vec;
 extern const bfd_target sunos_big_vec;
+extern const bfd_target sym_vec;
 extern const bfd_target tic30_aout_vec;
 extern const bfd_target tic30_coff_vec;
+extern const bfd_target tic4x_coff0_beh_vec;
+extern const bfd_target tic4x_coff0_vec;
+extern const bfd_target tic4x_coff1_beh_vec;
+extern const bfd_target tic4x_coff1_vec;
+extern const bfd_target tic4x_coff2_beh_vec;
+extern const bfd_target tic4x_coff2_vec;
 extern const bfd_target tic54x_coff0_beh_vec;
 extern const bfd_target tic54x_coff0_vec;
 extern const bfd_target tic54x_coff1_beh_vec;
@@ -670,6 +705,7 @@ 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 vaxbsd_vec;
 extern const bfd_target vaxnetbsd_vec;
 extern const bfd_target vax1knetbsd_vec;
 extern const bfd_target versados_vec;
@@ -699,15 +735,6 @@ extern const bfd_target ptrace_core_vec;
 extern const bfd_target sco5_core_vec;
 extern const bfd_target trad_core_vec;
 
-extern const bfd_target bfd_elf32_sh64_vec;
-extern const bfd_target bfd_elf32_sh64l_vec;
-extern const bfd_target bfd_elf64_sh64_vec;
-extern const bfd_target bfd_elf64_sh64l_vec;
-
-extern const bfd_target bfd_elf32_sh64nbsd_vec;
-extern const bfd_target bfd_elf32_sh64lnbsd_vec;
-extern const bfd_target bfd_elf64_sh64nbsd_vec;
-extern const bfd_target bfd_elf64_sh64lnbsd_vec;
 static const bfd_target * const _bfd_target_vector[] = {
 
 #ifdef SELECT_VECS
@@ -727,6 +754,9 @@ static const bfd_target * const _bfd_target_vector[] = {
           it wasn't omitted by mistake.  */
        &a29kcoff_big_vec,
        &a_out_adobe_vec,
+#ifdef BFD64
+       &aix5coff64_vec,
+#endif
        &aout0_big_vec,
 #if 0
        /* We have no way of distinguishing these from other a.out variants */
@@ -772,12 +802,13 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf32_d30v_vec,
        &bfd_elf32_dlx_big_vec,
        &bfd_elf32_fr30_vec,
+       &bfd_elf32_frv_vec,
        &bfd_elf32_h8300_vec,
        &bfd_elf32_hppa_linux_vec,
        &bfd_elf32_hppa_vec,
        &bfd_elf32_i370_vec,
+       &bfd_elf32_i386_freebsd_vec,
        &bfd_elf32_i386_vec,
-       &bfd_elf32_i386qnx_vec,
        &bfd_elf32_i860_little_vec,
        &bfd_elf32_i860_vec,
        &bfd_elf32_i960_vec,
@@ -785,6 +816,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf32_ia64_big_vec,
 #endif
        &bfd_elf32_ia64_hpux_big_vec,
+       &bfd_elf32_ip2k_vec,
        &bfd_elf32_little_generic_vec,
        &bfd_elf32_littlearc_vec,
        &bfd_elf32_littlearm_oabi_vec,
@@ -799,6 +831,12 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf32_mcore_little_vec,
        &bfd_elf32_mn10200_vec,
        &bfd_elf32_mn10300_vec,
+#ifdef BFD64
+       &bfd_elf32_nbigmips_vec,
+       &bfd_elf32_nlittlemips_vec,
+       &bfd_elf32_ntradbigmips_vec,
+       &bfd_elf32_ntradlittlemips_vec,
+#endif
        &bfd_elf32_openrisc_vec,
        &bfd_elf32_or32_big_vec,
        &bfd_elf32_pj_vec,
@@ -812,6 +850,14 @@ static const bfd_target * const _bfd_target_vector[] = {
         &bfd_elf32_shlin_vec,
        &bfd_elf32_shlnbsd_vec,
        &bfd_elf32_shnbsd_vec,
+#ifdef BFD64
+       &bfd_elf32_sh64_vec,
+       &bfd_elf32_sh64l_vec,
+       &bfd_elf32_sh64lnbsd_vec,
+       &bfd_elf32_sh64nbsd_vec,
+       &bfd_elf32_sh64lin_vec,
+       &bfd_elf32_sh64blin_vec,
+#endif
        &bfd_elf32_sparc_vec,
        &bfd_elf32_tradbigmips_vec,
        &bfd_elf32_tradlittlemips_vec,
@@ -820,6 +866,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf32_vax_vec,
        &bfd_elf32_xstormy16_vec,
 #ifdef BFD64
+       &bfd_elf64_alpha_freebsd_vec,
        &bfd_elf64_alpha_vec,
        &bfd_elf64_big_generic_vec,
        &bfd_elf64_bigmips_vec,
@@ -836,6 +883,12 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf64_powerpc_vec,
        &bfd_elf64_powerpcle_vec,
        &bfd_elf64_s390_vec,
+       &bfd_elf64_sh64_vec,
+       &bfd_elf64_sh64l_vec,
+       &bfd_elf64_sh64lnbsd_vec,
+       &bfd_elf64_sh64nbsd_vec,
+       &bfd_elf64_sh64lin_vec,
+       &bfd_elf64_sh64blin_vec,
 #if 0
        &bfd_elf64_sparc_vec,
 #endif
@@ -914,6 +967,9 @@ static const bfd_target * const _bfd_target_vector[] = {
        &m68ksysvcoff_vec,
        &m88kbcs_vec,
        &m88kmach3_vec,
+       &mach_o_be_vec,
+       &mach_o_le_vec,
+       &mach_o_fat_vec,
        &mcore_pe_big_vec,
        &mcore_pe_little_vec,
        &mcore_pei_big_vec,
@@ -941,6 +997,8 @@ static const bfd_target * const _bfd_target_vector[] = {
        &pc532machaout_vec,
        &pc532netbsd_vec,
        &pdp11_aout_vec,
+       &pef_vec,
+       &pef_xlib_vec,
 #if 0
        /* This has the same magic number as RS/6000.  */
        &pmac_xcoff_vec,
@@ -970,6 +1028,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &sparclynx_coff_vec,
        &sparcnetbsd_vec,
        &sunos_big_vec,
+       &sym_vec,
        &tic30_aout_vec,
        &tic30_coff_vec,
        &tic54x_coff0_beh_vec,
@@ -979,6 +1038,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &tic54x_coff2_beh_vec,
        &tic54x_coff2_vec,
        &tic80coff_vec,
+       &vaxbsd_vec,
        &vaxnetbsd_vec,
        &vax1knetbsd_vec,
        &versados_vec,
@@ -1052,6 +1112,17 @@ const bfd_target *bfd_default_vector[] = {
        NULL
 };
 
+/* bfd_associated_vector[] contains the associated target vectors used
+   to reduce the ambiguity in bfd_check_format_matches.  */
+
+static const bfd_target *_bfd_associated_vector[] = {
+#ifdef ASSOCIATED_VECS
+       ASSOCIATED_VECS,
+#endif
+       NULL
+};
+const bfd_target * const *bfd_associated_vector = _bfd_associated_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.  */
@@ -1223,14 +1294,17 @@ bfd_target_list ()
     vec_length++;
 
   amt = (vec_length + 1) * sizeof (char **);
-  name_ptr = name_list = (const char **) bfd_zmalloc (amt);
+  name_ptr = name_list = (const char **) bfd_malloc (amt);
 
   if (name_list == NULL)
     return NULL;
 
   for (target = &bfd_target_vector[0]; *target != NULL; target++)
-    *(name_ptr++) = (*target)->name;
+    if (target == &bfd_target_vector[0]
+       || *target != bfd_target_vector[0])
+      *name_ptr++ = (*target)->name;
 
+  *name_ptr = NULL;
   return name_list;
 }