2007-03-13 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Mar 2007 02:56:45 +0000 (02:56 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Mar 2007 02:56:45 +0000 (02:56 +0000)
PR binutils/3826
* elf-bfd.h (elf_backend_data): Add elf_osabi.
(_bfd_elf_set_osabi): New.

* elf.c (_bfd_elf_set_osabi): New.

* elf32-hppa.c (elf32_hppa_post_process_headers): Removed.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi.
(ELF_OSABI): Properly defined for each target.

* elf32-i370.c (i370_elf_post_process_headers): Removed.
(ELF_OSABI): Defined.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi.

* elf32-i386.c (ELF_OSABI): Defined to ELFOSABI_FREEBSD for
freebsd.
(elf_i386_post_process_headers): Set EI_OSABI with elf_osabi.

* elf32-msp430.c (elf32_msp430_post_process_headers): Removed.
(ELF_OSABI): Defined.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi.

* elf64-alpha.c (ELF_OSABI): Defined to ELFOSABI_FREEBSD for
freebsd.
(elf64_alpha_fbsd_post_process_headers): Set EI_OSABI with
elf_osabi.

* elf64-hppa.c (elf64_hppa_post_process_headers): Set EI_OSABI
with elf_osabi.
(ELF_OSABI): Properly defined for each target.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi for Linux.

* elf64-sparc.c (elf64_sparc_fbsd_post_process_headers): Removed.
(ELF_OSABI): Defined to ELFOSABI_FREEBSD for freebsd.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi.

* elf64-x86-64.c (elf64_x86_64_fbsd_post_process_headers): Removed.
(ELF_OSABI): Defined to ELFOSABI_FREEBSD for freebsd.
(elf_backend_post_process_headers): Defined with
_bfd_elf_set_osabi.

* elfcode.h (elf_object_p): Match the ELFOSABI_NONE ELF target
with any ELF target of the compatible machine for which we do not
have a specific backend.

* elfxx-ia64.c (elfNN_hpux_post_process_headers): Set EI_OSABI
with elf_osabi.

* elfxx-target.h (ELF_OSABI): Default to ELFOSABI_NONE.
(elfNN_bed): Initialize elf_osabi with ELF_OSABI.

14 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-hppa.c
bfd/elf32-i370.c
bfd/elf32-i386.c
bfd/elf32-msp430.c
bfd/elf64-alpha.c
bfd/elf64-hppa.c
bfd/elf64-sparc.c
bfd/elf64-x86-64.c
bfd/elfcode.h
bfd/elfxx-ia64.c
bfd/elfxx-target.h

index 2dd58edb298ca59d53c34115cb69ef5012d1b691..6813f1770b433cc53b47a492b2df1f40c0c90233 100644 (file)
@@ -1,3 +1,61 @@
+2007-03-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/3826
+       * elf-bfd.h (elf_backend_data): Add elf_osabi.
+       (_bfd_elf_set_osabi): New.
+
+       * elf.c (_bfd_elf_set_osabi): New.
+
+       * elf32-hppa.c (elf32_hppa_post_process_headers): Removed.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi.
+       (ELF_OSABI): Properly defined for each target.
+
+       * elf32-i370.c (i370_elf_post_process_headers): Removed.
+       (ELF_OSABI): Defined.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi.
+
+       * elf32-i386.c (ELF_OSABI): Defined to ELFOSABI_FREEBSD for
+       freebsd.
+       (elf_i386_post_process_headers): Set EI_OSABI with elf_osabi.
+
+       * elf32-msp430.c (elf32_msp430_post_process_headers): Removed.
+       (ELF_OSABI): Defined.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi.
+
+       * elf64-alpha.c (ELF_OSABI): Defined to ELFOSABI_FREEBSD for
+       freebsd.
+       (elf64_alpha_fbsd_post_process_headers): Set EI_OSABI with
+       elf_osabi.
+
+       * elf64-hppa.c (elf64_hppa_post_process_headers): Set EI_OSABI
+       with elf_osabi.
+       (ELF_OSABI): Properly defined for each target.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi for Linux.
+
+       * elf64-sparc.c (elf64_sparc_fbsd_post_process_headers): Removed.
+       (ELF_OSABI): Defined to ELFOSABI_FREEBSD for freebsd.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi.
+
+       * elf64-x86-64.c (elf64_x86_64_fbsd_post_process_headers): Removed.
+       (ELF_OSABI): Defined to ELFOSABI_FREEBSD for freebsd.
+       (elf_backend_post_process_headers): Defined with
+       _bfd_elf_set_osabi.
+
+       * elfcode.h (elf_object_p): Match the ELFOSABI_NONE ELF target
+       with any ELF target of the compatible machine for which we do not
+       have a specific backend.
+
+       * elfxx-ia64.c (elfNN_hpux_post_process_headers): Set EI_OSABI
+       with elf_osabi.
+
+       * elfxx-target.h (ELF_OSABI): Default to ELFOSABI_NONE.
+       (elfNN_bed): Initialize elf_osabi with ELF_OSABI.
+
 2007-03-08  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-v850.c (v850_elf_link_output_symbol_hook): Clean out
index dd7d51d9bd908445df7414d4bd5d95c42aef86e6..4a01fe6ceb6f91127e72332e17451a3cf7593e68 100644 (file)
@@ -550,6 +550,9 @@ struct elf_backend_data
   /* The ELF machine code (EM_xxxx) for this backend.  */
   int elf_machine_code;
 
+  /* EI_OSABI. */
+  int elf_osabi;
+
   /* The maximum page size for this backend.  */
   bfd_vma maxpagesize;
 
@@ -1755,6 +1758,8 @@ extern void bfd_elf_perform_complex_relocation
 extern bfd_boolean _bfd_elf_setup_sections
   (bfd *);
 
+extern void _bfd_elf_set_osabi (bfd * , struct bfd_link_info *);
+
 extern const bfd_target *bfd_elf32_object_p
   (bfd *);
 extern const bfd_target *bfd_elf32_core_file_p
index d8828828d869694e8c3fe2e8bbe15b19c21e583c..05d45e1058c0d47814418575830921595dd4dc42 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9115,3 +9115,14 @@ _bfd_elf_match_sections_by_type (bfd *abfd, const asection *asec,
 
   return elf_section_type (asec) == elf_section_type (bsec);
 }
+
+void
+_bfd_elf_set_osabi (bfd * abfd,
+                   struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
+{
+  Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
+
+  i_ehdrp = elf_elfheader (abfd);
+
+  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
+}
index 117300e5b75e02dc5b8cf6f7bb0de1aee9b45cd6..13c26966488d2039518bb00cfcb4833df2edcb0f 100644 (file)
@@ -4601,30 +4601,6 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
   return TRUE;
 }
 
-/* Tweak the OSABI field of the elf header.  */
-
-static void
-elf32_hppa_post_process_headers (bfd *abfd,
-                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr * i_ehdrp;
-
-  i_ehdrp = elf_elfheader (abfd);
-
-  if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
-    }
-  else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_NETBSD;
-    }
-  else
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
-    }
-}
-
 /* Called when writing out an object file to decide the type of a
    symbol.  */
 static int
@@ -4663,7 +4639,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define elf_backend_grok_psinfo                     elf32_hppa_grok_psinfo
 #define elf_backend_object_p                elf32_hppa_object_p
 #define elf_backend_final_write_processing   elf_hppa_final_write_processing
-#define elf_backend_post_process_headers     elf32_hppa_post_process_headers
+#define elf_backend_post_process_headers     _bfd_elf_set_osabi
 #define elf_backend_get_symbol_type         elf32_hppa_elf_get_symbol_type
 #define elf_backend_reloc_type_class        elf32_hppa_reloc_type_class
 #define elf_backend_action_discarded        elf_hppa_action_discarded
@@ -4682,6 +4658,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define ELF_ARCH               bfd_arch_hppa
 #define ELF_MACHINE_CODE       EM_PARISC
 #define ELF_MAXPAGESIZE                0x1000
+#define ELF_OSABI              ELFOSABI_HPUX
 #define elf32_bed              elf32_hppa_hpux_bed
 
 #include "elf32-target.h"
@@ -4690,6 +4667,8 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define TARGET_BIG_SYM         bfd_elf32_hppa_linux_vec
 #undef TARGET_BIG_NAME
 #define TARGET_BIG_NAME                "elf32-hppa-linux"
+#undef ELF_OSABI
+#define ELF_OSABI              ELFOSABI_LINUX
 #undef elf32_bed
 #define elf32_bed              elf32_hppa_linux_bed
 
@@ -4699,6 +4678,8 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define TARGET_BIG_SYM         bfd_elf32_hppa_nbsd_vec
 #undef TARGET_BIG_NAME
 #define TARGET_BIG_NAME                "elf32-hppa-netbsd"
+#undef ELF_OSABI
+#define ELF_OSABI              ELFOSABI_NETBSD
 #undef elf32_bed
 #define elf32_bed              elf32_hppa_netbsd_bed
 
index 87e2189556e72ccecdeb540f876bd2c960d473de..69393d97fc9efa9840abb269a8145e0d018f71ea 100644 (file)
@@ -1417,16 +1417,6 @@ i370_elf_relocate_section (bfd *output_bfd,
 
   return ret;
 }
-
-static void
-i370_elf_post_process_headers (bfd * abfd,
-                              struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr * i_ehdrp;  /* Elf file header, internal form.  */
-
-  i_ehdrp = elf_elfheader (abfd);
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
-}
 \f
 #define TARGET_BIG_SYM         bfd_elf32_i370_vec
 #define TARGET_BIG_NAME                "elf32-i370"
@@ -1436,6 +1426,8 @@ i370_elf_post_process_headers (bfd * abfd,
 #define ELF_MACHINE_ALT1       EM_I370_OLD
 #endif
 #define ELF_MAXPAGESIZE                0x1000
+#define ELF_OSABI              ELFOSABI_LINUX
+
 #define elf_info_to_howto      i370_elf_info_to_howto
 
 #define elf_backend_plt_not_loaded 1
@@ -1456,7 +1448,7 @@ i370_elf_post_process_headers (bfd * abfd,
 #define elf_backend_section_from_shdr          i370_elf_section_from_shdr
 #define elf_backend_adjust_dynamic_symbol      i370_elf_adjust_dynamic_symbol
 #define elf_backend_check_relocs               i370_elf_check_relocs
-#define elf_backend_post_process_headers       i370_elf_post_process_headers
+#define elf_backend_post_process_headers       _bfd_elf_set_osabi
 
 static int
 i370_noop (void)
index 05fe64097469d14c2c604421d8aab5f60e3d6240..a277f7af639a738d4693d34826596cc05837fd1c 100644 (file)
@@ -3847,6 +3847,8 @@ elf_i386_hash_symbol (struct elf_link_hash_entry *h)
 #define        TARGET_LITTLE_SYM               bfd_elf32_i386_freebsd_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-i386-freebsd"
+#undef ELF_OSABI
+#define        ELF_OSABI                       ELFOSABI_FREEBSD
 
 /* The kernel recognizes executables as valid only if they carry a
    "FreeBSD" label in the ELF header.  So we put this label on all
@@ -3861,7 +3863,7 @@ elf_i386_post_process_headers (bfd *abfd,
   i_ehdrp = elf_elfheader (abfd);
 
   /* Put an ABI label supported by FreeBSD >= 4.1.  */
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
+  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
 #ifdef OLD_FREEBSD_ABI_LABEL
   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
@@ -3881,7 +3883,7 @@ elf_i386_post_process_headers (bfd *abfd,
 #define TARGET_LITTLE_SYM              bfd_elf32_i386_vxworks_vec
 #undef TARGET_LITTLE_NAME
 #define TARGET_LITTLE_NAME             "elf32-i386-vxworks"
-
+#undef ELF_OSABI
 
 /* Like elf_i386_link_hash_table_create but with tweaks for VxWorks.  */
 
index 6889d467d022f26e391c3977613521228717932e..c8124e7862938ad53a7946ba5d9c82d4fa07c782 100644 (file)
@@ -656,21 +656,6 @@ elf32_msp430_object_p (bfd * abfd)
   return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set);
 }
 
-static void
-elf32_msp430_post_process_headers (bfd * abfd,
-                                  struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
-
-  i_ehdrp = elf_elfheader (abfd);
-
-#ifndef ELFOSABI_STANDALONE
-#define ELFOSABI_STANDALONE    255
-#endif
-
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_STANDALONE;
-}
-
 /* These functions handle relaxing for the msp430.
    Relaxation required only in two cases:
     - Bad hand coding like jumps from one section to another or
@@ -1174,6 +1159,7 @@ error_return:
 #define ELF_MACHINE_CODE       EM_MSP430
 #define ELF_MACHINE_ALT1       EM_MSP430_OLD
 #define ELF_MAXPAGESIZE                1
+#define        ELF_OSABI               ELFOSABI_STANDALONE
 
 #define TARGET_LITTLE_SYM       bfd_elf32_msp430_vec
 #define TARGET_LITTLE_NAME     "elf32-msp430"
@@ -1185,7 +1171,7 @@ error_return:
 #define elf_backend_can_gc_sections          1
 #define elf_backend_final_write_processing   bfd_elf_msp430_final_write_processing
 #define elf_backend_object_p                elf32_msp430_object_p
-#define elf_backend_post_process_headers     elf32_msp430_post_process_headers
+#define elf_backend_post_process_headers     _bfd_elf_set_osabi
 #define bfd_elf32_bfd_relax_section         msp430_elf_relax_section
 
 #include "elf32-target.h"
index 126ac64a3da9e0ebda365b0f32edf695b3d1822c..efda7530e5bd99b2362d3a44b3be37f5c19f441d 100644 (file)
@@ -5354,6 +5354,8 @@ static const struct elf_size_info alpha_elf_size_info =
 #define TARGET_LITTLE_SYM      bfd_elf64_alpha_freebsd_vec
 #undef TARGET_LITTLE_NAME
 #define TARGET_LITTLE_NAME     "elf64-alpha-freebsd"
+#undef ELF_OSABI
+#define        ELF_OSABI               ELFOSABI_FREEBSD
 
 /* The kernel recognizes executables as valid only if they carry a
    "FreeBSD" label in the ELF header.  So we put this label on all
@@ -5368,7 +5370,7 @@ elf64_alpha_fbsd_post_process_headers (bfd * abfd,
   i_ehdrp = elf_elfheader (abfd);
 
   /* Put an ABI label supported by FreeBSD >= 4.1.  */
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
+  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
 #ifdef OLD_FREEBSD_ABI_LABEL
   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
index 675b02b897d1fc472e05d3e2025bbeb506f60107..8e7e9d15a452fdb4aba8ad182e0f50a5a4b32e53 100644 (file)
@@ -1198,16 +1198,9 @@ elf64_hppa_post_process_headers (abfd, link_info)
   Elf_Internal_Ehdr * i_ehdrp;
 
   i_ehdrp = elf_elfheader (abfd);
-
-  if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
-    }
-  else
-    {
-      i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
-      i_ehdrp->e_ident[EI_ABIVERSION] = 1;
-    }
+  
+  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
+  i_ehdrp->e_ident[EI_ABIVERSION] = 1;
 }
 
 /* Create function descriptor section (.opd).  This section is called .opd
@@ -2800,6 +2793,8 @@ const struct elf_size_info hppa64_elf_size_info =
 /* This is not strictly correct.  The maximum page size for PA2.0 is
    64M.  But everything still uses 4k.  */
 #define ELF_MAXPAGESIZE                        0x1000
+#define ELF_OSABI                      ELFOSABI_HPUX
+
 #define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
 #define bfd_elf64_bfd_is_local_label_name       elf_hppa_is_local_label_name
 #define elf_info_to_howto              elf_hppa_info_to_howto
@@ -2874,6 +2869,10 @@ const struct elf_size_info hppa64_elf_size_info =
 #define TARGET_BIG_SYM                 bfd_elf64_hppa_linux_vec
 #undef TARGET_BIG_NAME
 #define TARGET_BIG_NAME                        "elf64-hppa-linux"
+#undef ELF_OSABI
+#define ELF_OSABI                      ELFOSABI_LINUX
+#undef elf_backend_post_process_headers
+#define elf_backend_post_process_headers _bfd_elf_set_osabi
 #undef elf64_bed
 #define elf64_bed                      elf64_hppa_linux_bed
 
index 0eefc95c125eb982c9df3420b4bd5fdf32f259c9..f9d4c81709225aec7d455d4c40e9ad094c3e224b 100644 (file)
@@ -910,25 +910,11 @@ const struct elf_size_info elf64_sparc_size_info =
 #define TARGET_BIG_SYM bfd_elf64_sparc_freebsd_vec
 #undef  TARGET_BIG_NAME
 #define TARGET_BIG_NAME "elf64-sparc-freebsd"
-
-/* The kernel recognizes executables as valid only if they carry a
-   "FreeBSD" label in the ELF header.  So we put this label on all
-   executables and (for simplicity) also all other object files.  */
-
-static void
-elf64_sparc_fbsd_post_process_headers (bfd *abfd,
-                                       struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr *i_ehdrp;  /* ELF file header, internal form.  */
-
-  i_ehdrp = elf_elfheader (abfd);
-
-  /* Put an ABI label supported by FreeBSD >= 4.1 */
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
-}
+#undef ELF_OSABI
+#define        ELF_OSABI ELFOSABI_FREEBSD
 
 #undef  elf_backend_post_process_headers
-#define elf_backend_post_process_headers       elf64_sparc_fbsd_post_process_headers
+#define elf_backend_post_process_headers       _bfd_elf_set_osabi
 #undef  elf64_bed
 #define elf64_bed                              elf64_sparc_fbsd_bed
 
index 7e959b12d1353cd14979f6500e79c95c22894129..eec8441c111fee517da53be854f1fb7863b587f8 100644 (file)
@@ -3713,24 +3713,11 @@ static const struct bfd_elf_special_section
 #undef  TARGET_LITTLE_NAME
 #define TARGET_LITTLE_NAME                 "elf64-x86-64-freebsd"
 
-/* The kernel recognizes executables as valid only if they carry a
-   "FreeBSD" label in the ELF header.  So we put this label on all
-   executables and (for simplicity) also all other object files.  */
-
-static void
-elf64_x86_64_fbsd_post_process_headers (bfd * abfd,
-                                       struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
-{
-  Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form.  */
-
-  i_ehdrp = elf_elfheader (abfd);
-
-  /* Put an ABI label supported by FreeBSD >= 4.1.  */
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
-}
+#undef ELF_OSABI
+#define        ELF_OSABI                           ELFOSABI_FREEBSD
 
 #undef  elf_backend_post_process_headers
-#define elf_backend_post_process_headers  elf64_x86_64_fbsd_post_process_headers
+#define elf_backend_post_process_headers  _bfd_elf_set_osabi
 
 #undef  elf64_bed
 #define elf64_bed elf64_x86_64_fbsd_bed
index 04c2d914b019923b6feb23bb28069d55f07bedf4..3c295502df70658a40202fdbedc53f515dfa0ae0 100644 (file)
@@ -500,6 +500,8 @@ elf_object_p (bfd *abfd)
   struct bfd_preserve preserve;
   asection *s;
   bfd_size_type amt;
+  const bfd_target *target;
+  const bfd_target * const *target_ptr;
 
   preserve.marker = NULL;
 
@@ -543,10 +545,12 @@ elf_object_p (bfd *abfd)
   if (!bfd_preserve_save (abfd, &preserve))
     goto got_no_match;
 
+  target = abfd->xvec;
+
   /* Allocate an instance of the elf_obj_tdata structure and hook it up to
      the tdata pointer in the bfd.  */
 
-  if (! (*abfd->xvec->_bfd_set_format[bfd_object]) (abfd))
+  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
     goto got_no_match;
   preserve.marker = elf_tdata (abfd);
 
@@ -586,8 +590,6 @@ elf_object_p (bfd *abfd)
       && (ebd->elf_machine_alt2 == 0
          || i_ehdrp->e_machine != ebd->elf_machine_alt2))
     {
-      const bfd_target * const *target_ptr;
-
       if (ebd->elf_machine_code != EM_NONE)
        goto got_wrong_format_error;
 
@@ -628,6 +630,45 @@ elf_object_p (bfd *abfd)
        goto got_no_match;
     }
 
+  if (ebd->elf_machine_code != EM_NONE
+      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
+    {
+      if (ebd->elf_osabi != ELFOSABI_NONE)
+       goto got_wrong_format_error;
+
+      /* This is an ELFOSABI_NONE ELF target.  Let it match any ELF
+        target of the compatible machine for which we do not have a
+        backend with matching ELFOSABI.  */
+      for (target_ptr = bfd_target_vector;
+          *target_ptr != NULL;
+          target_ptr++)
+       {
+         const struct elf_backend_data *back;
+
+         /* Skip this target and targets with incompatible byte
+            order.  */
+         if (*target_ptr == target
+             || (*target_ptr)->flavour != bfd_target_elf_flavour
+             || (*target_ptr)->byteorder != target->byteorder
+             || ((*target_ptr)->header_byteorder
+                 != target->header_byteorder))
+           continue;
+
+         back = (const struct elf_backend_data *) (*target_ptr)->backend_data;
+         if (back->elf_osabi == i_ehdrp->e_ident[EI_OSABI]
+             && (back->elf_machine_code == i_ehdrp->e_machine
+                 || (back->elf_machine_alt1 != 0
+                     && back->elf_machine_alt1 == i_ehdrp->e_machine)
+                 || (back->elf_machine_alt2 != 0
+                     && back->elf_machine_alt2 == i_ehdrp->e_machine)))
+           {
+             /* target_ptr is an ELF backend which matches this
+                object file, so reject the ELFOSABI_NONE ELF target.  */
+             goto got_wrong_format_error;
+           }
+       }
+    }
+
   if (i_ehdrp->e_shoff != 0)
     {
       bfd_signed_vma where = i_ehdrp->e_shoff;
@@ -848,7 +889,7 @@ elf_object_p (bfd *abfd)
     }
 
   bfd_preserve_finish (abfd, &preserve);
-  return abfd->xvec;
+  return target;
 
  got_wrong_format_error:
   /* There is way too much undoing of half-known state here.  The caller,
index 7975401cd11e1cd2b1676699a0be1884188b0cc5..a0a1b1c0ee117564e89b0fa60db5240719792270 100644 (file)
@@ -5681,7 +5681,7 @@ elfNN_hpux_post_process_headers (abfd, info)
 {
   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
 
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
+  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
   i_ehdrp->e_ident[EI_ABIVERSION] = 1;
 }
 
@@ -5838,6 +5838,8 @@ elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
 #undef  ELF_MAXPAGESIZE
 #define ELF_MAXPAGESIZE                 0x1000  /* 4K */
 #undef ELF_COMMONPAGESIZE
+#undef ELF_OSABI
+#define ELF_OSABI                      ELFOSABI_HPUX
 
 #undef  elfNN_bed
 #define elfNN_bed elfNN_ia64_hpux_bed
index 661584115b7c2df4ada79caf077a5aa86e64a2fe..ea21b625120ab0db0f63666db82e333cb89ac85f 100644 (file)
 #define elf_info_to_howto_rel 0
 #endif
 
+#ifndef ELF_OSABI
+#define ELF_OSABI ELFOSABI_NONE
+#endif
+
 #ifndef ELF_MAXPAGESIZE
   #error ELF_MAXPAGESIZE is not defined
 #define ELF_MAXPAGESIZE 1
@@ -589,6 +593,7 @@ static struct elf_backend_data elfNN_bed =
 {
   ELF_ARCH,                    /* arch */
   ELF_MACHINE_CODE,            /* elf_machine_code */
+  ELF_OSABI,                   /* elf_osabi  */
   ELF_MAXPAGESIZE,             /* maxpagesize */
   ELF_MINPAGESIZE,             /* minpagesize */
   ELF_COMMONPAGESIZE,          /* commonpagesize */