From: Terry Guo Date: Tue, 16 Sep 2014 12:08:22 +0000 (+0100) Subject: Make the linker return an error status if it fails to merge ARM binaries with X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=70e99720f9d558263756a482ae750b263ffd92ba;p=binutils-gdb.git Make the linker return an error status if it fails to merge ARM binaries with different architecture tags. Add a test case to make sure that this works, and update readelf so that it will not seg-fault when trying to display the attributes of binaries with invalid architecture tags. * elf32-arm.c (elf32_arm_merge_eabi_attributes): Return false if failed to merge. * ld-arm/attr-merge-arch-2.d: New test case. * ld-arm/attr-merge-arch-2a.s: New test case source file. * ld-arm/attr-merge-arch-2b.s: Likewise. * ld-arm/arm-elf.exp: Run new test case. * readelf.c (display_arm_attribute): Use unsigned int type for tag, val and type variables. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fcfdeadee1f..7076ff46c22 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-09-16 Terry Guo + + * elf32-arm.c (elf32_arm_merge_eabi_attributes): Return false if + failed to merge. + 2014-09-16 Kuan-Lin Chen * bfd-in2.h: Regenerate. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 89d51c11b13..08aa3f9e396 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -11778,7 +11778,9 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd) { int secondary_compat = -1, secondary_compat_out = -1; unsigned int saved_out_attr = out_attr[i].i; - static const char *name_table[] = { + int arch_attr; + static const char *name_table[] = + { /* These aren't real CPU names, but we can't guess that from the architecture version alone. */ "Pre v4", @@ -11800,10 +11802,17 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd) /* Merge Tag_CPU_arch and Tag_also_compatible_with. */ secondary_compat = get_secondary_compatible_arch (ibfd); secondary_compat_out = get_secondary_compatible_arch (obfd); - out_attr[i].i = tag_cpu_arch_combine (ibfd, out_attr[i].i, - &secondary_compat_out, - in_attr[i].i, - secondary_compat); + arch_attr = tag_cpu_arch_combine (ibfd, out_attr[i].i, + &secondary_compat_out, + in_attr[i].i, + secondary_compat); + + /* Return with error if failed to merge. */ + if (arch_attr == -1) + return FALSE; + + out_attr[i].i = arch_attr; + set_secondary_compatible_arch (obfd, secondary_compat_out); /* Merge Tag_CPU_name and Tag_CPU_raw_name. */ diff --git a/binutils/ChangeLog b/binutils/ChangeLog index c55382edb78..223bf119b32 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2014-09-16 Nick Clifton + + * readelf.c (display_arm_attribute): Use unsigned int type for + tag, val and type variables. + 2014-09-16 Kuan-Lin Chen * readelf.c (decode_NDS32_machine_flags): Display ABI2 FP+. diff --git a/binutils/readelf.c b/binutils/readelf.c index ef3a68dcb76..d9c12cc8da6 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -11548,10 +11548,10 @@ display_tag_value (int tag, /* ARM EABI attributes section. */ typedef struct { - int tag; + unsigned int tag; const char * name; /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */ - int type; + unsigned int type; const char ** table; } arm_attr_public_tag; @@ -11669,12 +11669,12 @@ static unsigned char * display_arm_attribute (unsigned char * p, const unsigned char * const end) { - int tag; + unsigned int tag; unsigned int len; - int val; + unsigned int val; arm_attr_public_tag * attr; unsigned i; - int type; + unsigned int type; tag = read_uleb128 (p, &len, end); p += len; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f5aef2a33b1..556ee1aa13a 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-09-16 Terry Guo + + * ld-arm/attr-merge-arch-2.d: New test case. + * ld-arm/attr-merge-arch-2a.s: New test case source file. + * ld-arm/attr-merge-arch-2b.s: Likewise. + * ld-arm/arm-elf.exp: Run new test case. + 2014-09-12 Andrew Bennett * ld-mips-elf/mips-elf.exp: Add support for mips*-img-elf* target diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index f971afca09b..3c8cc689fea 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -878,6 +878,7 @@ run_dump_test "attr-merge-vfp-6r" run_dump_test "attr-merge-vfp-7" run_dump_test "attr-merge-vfp-7r" run_dump_test "attr-merge-incompatible" +run_dump_test "attr-merge-arch-2" run_dump_test "unresolved-1" if { ![istarget "arm*-*-nacl*"] } { run_dump_test "unresolved-1-dyn" diff --git a/ld/testsuite/ld-arm/attr-merge-arch-2.d b/ld/testsuite/ld-arm/attr-merge-arch-2.d new file mode 100644 index 00000000000..0e98edb6612 --- /dev/null +++ b/ld/testsuite/ld-arm/attr-merge-arch-2.d @@ -0,0 +1,5 @@ +#source: attr-merge-arch-2a.s +#source: attr-merge-arch-2b.s +#as: +#ld: -e main +#error: Conflicting CPU architectures 13/0 diff --git a/ld/testsuite/ld-arm/attr-merge-arch-2a.s b/ld/testsuite/ld-arm/attr-merge-arch-2a.s new file mode 100644 index 00000000000..6235a3ed012 --- /dev/null +++ b/ld/testsuite/ld-arm/attr-merge-arch-2a.s @@ -0,0 +1,18 @@ + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + .file "m.c" + .text + .align 2 + .global main + .thumb + .thumb_func + .type main, %function +main: + push {r7, lr} + add r7, sp, #0 + bl foo + mov r3, r0 + mov r0, r3 + pop {r7, pc} diff --git a/ld/testsuite/ld-arm/attr-merge-arch-2b.s b/ld/testsuite/ld-arm/attr-merge-arch-2b.s new file mode 100644 index 00000000000..57718354145 --- /dev/null +++ b/ld/testsuite/ld-arm/attr-merge-arch-2b.s @@ -0,0 +1,8 @@ + .eabi_attribute 6, 0 @Tag_CPU_arch, 0 means pre-v4. + .file "f.c" + .text + .align 2 + .global foo + .type foo, %function +foo: + bx lr