This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
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;