]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Move AARCH64 ILP32 rejection handling
authorAndrew Pinski <apinski@cavium.com>
Mon, 7 Sep 2015 09:06:18 +0000 (17:06 +0800)
committerAndrew Pinski <apinski@cavium.com>
Wed, 31 Aug 2016 20:06:39 +0000 (13:06 -0700)
For AARCH64 ILP32, we reject compatibility too
early on to support gdb ILP32.  This patch
moves ILP32 rejection from compatible
to elfNN_aarch64_merge_private_bfd_data
which allows aarch64 and aarch64:ilp32
to be handled correctly with gdb.
An added bonus is that we can have an error
message on why two object files are rejected.

OK?  Tested both binutils and gdb.

Thanks,
Andrew Pinski

2016-08-31  Andrew Pinski  <apinski@cavium.com>

* cpu-aarch64.c (compatible):
Don't reject different mach or ILP32 here.
* elfnn-aarch64.c (elfNN_aarch64_merge_private_bfd_data):
Add an error message on why endianess is rejected.
Reject different ILP32/LP64 settings.

Signed-off-by: Andrew Pinski <apinski@cavium.com>
bfd/ChangeLog
bfd/cpu-aarch64.c
bfd/elfnn-aarch64.c

index 59dfb2cb141153d408ff59005fad98ae5c4e4fe7..77b2b6b2fadd1c65ff87ab93deaea6c797aea430 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-31  Andrew Pinski  <apinski@cavium.com>
+
+       * cpu-aarch64.c (compatible):
+       Don't reject different mach or ILP32 here.
+       * elfnn-aarch64.c (elfNN_aarch64_merge_private_bfd_data):
+       Add an error message on why endianess is rejected.
+       Reject different ILP32/LP64 settings.
+
 2016-08-31  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (group_sections): Delete stub14_group_size.  Instead,
index 596d24190b589d8380b2ee3ff5855cbf71757f67..6fb91331b78cf614a3d1cc5daf1c339967c43347 100644 (file)
@@ -34,31 +34,9 @@ compatible (const bfd_arch_info_type * a, const bfd_arch_info_type * b)
   if (a->arch != b->arch)
     return NULL;
 
-  /* If a & b are for the same machine then all is well.  */
-  if (a->mach == b->mach)
-    return a;
-
-  /* Don't allow mixing ilp32 with lp64.  */
-  if ((a->mach & bfd_mach_aarch64_ilp32) != (b->mach & bfd_mach_aarch64_ilp32))
-    return NULL;
-
-  /* Otherwise if either a or b is the 'default' machine
-     then it can be polymorphed into the other.  */
-  if (a->the_default)
-    return b;
-
-  if (b->the_default)
-    return a;
-
-  /* So far all newer cores are
-     supersets of previous cores.  */
-  if (a->mach < b->mach)
-    return b;
-  else if (a->mach > b->mach)
-    return a;
-
-  /* Never reached!  */
-  return NULL;
+  /* Machine compatibility is checked in
+     elfNN_aarch64_merge_private_bfd_data.  */
+  return a;
 }
 
 static struct
index 3435a3d67339858726177a6096bd8f3260d91686..1e275016be86435681ec0c5120102d3bf25e09d0 100644 (file)
@@ -6530,11 +6530,26 @@ elfNN_aarch64_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
 
   /* Check if we have the same endianess.  */
   if (!_bfd_generic_verify_endian_match (ibfd, obfd))
-    return FALSE;
+    {
+      (*_bfd_error_handler)
+       (_("%B: endianness incompatible with that of the selected emulation"),
+        ibfd);
+      return FALSE;
+    }
 
   if (!is_aarch64_elf (ibfd) || !is_aarch64_elf (obfd))
     return TRUE;
 
+  /* Don't allow mixing ilp32 with lp64.  */
+  if ((bfd_get_arch_info (ibfd)->mach & bfd_mach_aarch64_ilp32)
+      != (bfd_get_arch_info (obfd)->mach & bfd_mach_aarch64_ilp32))
+    {
+      (*_bfd_error_handler)
+       (_("%B: ABI is incompatible with that of the selected emulation: \"%s\" != \"%s\""),
+        ibfd, bfd_get_target (ibfd), bfd_get_target (obfd));
+      return FALSE;
+    }
+
   /* The input BFD must have had its flags initialised.  */
   /* The following seems bogus to me -- The flags are initialized in
      the assembler but I don't think an elf_flags_init field is