This is the mail archive of the binutils@sourceware.cygnus.com 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]

Re: [patch] binary file endianness


Geoff Keating wrote:
> > > Shouldn't it instead check to see whether the endianness is unknown?
> > >
> > > You still don't want to be linking a little-endian COFF with a
> > > big-endian ELF, I think.
> >
> > Indeed. Here's the revised patch.
> >
> > How about removing the inline checks for endianness
> > and calling _bfd_generic_verify_endian_match() instead ?
> 
> Yes, please do this.  Having repeated chunks of code is bad.
> 
> Also, could I ask you to fix the localisation problem in
> _bfd_generic_verify_endian_match?  It should look like the version in
> elf32-ppc.h, where each string is separate.  The reason for this is
> that in some languages, it may be necessary to change more than one
> place in the string to change between 'big' and 'little'.

Done.

Regards,
-velco
2000-05-22  Momchil Velikov  <velco@fadata.bg>

	* libbfd.c (_bfd_generic_verify_endian_match): Compare endianess
        only if it is known for both input and output bfds. Separate
	error message strings as in some languages, it may be necessary
	to change more than one place in the string to change between
	'big' and 'little'. 

	* elf32-ppc.c (ppc_elf_merge_private_bfd_data): Remove inline
	endianess checks, call _bfd_generic_verify_endian_match() instead.  
	
	* elf32-mips.c (_bfd_mips_elf_merge_private_bfd_data): Likewise.  

	* elf32-mcore.c (mcore_elf_merge_private_bfd_data): Likewise.  

	* elf32-arm.h (elf32_arm_merge_private_bfd_data): Likewise. Verify
	endianess before checking bfd flavours.  


--- elf32-arm.h.orig	Sun May 21 12:16:54 2000
+++ elf32-arm.h	Sun May 21 23:39:23 2000
@@ -2007,24 +2007,13 @@
   flagword out_flags;
   flagword in_flags;
 
+  /* Check if we have the same endianess */
+  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+    return false;
+
   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return true;
-
-  /* Check if we have the same endianess */
-  if (   ibfd->xvec->byteorder != obfd->xvec->byteorder
-      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
-      && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
-    {
-      (*_bfd_error_handler)
-	(_("%s: compiled for a %s endian system and target is %s endian"),
-	 bfd_get_filename (ibfd),
-	 bfd_big_endian (ibfd) ? "big" : "little",
-	 bfd_big_endian (obfd) ? "big" : "little");
-
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
 
   /* The input BFD must have had its flags initialised.  */
   /* The following seems bogus to me -- The flags are initialized in
--- elf32-mcore.c.orig	Sun May 21 12:18:01 2000
+++ elf32-mcore.c	Sun May 21 23:40:08 2000
@@ -322,18 +322,8 @@
   flagword new_flags;
 
   /* Check if we have the same endianess */
-  if (   ibfd->xvec->byteorder != obfd->xvec->byteorder
-      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
-    {
-      (*_bfd_error_handler)
-	(_("%s: compiled for a %s endian system and target is %s endian.\n"),
-	 bfd_get_filename (ibfd),
-         bfd_big_endian (ibfd) ? "big" : "little",
-         bfd_big_endian (obfd) ? "big" : "little");
-
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
+  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+    return false;
 
   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
--- elf32-mips.c.orig	Sun May 21 12:19:08 2000
+++ elf32-mips.c	Sun May 21 23:40:45 2000
@@ -2460,21 +2460,8 @@
   boolean ok;
 
   /* Check if we have the same endianess */
-  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
-      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
-    {
-      const char *msg;
-
-      if (bfd_big_endian (ibfd))
-	msg = _("%s: compiled for a big endian system and target is little endian");
-      else
-	msg = _("%s: compiled for a little endian system and target is big endian");
-
-      (*_bfd_error_handler) (msg, bfd_get_filename (ibfd));
-
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
+  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+    return false;
 
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
--- elf32-ppc.c.orig	Sun May 21 23:48:29 2000
+++ elf32-ppc.c	Sun May 21 23:49:14 2000
@@ -1399,21 +1399,8 @@
   boolean error;
 
   /* Check if we have the same endianess */
-  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
-      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
-    {
-      const char *msg;
-
-      if (bfd_big_endian (ibfd))
-	msg = _("%s: compiled for a big endian system and target is little endian");
-      else
-	msg = _("%s: compiled for a little endian system and target is big endian");
-
-      (*_bfd_error_handler) (msg, bfd_get_filename (ibfd));
-
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
+  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
+    return false;
 
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
--- libbfd.c.orig	Sun May 21 12:21:55 2000
+++ libbfd.c	Sun May 21 23:34:59 2000
@@ -1306,13 +1306,17 @@
      bfd *obfd;
 {
   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
+      && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
     {
-      (*_bfd_error_handler)
-	("%s: compiled for a %s endian system and target is %s endian",
-	 bfd_get_filename (ibfd),
-	 bfd_big_endian (ibfd) ? "big" : "little",
-	 bfd_big_endian (obfd) ? "big" : "little");
+      const char *msg;
+
+      if (bfd_big_endian (ibfd))
+	msg = _("%s: compiled for a big endian system and target is little endian");
+      else
+	msg = _("%s: compiled for a little endian system and target is big endian");
+
+      (*_bfd_error_handler) (msg, bfd_get_filename (ibfd));
 
       bfd_set_error (bfd_error_wrong_format);
       return false;

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