This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR binutils/3826: elf_object_p can't tell freebsd object file from standard ELF object file


On Thu, Jan 04, 2007 at 07:31:32AM -0800, H. J. Lu wrote:
> The problem is elf_object_p doesn't check EI_OSABI. This patch
> implements EI_OSABI checking for i386, x86-64 and ia64. I can add it
> to other arches.
> 

Here is the updated patch for all arches.


H.J.
----
2076-01-04  H.J. Lu  <hongjiu.lu@intel.com>

	PR binutils/3826
	* elf-bfd.h (elf_backend_data): Add elf_osabi.
	(_bfd_elf_set_osabi): New.
	(_bfd_elf_check_osabi): Likewise.

	* elf.c (_bfd_elf_set_osabi): New.
	(_bfd_elf_check_osabi): Likewise.

	* 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
	freebfd.
	(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
	freebfd.
	(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.

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

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

--- bfd/elf-bfd.h.osabi	2007-01-04 10:49:54.000000000 -0800
+++ bfd/elf-bfd.h	2007-01-04 11:12:44.000000000 -0800
@@ -546,6 +546,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;
 
@@ -1731,6 +1734,10 @@ extern bfd_boolean bfd_elf_match_symbols
 extern bfd_boolean _bfd_elf_setup_sections
   (bfd *);
 
+extern void _bfd_elf_set_osabi (bfd * , struct bfd_link_info *);
+
+extern bfd_boolean _bfd_elf_check_osabi (bfd *);
+
 extern const bfd_target *bfd_elf32_object_p
   (bfd *);
 extern const bfd_target *bfd_elf32_core_file_p
--- bfd/elf.c.osabi	2007-01-04 10:49:54.000000000 -0800
+++ bfd/elf.c	2007-01-04 11:17:58.000000000 -0800
@@ -9008,3 +9008,25 @@ _bfd_elf_match_sections_by_type (bfd *ab
 
   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;
+}
+
+bfd_boolean
+_bfd_elf_check_osabi (bfd *abfd)
+{
+  Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
+
+  i_ehdrp = elf_elfheader (abfd);
+
+  return (i_ehdrp->e_ident[EI_OSABI]
+	  == get_elf_backend_data (abfd)->elf_osabi);
+}
--- bfd/elf32-hppa.c.osabi	2006-11-02 16:58:09.000000000 -0800
+++ bfd/elf32-hppa.c	2007-01-04 11:24:26.000000000 -0800
@@ -4598,30 +4598,6 @@ elf32_hppa_finish_dynamic_sections (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
@@ -4660,7 +4636,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Inte
 #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
@@ -4679,6 +4655,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Inte
 #define ELF_ARCH		bfd_arch_hppa
 #define ELF_MACHINE_CODE	EM_PARISC
 #define ELF_MAXPAGESIZE		0x1000
+#define ELF_OSABI		ELFOSABI_HPUX
 
 #include "elf32-target.h"
 
@@ -4686,6 +4663,8 @@ elf32_hppa_elf_get_symbol_type (Elf_Inte
 #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
 
 #define INCLUDED_TARGET_FILE 1
 #include "elf32-target.h"
@@ -4694,5 +4673,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Inte
 #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
 
 #include "elf32-target.h"
--- bfd/elf32-i370.c.osabi	2006-10-17 06:41:47.000000000 -0700
+++ bfd/elf32-i370.c	2007-01-04 11:25:41.000000000 -0800
@@ -1406,16 +1406,6 @@ i370_elf_relocate_section (bfd *output_b
 
   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;
-}
 
 #define TARGET_BIG_SYM		bfd_elf32_i370_vec
 #define TARGET_BIG_NAME		"elf32-i370"
@@ -1425,6 +1415,8 @@ i370_elf_post_process_headers (bfd * abf
 #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
@@ -1445,7 +1437,7 @@ i370_elf_post_process_headers (bfd * abf
 #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)
--- bfd/elf32-i386.c.osabi	2006-11-02 16:58:09.000000000 -0800
+++ bfd/elf32-i386.c	2007-01-04 11:24:52.000000000 -0800
@@ -3880,6 +3880,8 @@ elf_i386_hash_symbol (struct elf_link_ha
 #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
@@ -3894,7 +3896,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);
@@ -3914,7 +3916,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.  */
 
--- bfd/elf32-msp430.c.osabi	2006-09-28 06:27:33.000000000 -0700
+++ bfd/elf32-msp430.c	2007-01-04 11:22:54.000000000 -0800
@@ -644,21 +644,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
@@ -1162,6 +1147,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"
@@ -1173,7 +1159,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"
--- bfd/elf64-alpha.c.osabi	2006-12-06 11:57:11.000000000 -0800
+++ bfd/elf64-alpha.c	2007-01-04 11:27:14.000000000 -0800
@@ -5326,6 +5326,8 @@ static const struct elf_size_info alpha_
 #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
@@ -5340,7 +5342,7 @@ elf64_alpha_fbsd_post_process_headers (b
   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);
--- bfd/elf64-hppa.c.osabi	2006-10-17 06:41:47.000000000 -0700
+++ bfd/elf64-hppa.c	2007-01-04 11:30:52.000000000 -0800
@@ -1198,16 +1198,9 @@ elf64_hppa_post_process_headers (abfd, l
   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_si
 /* 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
@@ -2872,6 +2867,11 @@ const struct elf_size_info hppa64_elf_si
 #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
 
 #define INCLUDED_TARGET_FILE 1
 #include "elf64-target.h"
--- bfd/elf64-sparc.c.osabi	2006-10-18 16:58:51.000000000 -0700
+++ bfd/elf64-sparc.c	2007-01-04 11:31:41.000000000 -0800
@@ -910,25 +910,11 @@ const struct elf_size_info elf64_sparc_s
 #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
 
--- bfd/elf64-x86-64.c.osabi	2006-11-02 16:58:09.000000000 -0800
+++ bfd/elf64-x86-64.c	2007-01-04 11:25:19.000000000 -0800
@@ -3710,24 +3710,11 @@ static const struct bfd_elf_special_sect
 #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
--- bfd/elfxx-ia64.c.osabi	2006-11-02 16:58:10.000000000 -0800
+++ bfd/elfxx-ia64.c	2007-01-04 11:25:03.000000000 -0800
@@ -5680,7 +5680,7 @@ elfNN_hpux_post_process_headers (abfd, i
 {
   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;
 }
 
@@ -5837,6 +5837,8 @@ elfNN_hpux_backend_symbol_processing (bf
 #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
--- bfd/elfxx-target.h.osabi	2006-12-25 08:47:53.000000000 -0800
+++ bfd/elfxx-target.h	2007-01-04 11:12:54.000000000 -0800
@@ -285,6 +285,10 @@
 #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
@@ -316,7 +320,7 @@
 #define elf_backend_sym_is_global	0
 #endif
 #ifndef elf_backend_object_p
-#define elf_backend_object_p		0
+#define elf_backend_object_p		_bfd_elf_check_osabi
 #endif
 #ifndef elf_backend_symbol_processing
 #define elf_backend_symbol_processing	0
@@ -581,6 +585,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 */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]