diff --git a/packages/devel/binutils/package.mk b/packages/devel/binutils/package.mk
index 557cfb3ac8..f79f87b4c8 100644
--- a/packages/devel/binutils/package.mk
+++ b/packages/devel/binutils/package.mk
@@ -16,13 +16,8 @@
# along with OpenELEC. If not, see .
################################################################################
-# binutils-2.24:
-# - fails to build with GOLD support on ARM
-# see https://sourceware.org/bugzilla/show_bug.cgi?id=15639
-# ld.gold: internal error in do_read_symbols, at build.OpenELEC-RPi.arm-devel/binutils-2.24/gold/arm.cc:6734
-
PKG_NAME="binutils"
-PKG_VERSION="2.23.2"
+PKG_VERSION="2.24"
PKG_REV="1"
PKG_ARCH="any"
PKG_LICENSE="GPL"
diff --git a/packages/devel/binutils/patches/binutils-2.23.2-texinfo.patch b/packages/devel/binutils/patches/binutils-2.23.2-texinfo.patch
deleted file mode 100644
index 9486c79c02..0000000000
--- a/packages/devel/binutils/patches/binutils-2.23.2-texinfo.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -Naur a/bfd/doc/bfd.texinfo b/bfd/doc/bfd.texinfo
---- a/bfd/doc/bfd.texinfo 2010-10-28 07:40:25.000000000 -0400
-+++ b/bfd/doc/bfd.texinfo 2013-10-02 15:57:07.556185659 -0400
-@@ -322,7 +322,7 @@
- @printindex cp
-
- @tex
--% I think something like @colophon should be in texinfo. In the
-+% I think something like @@colophon should be in texinfo. In the
- % meantime:
- \long\def\colophon{\hbox to0pt{}\vfill
- \centerline{The body of this manual is set in}
-@@ -333,7 +333,7 @@
- \centerline{{\sl\fontname\tensl\/}}
- \centerline{are used for emphasis.}\vfill}
- \page\colophon
--% Blame: doc@cygnus.com, 28mar91.
-+% Blame: doc@@cygnus.com, 28mar91.
- @end tex
-
- @bye
diff --git a/packages/devel/binutils/patches/binutils-2.24-ARM_LTO.patch b/packages/devel/binutils/patches/binutils-2.24-ARM_LTO.patch
new file mode 100644
index 0000000000..dced066d67
--- /dev/null
+++ b/packages/devel/binutils/patches/binutils-2.24-ARM_LTO.patch
@@ -0,0 +1,169 @@
+From f35c4853cc5b0e51d8a460be390f7a20cd44ba44 Mon Sep 17 00:00:00 2001
+From: Cary Coutant
+Date: Mon, 7 Jul 2014 10:14:45 -0700
+Subject: [PATCH] Fix internal error with LTO on ARM.
+
+This prevents the target-specific do_read_symbols methods from being called
+twice when do_layout_deferred_sections needs to layout an .eh_frame section.
+
+gold/
+ PR gold/15639
+ * dynobj.h (Sized_dynobj::base_read_symbols): New method.
+ * dynobj.cc (Sized_dynobj::do_read_symbols): Move body to...
+ (Sized_dynobj::base_read_symbols): ...new method.
+ * object.h (Sized_relobj_file::base_read_symbols): New method.
+ * object.cc (Sized_relobj_file::do_read_symbols): Move body to...
+ (Sized_relobj_file::base_read_symbols): ...new method.
+ * arm.cc (Arm_relobj::do_read_symbols): Call base_read_symbols.
+ * mips.cc: (Mips_relobj::do_read_symbols): Likewise.
+ * powerpc.cc (Powerpc_dynobj::do_read_symbols): Likewise.
+---
+ gold/ChangeLog | 13 +++++++++++++
+ gold/arm.cc | 4 ++--
+ gold/dynobj.cc | 11 +++++++++++
+ gold/dynobj.h | 6 ++++++
+ gold/mips.cc | 2 +-
+ gold/object.cc | 12 +++++++++++-
+ gold/object.h | 5 +++++
+ gold/powerpc.cc | 6 +++---
+ 8 files changed, 52 insertions(+), 7 deletions(-)
+
+diff --git a/gold/arm.cc b/gold/arm.cc
+index 607f9d6..6c472bb 100644
+--- a/gold/arm.cc
++++ b/gold/arm.cc
+@@ -6683,7 +6683,7 @@ void
+ Arm_relobj::do_read_symbols(Read_symbols_data* sd)
+ {
+ // Call parent class to read symbol information.
+- Sized_relobj_file<32, big_endian>::do_read_symbols(sd);
++ this->base_read_symbols(sd);
+
+ // If this input file is a binary file, it has no processor
+ // specific flags and attributes section.
+@@ -6974,7 +6974,7 @@ void
+ Arm_dynobj::do_read_symbols(Read_symbols_data* sd)
+ {
+ // Call parent class to read symbol information.
+- Sized_dynobj<32, big_endian>::do_read_symbols(sd);
++ this->base_read_symbols(sd);
+
+ // Read processor-specific flags in ELF file header.
+ const unsigned char* pehdr = this->get_view(elfcpp::file_header_offset,
+diff --git a/gold/dynobj.cc b/gold/dynobj.cc
+index 2a1b9a3..baf8489 100644
+--- a/gold/dynobj.cc
++++ b/gold/dynobj.cc
+@@ -336,6 +336,17 @@ template
+ void
+ Sized_dynobj::do_read_symbols(Read_symbols_data* sd)
+ {
++ this->base_read_symbols(sd);
++}
++
++// Read the symbols and sections from a dynamic object. We read the
++// dynamic symbols, not the normal symbols. This is common code for
++// all target-specific overrides of do_read_symbols().
++
++template
++void
++Sized_dynobj::base_read_symbols(Read_symbols_data* sd)
++{
+ this->read_section_data(&this->elf_file_, sd);
+
+ const unsigned char* const pshdrs = sd->section_headers->data();
+diff --git a/gold/dynobj.h b/gold/dynobj.h
+index b8d4b90..03b8053 100644
+--- a/gold/dynobj.h
++++ b/gold/dynobj.h
+@@ -270,6 +270,12 @@ class Sized_dynobj : public Dynobj
+ do_get_global_symbols() const
+ { return this->symbols_; }
+
++ protected:
++ // Read the symbols. This is common code for all target-specific
++ // overrides of do_read_symbols().
++ void
++ base_read_symbols(Read_symbols_data*);
++
+ private:
+ // For convenience.
+ typedef Sized_dynobj This;
+diff --git a/gold/object.cc b/gold/object.cc
+index c894c13..1811cda 100644
+--- a/gold/object.cc
++++ b/gold/object.cc
+@@ -755,6 +755,16 @@ template
+ void
+ Sized_relobj_file::do_read_symbols(Read_symbols_data* sd)
+ {
++ this->base_read_symbols(sd);
++}
++
++// Read the sections and symbols from an object file. This is common
++// code for all target-specific overrides of do_read_symbols().
++
++template
++void
++Sized_relobj_file::base_read_symbols(Read_symbols_data* sd)
++{
+ this->read_section_data(&this->elf_file_, sd);
+
+ const unsigned char* const pshdrs = sd->section_headers->data();
+@@ -1848,7 +1858,7 @@ Sized_relobj_file::do_layout_deferred_sections(Layout* layout)
+
+ // Reading the symbols again here may be slow.
+ Read_symbols_data sd;
+- this->read_symbols(&sd);
++ this->base_read_symbols(&sd);
+ this->layout_eh_frame_section(layout,
+ sd.symbols->data(),
+ sd.symbols_size,
+diff --git a/gold/object.h b/gold/object.h
+index 38b06f0..92cdbdd 100644
+--- a/gold/object.h
++++ b/gold/object.h
+@@ -2214,6 +2214,11 @@ class Sized_relobj_file : public Sized_relobj
+ void
+ do_read_symbols(Read_symbols_data*);
+
++ // Read the symbols. This is common code for all target-specific
++ // overrides of do_read_symbols.
++ void
++ base_read_symbols(Read_symbols_data*);
++
+ // Return the value of a local symbol.
+ uint64_t
+ do_local_symbol_value(unsigned int symndx, uint64_t addend) const
+diff --git a/gold/powerpc.cc b/gold/powerpc.cc
+index 96432ed..0a9ab7d 100644
+--- a/gold/powerpc.cc
++++ b/gold/powerpc.cc
+@@ -1839,7 +1839,7 @@ template
+ void
+ Powerpc_relobj::do_read_symbols(Read_symbols_data* sd)
+ {
+- Sized_relobj_file::do_read_symbols(sd);
++ this->base_read_symbols(sd);
+ if (size == 64)
+ {
+ const int shdr_size = elfcpp::Elf_sizes::shdr_size;
+@@ -1896,14 +1896,14 @@ Powerpc_dynobj::set_abiversion(int ver)
+ }
+ }
+
+-// Call Sized_dynobj::do_read_symbols to read the symbols then
++// Call Sized_dynobj::base_read_symbols to read the symbols then
+ // read .opd from a dynamic object, filling in opd_ent_ vector,
+
+ template
+ void
+ Powerpc_dynobj::do_read_symbols(Read_symbols_data* sd)
+ {
+- Sized_dynobj::do_read_symbols(sd);
++ this->base_read_symbols(sd);
+ if (size == 64)
+ {
+ const int shdr_size = elfcpp::Elf_sizes::shdr_size;
+--
+1.7.1
diff --git a/packages/devel/binutils/patches/binutils-2.23.1-multi_os_directory.patch b/packages/devel/binutils/patches/binutils-2.24-multi_os_directory.patch
similarity index 100%
rename from packages/devel/binutils/patches/binutils-2.23.1-multi_os_directory.patch
rename to packages/devel/binutils/patches/binutils-2.24-multi_os_directory.patch