Not linking 32-bit and 64-bit objects

Andreas Jaeger aj@suse.de
Tue Mar 12 04:20:00 GMT 2002


Alan Modra <amodra@bigpond.net.au> writes:

> On Tue, Mar 12, 2002 at 12:05:47PM +0100, Andreas Jaeger wrote:
>> 
>> If I try to link a 32-bit i386 object as 64-bit x86-64 object, it
>> should fail but I'd like to see a better error message.
>
> I think you're probably better off writing a replacement for
> bfd_default_compatible in bfd/cpu-i386.c

Thanks for the hint!

Now I get this:
gee:~/tmp:[1]$ /opt/x86-64/bin/x86_64-unknown-linux-gcc k.o 
/opt/x86-64/lib/gcc-lib/x86_64-unknown-linux/3.1/../../../../x86_64-unknown-linux/bin/ld: skipping incompatible /opt/x86-64/lib/gcc-lib/x86_64-unknown-linux/3.1/libgcc.a when searching for -lgcc
/opt/x86-64/lib/gcc-lib/x86_64-unknown-linux/3.1/../../../../x86_64-unknown-linux/bin/ld: cannot find -lgcc
collect2: ld returned 1 exit status

And I'm happy with it ;-)

Ok to commit?
Andreas

2002-03-12  Andreas Jaeger  <aj@suse.de>

	* cpu-i386.c (i386_compatible): New.  Use it instead of
	bfd_default_compatible.

Index: bfd/cpu-i386.c
===================================================================
RCS file: /cvs/src/src/bfd/cpu-i386.c,v
retrieving revision 1.6
diff -u -p -r1.6 cpu-i386.c
--- cpu-i386.c	2001/11/14 12:01:58	1.6
+++ cpu-i386.c	2002/03/12 12:19:56
@@ -1,5 +1,5 @@
 /* BFD support for the Intel 386 architecture.
-   Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001
+   Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -22,6 +22,22 @@ Foundation, Inc., 59 Temple Place - Suit
 #include "sysdep.h"
 #include "libbfd.h"
 
+/* Don't mix 32 bit and 64 bit files.  */
+
+static const bfd_arch_info_type *i386_compatible
+  PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
+
+static const bfd_arch_info_type *
+i386_compatible (a, b)
+     const bfd_arch_info_type *a;
+     const bfd_arch_info_type *b;
+{
+  if (a->bits_per_word != b->bits_per_word)
+    return NULL;
+
+  return bfd_default_compatible (a, b);
+}
+  
 const bfd_arch_info_type bfd_i386_arch_intel_syntax =
 {
   32,	/* 32 bits in a word */
@@ -33,7 +49,7 @@ const bfd_arch_info_type bfd_i386_arch_i
   "i386:intel",
   3,
   true,
-  bfd_default_compatible,
+  i386_compatible,
   bfd_default_scan ,
   0,
 };
@@ -48,7 +64,7 @@ const bfd_arch_info_type bfd_x86_64_arch
   "x86-64:intel",
   3,
   true,
-  bfd_default_compatible,
+  i386_compatible,
   bfd_default_scan ,
   &bfd_i386_arch_intel_syntax,
 };
@@ -63,7 +79,7 @@ static const bfd_arch_info_type i8086_ar
   "i8086",
   3,
   false,
-  bfd_default_compatible,
+  i386_compatible,
   bfd_default_scan ,
   &bfd_x86_64_arch_intel_syntax,
 };
@@ -79,7 +95,7 @@ const bfd_arch_info_type bfd_x86_64_arch
   "x86-64",
   3,
   true,
-  bfd_default_compatible,
+  i386_compatible,
   bfd_default_scan ,
   &i8086_arch,
 };
@@ -95,7 +111,7 @@ const bfd_arch_info_type bfd_i386_arch =
   "i386",
   3,
   true,
-  bfd_default_compatible,
+  i386_compatible,
   bfd_default_scan ,
   &bfd_x86_64_arch
 };

-- 
 Andreas Jaeger
  SuSE Labs aj@suse.de
   private aj@arthur.inka.de
    http://www.suse.de/~aj



More information about the Binutils mailing list