Don't allow mixing x64_32 with x86_64.
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Jan 2011 18:16:46 +0000 (18:16 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Jan 2011 18:16:46 +0000 (18:16 +0000)
bfd/

2011-01-03  H.J. Lu  <hongjiu.lu@intel.com>

* cpu-i386.c (bfd_i386_compatible): New.
(bfd_x64_32_arch_intel_syntax): Replace bfd_default_compatible
with bfd_i386_compatible.
(bfd_x86_64_arch_intel_syntax): Likewise.
(bfd_i386_arch_intel_syntax): Likewise.
(i8086_arch): Likewise.
(bfd_x64_32_arch): Likewise.
(bfd_x86_64_arch): Likewise.
(bfd_i386_arch): Likewise.

ld/testsuite/

2011-01-03  H.J. Lu  <hongjiu.lu@intel.com>

* ld-x86-64/dummy.s: New.
* ld-x86-64/foo.s: Likewise.
* ld-x86-64/ia32-1.d: Likewise.
* ld-x86-64/ia32-2.d: Likewise.
* ld-x86-64/ia32-3.d: Likewise.
* ld-x86-64/ilp32-1.d: Likewise.
* ld-x86-64/ilp32-2.d: Likewise.
* ld-x86-64/ilp32-3.d: Likewise.
* ld-x86-64/lp64-1.d: Likewise.
* ld-x86-64/lp64-2.d: Likewise.
* ld-x86-64/lp64-3.d: Likewise.
* ld-x86-64/start.s: Likewise.

* ld-x86-64/x86-64.exp: Run ilp32-1, ilp32-2, ilp32-3, ia32-1,
ia32-2, ia32-3, lp64-1, lp64-2 and lp64-3.

16 files changed:
bfd/ChangeLog
bfd/cpu-i386.c
ld/testsuite/ChangeLog
ld/testsuite/ld-x86-64/dummy.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/foo.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/ia32-1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ia32-2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ia32-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/ilp32-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/lp64-1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/lp64-2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/lp64-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/start.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index db99369c5bb53f4aea7693e9c7434c39e43b0188..0369051236b8c1b2c81f5f4d4c9ea82c5210a63e 100644 (file)
@@ -1,3 +1,15 @@
+2011-01-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * cpu-i386.c (bfd_i386_compatible): New.
+       (bfd_x64_32_arch_intel_syntax): Replace bfd_default_compatible
+       with bfd_i386_compatible.
+       (bfd_x86_64_arch_intel_syntax): Likewise.
+       (bfd_i386_arch_intel_syntax): Likewise.
+       (i8086_arch): Likewise.
+       (bfd_x64_32_arch): Likewise.
+       (bfd_x86_64_arch): Likewise.
+       (bfd_i386_arch): Likewise.
+
 For older changes see ChangeLog-2010
 \f
 Local Variables:
 For older changes see ChangeLog-2010
 \f
 Local Variables:
index f679a183ebac1110be1b3d22a08e692d6ef08eb7..c4f41c50c2c7ee18c3e723a0b0375d0a55f5f997 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD support for the Intel 386 architecture.
    Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002, 2004, 2005,
 /* BFD support for the Intel 386 architecture.
    Copyright 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002, 2004, 2005,
-   2007, 2009
+   2007, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 #include "bfd.h"
 #include "libbfd.h"
 
 #include "bfd.h"
 #include "libbfd.h"
 
+static const bfd_arch_info_type *
+bfd_i386_compatible (const bfd_arch_info_type *a,
+                    const bfd_arch_info_type *b)
+{
+  const bfd_arch_info_type *compat = bfd_default_compatible (a, b);
+
+  /* Don't allow mixing x64_32 with x86_64.  */
+  if (compat && a->bits_per_address != b->bits_per_address)
+    compat = NULL;
+
+  return compat;
+}
+
 static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax =
 {
   64, /* 64 bits in a word */
 static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax =
 {
   64, /* 64 bits in a word */
@@ -35,7 +48,7 @@ static const bfd_arch_info_type bfd_x64_32_arch_intel_syntax =
   "i386:x64-32:intel",
   3,
   FALSE,
   "i386:x64-32:intel",
   3,
   FALSE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   0
 };
   bfd_default_scan,
   0
 };
@@ -51,7 +64,7 @@ static const bfd_arch_info_type bfd_x86_64_arch_intel_syntax =
   "i386:x86-64:intel",
   3,
   FALSE,
   "i386:x86-64:intel",
   3,
   FALSE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &bfd_x64_32_arch_intel_syntax,
 };
   bfd_default_scan,
   &bfd_x64_32_arch_intel_syntax,
 };
@@ -67,7 +80,7 @@ static const bfd_arch_info_type bfd_i386_arch_intel_syntax =
   "i386:intel",
   3,
   TRUE,
   "i386:intel",
   3,
   TRUE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &bfd_x86_64_arch_intel_syntax
 };
   bfd_default_scan,
   &bfd_x86_64_arch_intel_syntax
 };
@@ -83,7 +96,7 @@ static const bfd_arch_info_type i8086_arch =
   "i8086",
   3,
   FALSE,
   "i8086",
   3,
   FALSE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &bfd_i386_arch_intel_syntax
 };
   bfd_default_scan,
   &bfd_i386_arch_intel_syntax
 };
@@ -99,7 +112,7 @@ static const bfd_arch_info_type bfd_x64_32_arch =
   "i386:x64-32",
   3,
   FALSE,
   "i386:x64-32",
   3,
   FALSE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &i8086_arch
 };
   bfd_default_scan,
   &i8086_arch
 };
@@ -115,7 +128,7 @@ static const bfd_arch_info_type bfd_x86_64_arch =
   "i386:x86-64",
   3,
   FALSE,
   "i386:x86-64",
   3,
   FALSE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &bfd_x64_32_arch
 };
   bfd_default_scan,
   &bfd_x64_32_arch
 };
@@ -131,7 +144,7 @@ const bfd_arch_info_type bfd_i386_arch =
   "i386",
   3,
   TRUE,
   "i386",
   3,
   TRUE,
-  bfd_default_compatible,
+  bfd_i386_compatible,
   bfd_default_scan,
   &bfd_x86_64_arch
 };
   bfd_default_scan,
   &bfd_x86_64_arch
 };
index 27571ba7efaf697fee36c085f2161b6f84740abb..0b2308280dce13b08cd611d2a93c452a455721a3 100644 (file)
@@ -1,3 +1,21 @@
+2011-01-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * ld-x86-64/dummy.s: New.
+       * ld-x86-64/foo.s: Likewise.
+       * ld-x86-64/ia32-1.d: Likewise.
+       * ld-x86-64/ia32-2.d: Likewise.
+       * ld-x86-64/ia32-3.d: Likewise.
+       * ld-x86-64/ilp32-1.d: Likewise.
+       * ld-x86-64/ilp32-2.d: Likewise.
+       * ld-x86-64/ilp32-3.d: Likewise.
+       * ld-x86-64/lp64-1.d: Likewise.
+       * ld-x86-64/lp64-2.d: Likewise.
+       * ld-x86-64/lp64-3.d: Likewise.
+       * ld-x86-64/start.s: Likewise.
+
+       * ld-x86-64/x86-64.exp: Run ilp32-1, ilp32-2, ilp32-3, ia32-1,
+       ia32-2, ia32-3, lp64-1, lp64-2 and lp64-3.
+
 2011-01-02  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/12001
 2011-01-02  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/12001
diff --git a/ld/testsuite/ld-x86-64/dummy.s b/ld/testsuite/ld-x86-64/dummy.s
new file mode 100644 (file)
index 0000000..403f980
--- /dev/null
@@ -0,0 +1 @@
+# Dummy
diff --git a/ld/testsuite/ld-x86-64/foo.s b/ld/testsuite/ld-x86-64/foo.s
new file mode 100644 (file)
index 0000000..461bfa4
--- /dev/null
@@ -0,0 +1,3 @@
+       .globl foo
+foo:
+       mov %eax, %ebx
diff --git a/ld/testsuite/ld-x86-64/ia32-1.d b/ld/testsuite/ld-x86-64/ia32-1.d
new file mode 100644 (file)
index 0000000..068c0d9
--- /dev/null
@@ -0,0 +1,16 @@
+#source: dummy.s
+#as: --32
+#ld: -m elf_i386 tmpdir/start32.o tmpdir/foo32.o
+#readelf: -h
+
+ELF Header:
+  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
+  Class:                             ELF32
+  Data:                              2's complement, little endian
+  Version:                           1 \(current\)
+  OS/ABI:                            UNIX - System V
+  ABI Version:                       0
+  Type:                              EXEC \(Executable file\)
+  Machine:                           Intel 80386
+  Version:                           0x1
+#pass
diff --git a/ld/testsuite/ld-x86-64/ia32-2.d b/ld/testsuite/ld-x86-64/ia32-2.d
new file mode 100644 (file)
index 0000000..e770567
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --32
+#ld: -m elf_i386 tmpdir/start32.o tmpdir/foon32.o
+#error: .*i386:x64-32 architecture of input file `tmpdir/foon32.o' is incompatible with i386 output
diff --git a/ld/testsuite/ld-x86-64/ia32-3.d b/ld/testsuite/ld-x86-64/ia32-3.d
new file mode 100644 (file)
index 0000000..1528399
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --32
+#ld: -m elf_i386 tmpdir/start32.o tmpdir/foo64.o
+#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386 output
diff --git a/ld/testsuite/ld-x86-64/ilp32-1.d b/ld/testsuite/ld-x86-64/ilp32-1.d
new file mode 100644 (file)
index 0000000..394d051
--- /dev/null
@@ -0,0 +1,16 @@
+#source: dummy.s
+#as: --n32
+#ld: -m elf32_x86_64 tmpdir/startn32.o tmpdir/foon32.o
+#readelf: -h
+
+ELF Header:
+  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
+  Class:                             ELF32
+  Data:                              2's complement, little endian
+  Version:                           1 \(current\)
+  OS/ABI:                            UNIX - System V
+  ABI Version:                       0
+  Type:                              EXEC \(Executable file\)
+  Machine:                           Advanced Micro Devices X86-64
+  Version:                           0x1
+#pass
diff --git a/ld/testsuite/ld-x86-64/ilp32-2.d b/ld/testsuite/ld-x86-64/ilp32-2.d
new file mode 100644 (file)
index 0000000..405d509
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --n32
+#ld: -m elf32_x86_64 tmpdir/startn32.o tmpdir/foo32.o
+#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x64-32 output
diff --git a/ld/testsuite/ld-x86-64/ilp32-3.d b/ld/testsuite/ld-x86-64/ilp32-3.d
new file mode 100644 (file)
index 0000000..d611181
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --n32
+#ld: -m elf32_x86_64 tmpdir/startn32.o tmpdir/foo64.o
+#error: .*i386:x86-64 architecture of input file `tmpdir/foo64.o' is incompatible with i386:x64-32 output
diff --git a/ld/testsuite/ld-x86-64/lp64-1.d b/ld/testsuite/ld-x86-64/lp64-1.d
new file mode 100644 (file)
index 0000000..d78d407
--- /dev/null
@@ -0,0 +1,16 @@
+#source: dummy.s
+#as: --64
+#ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foo64.o
+#readelf: -h
+
+ELF Header:
+  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
+  Class:                             ELF64
+  Data:                              2's complement, little endian
+  Version:                           1 \(current\)
+  OS/ABI:                            UNIX - System V
+  ABI Version:                       0
+  Type:                              EXEC \(Executable file\)
+  Machine:                           Advanced Micro Devices X86-64
+  Version:                           0x1
+#pass
diff --git a/ld/testsuite/ld-x86-64/lp64-2.d b/ld/testsuite/ld-x86-64/lp64-2.d
new file mode 100644 (file)
index 0000000..fde3202
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --64
+#ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foo32.o
+#error: .*i386 architecture of input file `tmpdir/foo32.o' is incompatible with i386:x86-64 output
diff --git a/ld/testsuite/ld-x86-64/lp64-3.d b/ld/testsuite/ld-x86-64/lp64-3.d
new file mode 100644 (file)
index 0000000..a940952
--- /dev/null
@@ -0,0 +1,4 @@
+#source: dummy.s
+#as: --64
+#ld: -m elf_x86_64 tmpdir/start64.o tmpdir/foon32.o
+#error: .*i386:x64-32 architecture of input file `tmpdir/foon32.o' is incompatible with i386:x86-64 output
diff --git a/ld/testsuite/ld-x86-64/start.s b/ld/testsuite/ld-x86-64/start.s
new file mode 100644 (file)
index 0000000..80301c6
--- /dev/null
@@ -0,0 +1,3 @@
+       .globl _start
+_start:
+       jmp foo
index 12f5cad635dfb3772f36340bc2a9494ecce5f814..8e83ca804598bc3dccb0e3f3addf2afdb13212e9 100644 (file)
@@ -1,5 +1,6 @@
 # Expect script for ld-x86_64 tests
 # Expect script for ld-x86_64 tests
-#   Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009 Free Software Foundation
+#   Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+#   Free Software Foundation
 #
 # This file is part of the GNU Binutils.
 #
 #
 # This file is part of the GNU Binutils.
 #
@@ -140,4 +141,43 @@ if { ![istarget "x86_64-*-linux*"] } {
     return
 }
 
     return
 }
 
+if ![ld_assemble $as "--n32 $srcdir/$subdir/start.s" tmpdir/startn32.o] { 
+    unresolved "Build ILP32 start.o"
+    return
+}
+
+if ![ld_assemble $as "--32 $srcdir/$subdir/start.s" tmpdir/start32.o] { 
+    unresolved "Build ia32 start.o"
+    return
+}
+
+if ![ld_assemble $as "--64 $srcdir/$subdir/start.s" tmpdir/start64.o] { 
+    unresolved "Build LP64 start.o"
+    return
+}
+
+if ![ld_assemble $as "--n32 $srcdir/$subdir/foo.s" tmpdir/foon32.o] { 
+    unresolved "Build ILP32 foo.o"
+    return
+}
+
+if ![ld_assemble $as "--32 $srcdir/$subdir/foo.s" tmpdir/foo32.o] { 
+    unresolved "Build ia32 foo.o"
+    return
+}
+
+if ![ld_assemble $as "--64 $srcdir/$subdir/foo.s" tmpdir/foo64.o] { 
+    unresolved "Build LP64 foo.o"
+    return
+}
+
 run_dump_test "compressed1"
 run_dump_test "compressed1"
+run_dump_test "ilp32-1"
+run_dump_test "ilp32-2"
+run_dump_test "ilp32-3"
+run_dump_test "ia32-1"
+run_dump_test "ia32-2"
+run_dump_test "ia32-3"
+run_dump_test "lp64-1"
+run_dump_test "lp64-2"
+run_dump_test "lp64-3"
This page took 0.033687 seconds and 4 git commands to generate.