[binutils] Add the hard-float/soft-float ABI flag as appropriate for ET_DYN/ET_EXEC in EABI_VER5
Kyle McMartin
kyle at fedoraproject.org
Fri Aug 30 13:36:12 UTC 2013
commit d6a7761e066bab9e132abaec14f13feacb6bf7b7
Author: Kyle McMartin <kyle at mcmartin.ca>
Date: Fri Aug 30 09:35:45 2013 -0400
Add the hard-float/soft-float ABI flag as appropriate for ET_DYN/ET_EXEC in EABI_VER5
binutils-2.23.2-arm-add-float-abi-to-e_flags.patch | 248 ++++++++++++++++++++
binutils.spec | 12 +-
2 files changed, 258 insertions(+), 2 deletions(-)
---
diff --git a/binutils-2.23.2-arm-add-float-abi-to-e_flags.patch b/binutils-2.23.2-arm-add-float-abi-to-e_flags.patch
new file mode 100644
index 0000000..ba441c2
--- /dev/null
+++ b/binutils-2.23.2-arm-add-float-abi-to-e_flags.patch
@@ -0,0 +1,248 @@
+commit cd49363b8ae1725522ea29ccc0dda7b138f3d5aa
+Author: Nick Clifton <nickc at redhat.com>
+Date: Tue Oct 30 12:44:53 2012 +0000
+
+ bfd:
+ * elf32-arm.c (elf32_arm_print_private_bfd_data): Recognise and
+ display the new ARM hard-float/soft-float ABI flags for EABI_VER5
+ (elf32_arm_post_process_headers): Add the hard-float/soft-float
+ ABI flag as appropriate for ET_DYN/ET_EXEC in EABI_VER5.
+
+ binutils:
+ * readelf.c (decode_ARM_machine_flags): Recognise and display the
+ new ARM hard-float/soft-float ABI flags for EABI_VER5. Split out
+ the code for EABI_VER4 and EABI_VER5 to allow this.
+
+ elfcpp:
+ * arm.h: New enum for EABI soft- and hard-float flags.
+
+ gold:
+ * gold.cc (Target_arm::do_adjust_elf_header): Add the
+ hard-float/soft-float ABI flag as appropriate for ET_DYN/ET_EXEC
+ in EABI_VER5.
+
+ include:
+ * elf/arm.h (EF_ARM_ABI_FLOAT_SOFT): New define.
+ (EF_ARM_ABI_FLOAT_HARD): Likewise.
+
+ ld/testsuite:
+ * ld-arm/eabi-hard-float.s: New test source.
+ * ld-arm/eabi-soft-float.s: New test source.
+ * ld-arm/eabi-hard-float.d: New test.
+ * ld-arm/eabi-soft-float.d: New test.
+ * ld-arm/eabi-soft-float-ABI4.d: New test.
+ * ld-arm/eabi-soft-float-r.d: New test.
+ * ld-arm/arm-elf.xp: Use the new tests.
+
+--- a/bfd/elf32-arm.c
++++ b/bfd/elf32-arm.c
+@@ -12110,6 +12110,15 @@ elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
+
+ case EF_ARM_EABI_VER5:
+ fprintf (file, _(" [Version5 EABI]"));
++
++ if (flags & EF_ARM_ABI_FLOAT_SOFT)
++ fprintf (file, _(" [soft-float ABI]"));
++
++ if (flags & EF_ARM_ABI_FLOAT_HARD)
++ fprintf (file, _(" [hard-float ABI]"));
++
++ flags &= ~(EF_ARM_ABI_FLOAT_SOFT | EF_ARM_ABI_FLOAT_HARD);
++
+ eabi:
+ if (flags & EF_ARM_BE8)
+ fprintf (file, _(" [BE8]"));
+@@ -14417,6 +14426,16 @@ elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATT
+ if (globals != NULL && globals->byteswap_code)
+ i_ehdrp->e_flags |= EF_ARM_BE8;
+ }
++
++ if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_VER5
++ && ((i_ehdrp->e_type == ET_DYN) || (i_ehdrp->e_type == ET_EXEC)))
++ {
++ int abi = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_ABI_VFP_args);
++ if (abi)
++ i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_HARD;
++ else
++ i_ehdrp->e_flags |= EF_ARM_ABI_FLOAT_SOFT;
++ }
+ }
+
+ static enum elf_reloc_type_class
+--- a/binutils/readelf.c
++++ b/binutils/readelf.c
+@@ -2122,11 +2134,34 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[])
+
+ case EF_ARM_EABI_VER4:
+ strcat (buf, ", Version4 EABI");
+- goto eabi;
++ while (e_flags)
++ {
++ unsigned flag;
++
++ /* Process flags one bit at a time. */
++ flag = e_flags & - e_flags;
++ e_flags &= ~ flag;
++
++ switch (flag)
++ {
++ case EF_ARM_BE8:
++ strcat (buf, ", BE8");
++ break;
++
++ case EF_ARM_LE8:
++ strcat (buf, ", LE8");
++ break;
++
++ default:
++ unknown = 1;
++ break;
++ }
++ break;
++ }
++ break;
+
+ case EF_ARM_EABI_VER5:
+ strcat (buf, ", Version5 EABI");
+- eabi:
+ while (e_flags)
+ {
+ unsigned flag;
+@@ -2145,6 +2180,14 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[])
+ strcat (buf, ", LE8");
+ break;
+
++ case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
++ strcat (buf, ", soft-float ABI");
++ break;
++
++ case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
++ strcat (buf, ", hard-float ABI");
++ break;
++
+ default:
+ unknown = 1;
+ break;
+diff --git a/elfcpp/arm.h b/elfcpp/arm.h
+index cb85eeb..ab0618a 100644
+--- a/elfcpp/arm.h
++++ b/elfcpp/arm.h
+@@ -1,6 +1,6 @@
+ // arm.h -- ELF definitions specific to EM_ARM -*- C++ -*-
+
+-// Copyright 2009, Free Software Foundation, Inc.
++// Copyright 2009, 2012 Free Software Foundation, Inc.
+ // Written by Doug Kwan <dougkwan at google.com>.
+
+ // This file is part of elfcpp.
+@@ -222,6 +222,14 @@ inline Elf_Word
+ arm_eabi_version(Elf_Word flags)
+ { return flags & EF_ARM_EABIMASK; }
+
++// EABI_VER5 e_flags values for identifying soft- and hard-float ABI
++// choice.
++enum
++{
++ EF_ARM_ABI_FLOAT_SOFT = 0x200,
++ EF_ARM_ABI_FLOAT_HARD = 0x400,
++};
++
+ // Values for the Tag_CPU_arch EABI attribute.
+ enum
+ {
+diff --git a/gold/arm.cc b/gold/arm.cc
+index d847126..5770c8a 100644
+--- a/gold/arm.cc
++++ b/gold/arm.cc
+@@ -2476,7 +2476,7 @@ class Target_arm : public Sized_target<32, big_endian>
+ { return new Arm_output_section<big_endian>(name, type, flags); }
+
+ void
+- do_adjust_elf_header(unsigned char* view, int len) const;
++ do_adjust_elf_header(unsigned char* view, int len);
+
+ // We only need to generate stubs, and hence perform relaxation if we are
+ // not doing relocatable linking.
+@@ -10016,15 +10016,16 @@ template<bool big_endian>
+ void
+ Target_arm<big_endian>::do_adjust_elf_header(
+ unsigned char* view,
+- int len) const
++ int len)
+ {
+ gold_assert(len == elfcpp::Elf_sizes<32>::ehdr_size);
+
+ elfcpp::Ehdr<32, big_endian> ehdr(view);
++ elfcpp::Elf_Word flags = this->processor_specific_flags();
+ unsigned char e_ident[elfcpp::EI_NIDENT];
+ memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
+
+- if (elfcpp::arm_eabi_version(this->processor_specific_flags())
++ if (elfcpp::arm_eabi_version(flags)
+ == elfcpp::EF_ARM_EABI_UNKNOWN)
+ e_ident[elfcpp::EI_OSABI] = elfcpp::ELFOSABI_ARM;
+ else
+@@ -10033,6 +10034,21 @@ Target_arm<big_endian>::do_adjust_elf_header(
+
+ // FIXME: Do EF_ARM_BE8 adjustment.
+
++ // If we're working in EABI_VER5, set the hard/soft float ABI flags
++ // as appropriate.
++ if (elfcpp::arm_eabi_version(flags) == elfcpp::EF_ARM_EABI_VER5)
++ {
++ elfcpp::Elf_Half type = ehdr.get_e_type();
++ if (type == elfcpp::ET_EXEC || type == elfcpp::ET_DYN)
++ {
++ Object_attribute* attr = this->get_aeabi_object_attribute(elfcpp::Tag_ABI_VFP_args);
++ if (attr->int_value())
++ flags |= elfcpp::EF_ARM_ABI_FLOAT_HARD;
++ else
++ flags |= elfcpp::EF_ARM_ABI_FLOAT_SOFT;
++ this->set_processor_specific_flags(flags);
++ }
++ }
+ elfcpp::Ehdr_write<32, big_endian> oehdr(view);
+ oehdr.put_e_ident(e_ident);
+ }
+diff --git a/include/elf/arm.h b/include/elf/arm.h
+index 8ea3fe8..d799303 100644
+--- a/include/elf/arm.h
++++ b/include/elf/arm.h
+@@ -46,6 +46,11 @@
+ #define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT. */
+ #define EF_ARM_EABIMASK 0xFF000000
+
++/* New constants defined in the ARM ELF spec. version XXX.
++ Only valid in conjunction with EF_ARM_EABI_VER5. */
++#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT. */
++#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT. */
++
+ /* Constants defined in AAELF. */
+ #define EF_ARM_BE8 0x00800000
+ #define EF_ARM_LE8 0x00400000
+diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
+index 8e15ffe..81ee0bd 100644
+--- a/ld/testsuite/ld-arm/arm-elf.exp
++++ b/ld/testsuite/ld-arm/arm-elf.exp
+@@ -271,6 +271,21 @@ set armelftests_common {
+ {"Simple non-PIC shared library (no PLT check)" "-shared" "" {arm-lib.s}
+ {{objdump -Rw arm-lib.r}}
+ "arm-lib.so"}
++ {"EABI soft-float ET_EXEC ABI flag" "-T arm.ld" "-mfloat-abi=soft -meabi=5" {eabi-soft-float.s}
++ {{readelf -h eabi-soft-float.d}}
++ "eabi-soft-float"}
++ {"EABI hard-float ET_EXEC ABI flag" "-T arm.ld" "-mfloat-abi=hard -meabi=5" {eabi-hard-float.s}
++ {{readelf -h eabi-hard-float.d}}
++ "eabi-hard-float"}
++ {"EABI hard-float ET_DYN ABI flag" "-shared" "-mfloat-abi=hard -meabi=5" {eabi-hard-float.s}
++ {{readelf -h eabi-hard-float.d}}
++ "eabi-hard-float.so"}
++ {"EABI ABI flags wrong ABI version" "-T arm.ld" "-mfloat-abi=soft -meabi=4" {eabi-soft-float.s}
++ {{readelf -h eabi-soft-float-ABI4.d}}
++ "eabi-soft-float-no-flags"}
++ {"EABI ABI flags ld -r" "-r" "-mfloat-abi=soft -meabi=5" {eabi-soft-float.s}
++ {{readelf -h eabi-soft-float-r.d}}
++ "eabi-soft-float-r.o"}
+ }
+
+ set armelftests_nonacl {
diff --git a/binutils.spec b/binutils.spec
index 3abeb7a..4522d13 100644
--- a/binutils.spec
+++ b/binutils.spec
@@ -27,7 +27,7 @@ Name: %{?cross}binutils%{?_with_debug:-debug}
# official binutils release happens (2.24.0) we will be able to restore
# Version to an honest value and everything will be good again.
Version: 2.23.88.0.1
-Release: 12%{?dist}
+Release: 13%{?dist}
License: GPLv3+
Group: Development/Tools
URL: http://sources.redhat.com/binutils
@@ -76,6 +76,8 @@ Patch20: binutils-2.23.2-s390-gas-machinemode.patch
Patch21: binutils-2.23.2-xtensa.memset.patch
# Add support for the s/390 zEC12 architecture variant to assembler.
Patch22: binutils-2.23.2-s390-zEC12.patch
+# Add ARM floating point ABI to the ELF header flags
+Patch23: binutils-2.23.2-arm-add-float-abi-to-e_flags.patch
Provides: bundled(libiberty)
@@ -203,6 +205,7 @@ using libelf instead of BFD.
%patch20 -p0 -b .machinemode~
%patch21 -p0 -b .xtensa~
%patch22 -p0 -b .s390-zec12~
+%patch23 -p1 -b .arm-float~
# We cannot run autotools as there is an exact requirement of autoconf-2.59.
@@ -508,7 +511,12 @@ exit 0
%endif # %{isnative}
%changelog
-* Wed Aug 14 2013 Nick Clifton <nickc at redhat.com> 2.23.88.0.1-14
+* Fri Aug 30 2013 Kyle McMartin <kyle at redhat.com> 2.23.88.0.1-13
+- Add the hard-float/soft-float ABI flag as appropriate for
+ ET_DYN/ET_EXEC in EABI_VER5.
+- Fix last changelog entry, it was release 12, not 14.
+
+* Wed Aug 14 2013 Nick Clifton <nickc at redhat.com> 2.23.88.0.1-12
- Add support for the s/390 zEC12 architecture to gas. (#996395)
* Mon Aug 12 2013 Nick Clifton <nickc at redhat.com> 2.23.88.0.1-11
More information about the scm-commits
mailing list