From: Andrew Pinski Date: Mon, 7 Sep 2015 09:06:18 +0000 (+0800) Subject: 2015-09-07 Andrew Pinski X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fce5615a3637f4ebdc145ef5fcb52bf036711f7;p=thirdparty%2Fbinutils-gdb.git 2015-09-07 Andrew Pinski * 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d51800e855d..108e4bdeff5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2015-09-07 Andrew Pinski + + * 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. + 2015-09-03 H.J. Lu * elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Remove diff --git a/bfd/cpu-aarch64.c b/bfd/cpu-aarch64.c index 7d767f0805d..0b2e303517c 100644 --- a/bfd/cpu-aarch64.c +++ b/bfd/cpu-aarch64.c @@ -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 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 3c4392477c3..3c072b0913b 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -6141,11 +6141,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