diff --git a/package/binutils/Config.in.host b/package/binutils/Config.in.host
index 08540a3..de7f29a 100644
--- a/package/binutils/Config.in.host
+++ b/package/binutils/Config.in.host
@@ -42,6 +42,7 @@ choice
 
 	config BR2_BINUTILS_VERSION_2_24
 		depends on !BR2_avr32
+		select BR2_BINUTILS_SUPPORTS_GOLD
 		bool "binutils 2.24"
 
 endchoice
diff --git a/package/binutils/binutils.mk b/package/binutils/binutils.mk
index 9cc4d28..dcca490 100644
--- a/package/binutils/binutils.mk
+++ b/package/binutils/binutils.mk
@@ -44,10 +44,10 @@ endif
 
 # We need to specify host & target to avoid breaking ARM EABI
 BINUTILS_CONF_OPT = --disable-multilib --disable-werror \
-		--host=$(GNU_TARGET_NAME) \
-		--target=$(GNU_TARGET_NAME) \
-		--enable-install-libiberty \
-		$(BINUTILS_EXTRA_CONFIG_OPTIONS)
+	--host=$(GNU_TARGET_NAME) \
+	--target=$(GNU_TARGET_NAME) \
+	--enable-install-libiberty \
+	$(BINUTILS_EXTRA_CONFIG_OPTIONS)
 
 # Install binutils after busybox to prefer full-blown utilities
 ifeq ($(BR2_PACKAGE_BUSYBOX),y)
@@ -57,10 +57,22 @@ endif
 # "host" binutils should actually be "cross"
 # We just keep the convention of "host utility" for now
 HOST_BINUTILS_CONF_OPT = --disable-multilib --disable-werror \
-			--target=$(GNU_TARGET_NAME) \
-			--disable-shared --enable-static \
-			--with-sysroot=$(STAGING_DIR) \
-			$(BINUTILS_EXTRA_CONFIG_OPTIONS)
+	--target=$(GNU_TARGET_NAME) \
+	--disable-shared --enable-static \
+	--with-sysroot=$(STAGING_DIR) \
+	$(BINUTILS_EXTRA_CONFIG_OPTIONS)
+
+# disable ld explicitely and use ld.gold exclusively
+ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
+HOST_BINUTILS_CONF_OPT += \
+	--enable-plugins \
+	--enable-gold \
+	--disable-ld
+endif
+
+ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LTO),y)
+HOST_BINUTILS_CONF_OPT += --enable-lto
+endif
 
 # We just want libbfd and libiberty, not the full-blown binutils in staging
 define BINUTILS_INSTALL_STAGING_CMDS
diff --git a/package/gcc/4.8.3/950-lto-support.patch b/package/gcc/4.8.3/950-lto-support.patch
new file mode 100644
index 0000000..fd34801
--- /dev/null
+++ b/package/gcc/4.8.3/950-lto-support.patch
@@ -0,0 +1,54 @@
+Add support for Link Time Optimisations (LTO)
+
+The link time optimisations cause the compiler optimisations
+to take place during linking rather than during compilation.
+
+Simply using the archiver (AR) on a number of object files
+doesn't work because the certain LTO specific symbols are 
+not handled properly.
+
+The GCC solution is to create a wrapper around ar, nm and 
+ranlib, called ar-gcc, rm-gcc and ranlib-gcc, and to call 
+these from the various project makefiles. For a complete
+LTO build, changing the makefiles that don't take AR from 
+the environment is not really practical. This is a temporary
+solution until the actual tools, provided by binutils
+will correctly handle LTO objects.
+
+Signed-off-by: Steve Thomas <sjthm@live.com>
+
+--- a/gcc/gcc-ar.c	2014-04-29 23:54:09.387237442 +0000
++++ b/gcc/gcc-ar.c	2014-04-29 23:52:35.184336991 +0000
+@@ -123,6 +126,7 @@
+ int 
+ main (int ac, char **av)
+ {
++  char real_exe_bin_name[256];
+   const char *exe_name;
+   char *plugin;
+   int k, status, err;
+@@ -143,20 +147,12 @@
+     }
+ 
+   /* Find the wrapped binutils program.  */
+-  exe_name = find_a_file (&target_path, PERSONALITY, X_OK);
++  exe_name = find_a_file (&target_path, PERSONALITY "-bin", X_OK);
+   if (!exe_name)
+     {
+-      const char *real_exe_name = PERSONALITY;
+-#ifdef CROSS_DIRECTORY_STRUCTURE
+-      real_exe_name = concat (target_machine, "-", PERSONALITY, NULL);
+-#endif
+-      exe_name = find_a_file (&path, real_exe_name, X_OK);
+-      if (!exe_name)
+-	{
+-	  fprintf (stderr, "%s: Cannot find binary '%s'\n", av[0],
+-		   real_exe_name);
+-	  exit (1);
+-	}
++      exe_name = real_exe_bin_name;
++      strcpy(real_exe_bin_name, av[0]);
++      strcat(real_exe_bin_name, "-bin");
+     }
+ 
+   /* Create new command line with plugin */
diff --git a/package/gcc/4.9.0/950-lto-support.patch b/package/gcc/4.9.0/950-lto-support.patch
new file mode 100644
index 0000000..fd34801
--- /dev/null
+++ b/package/gcc/4.9.0/950-lto-support.patch
@@ -0,0 +1,54 @@
+Add support for Link Time Optimisations (LTO)
+
+The link time optimisations cause the compiler optimisations
+to take place during linking rather than during compilation.
+
+Simply using the archiver (AR) on a number of object files
+doesn't work because the certain LTO specific symbols are 
+not handled properly.
+
+The GCC solution is to create a wrapper around ar, nm and 
+ranlib, called ar-gcc, rm-gcc and ranlib-gcc, and to call 
+these from the various project makefiles. For a complete
+LTO build, changing the makefiles that don't take AR from 
+the environment is not really practical. This is a temporary
+solution until the actual tools, provided by binutils
+will correctly handle LTO objects.
+
+Signed-off-by: Steve Thomas <sjthm@live.com>
+
+--- a/gcc/gcc-ar.c	2014-04-29 23:54:09.387237442 +0000
++++ b/gcc/gcc-ar.c	2014-04-29 23:52:35.184336991 +0000
+@@ -123,6 +126,7 @@
+ int 
+ main (int ac, char **av)
+ {
++  char real_exe_bin_name[256];
+   const char *exe_name;
+   char *plugin;
+   int k, status, err;
+@@ -143,20 +147,12 @@
+     }
+ 
+   /* Find the wrapped binutils program.  */
+-  exe_name = find_a_file (&target_path, PERSONALITY, X_OK);
++  exe_name = find_a_file (&target_path, PERSONALITY "-bin", X_OK);
+   if (!exe_name)
+     {
+-      const char *real_exe_name = PERSONALITY;
+-#ifdef CROSS_DIRECTORY_STRUCTURE
+-      real_exe_name = concat (target_machine, "-", PERSONALITY, NULL);
+-#endif
+-      exe_name = find_a_file (&path, real_exe_name, X_OK);
+-      if (!exe_name)
+-	{
+-	  fprintf (stderr, "%s: Cannot find binary '%s'\n", av[0],
+-		   real_exe_name);
+-	  exit (1);
+-	}
++      exe_name = real_exe_bin_name;
++      strcpy(real_exe_bin_name, av[0]);
++      strcat(real_exe_bin_name, "-bin");
+     }
+ 
+   /* Create new command line with plugin */
diff --git a/package/gcc/Config.in.host b/package/gcc/Config.in.host
index fde1b90..c79a102 100644
--- a/package/gcc/Config.in.host
+++ b/package/gcc/Config.in.host
@@ -64,6 +64,7 @@ choice
 		depends on !BR2_microblaze && !BR2_arc && !BR2_avr32 && !BR2_bfin && !BR2_cortex_a12 && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_powerpc64le && !BR2_sparc
 		select BR2_GCC_NEEDS_MPC
 		select BR2_GCC_SUPPORTS_GRAPHITE
+		select BR2_GCC_SUPPORTS_GOLD
 		bool "gcc 4.8.x"
 
 	config BR2_GCC_VERSION_4_8_ARC
@@ -75,6 +76,7 @@ choice
 		depends on !BR2_arc && !BR2_avr32 && !BR2_bfin && !BR2_sparc_sparchfleon && !BR2_sparc_sparchfleonv8 && !BR2_sparc_sparcsfleon && !BR2_sparc_sparcsfleonv8 && !BR2_sparc
 		select BR2_GCC_NEEDS_MPC
 		select BR2_GCC_SUPPORTS_GRAPHITE
+		select BR2_GCC_SUPPORTS_GOLD
 		bool "gcc 4.9.x"
 
 	config BR2_GCC_VERSION_SNAP
diff --git a/package/gcc/gcc-initial/gcc-initial.mk b/package/gcc/gcc-initial/gcc-initial.mk
index bc5ad26..717bbfd 100644
--- a/package/gcc/gcc-initial/gcc-initial.mk
+++ b/package/gcc/gcc-initial/gcc-initial.mk
@@ -40,4 +40,22 @@ HOST_GCC_INITIAL_CONF_ENV = \
 HOST_GCC_INITIAL_MAKE_OPT = all-gcc
 HOST_GCC_INITIAL_INSTALL_OPT = install-gcc
 
+# Create LTO aware wrappers for ar, nm and ranlib if they are not present.
+# The wrappers just add a linker plugin option and support LTO and non-LTO objects.
+ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
+define HOST_GCC_INSTALL_WRAPPERS
+        for i in ar nm ranlib ; do \
+			_tmp=$(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-$${i}; \
+	        if [ ! -f "$${_tmp}-bin" ] ; then \
+				mv $${_tmp} $${_tmp}-bin; \
+				cp -dpf $$(echo $${_tmp} | sed 's:-[^-]*$$:-gcc&:') $${_tmp}; \
+				ln -f $${_tmp}-bin $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/bin/$${i}-bin; \
+				ln -f $${_tmp} $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/bin/$${i}; \
+			fi; \
+        done; \
+		ln -fs $(HOST_DIR)/usr/libexec $(HOST_DIR)/usr/$(GNU_TARGET_NAME)/libexec
+endef
+HOST_GCC_INITIAL_POST_INSTALL_HOOKS += HOST_GCC_INSTALL_WRAPPERS
+endif
+
 $(eval $(host-autotools-package))
diff --git a/package/gcc/gcc.mk b/package/gcc/gcc.mk
index 5b60bc3..6980fa8 100644
--- a/package/gcc/gcc.mk
+++ b/package/gcc/gcc.mk
@@ -213,6 +213,17 @@ ifneq ($(GCC_TARGET_MODE),)
 HOST_GCC_COMMON_CONF_OPT += --with-mode=$(GCC_TARGET_MODE)
 endif
 
+ifeq ($(BR2_TOOLCHAIN_BUILDROOT_GOLD),y)
+HOST_GCC_COMMON_CONF_OPT += \
+           --enable-plugins \
+           --enable-gold \
+           --disable-ld
+endif
+
+ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LTO),y)
+HOST_GCC_COMMON_CONF_OPT += --enable-lto
+endif
+
 # Branding works on >= 4.3
 ifneq ($(findstring x4.2.,x$(GCC_VERSION)),x4.2.)
 HOST_GCC_COMMON_CONF_OPT += \
diff --git a/toolchain/toolchain-buildroot/Config.in b/toolchain/toolchain-buildroot/Config.in
index eef9f9c..1aa1ee6 100644
--- a/toolchain/toolchain-buildroot/Config.in
+++ b/toolchain/toolchain-buildroot/Config.in
@@ -100,6 +100,31 @@ config BR2_TOOLCHAIN_BUILDROOT_LIBC
 	default "glibc"  if BR2_TOOLCHAIN_BUILDROOT_GLIBC
 	default "musl"	 if BR2_TOOLCHAIN_BUILDROOT_MUSL
 
+config BR2_TOOLCHAIN_BUILDROOT_GOLD
+	bool "GOLD linker (experimental)"
+	depends on BR2_BINUTILS_SUPPORTS_GOLD
+	depends on BR2_GCC_SUPPORTS_GOLD
+	depends on BR2_arm || BR2_armeb || BR2_i386 || BR2_x86_64
+	help
+	  This option selects the gold ELF only linker from the
+	  binutils package. This is currently in beta. This
+	  option will only build and install the gold linker.
+
+	  http://sourceware.org/binutils/
+
+
+config BR2_TOOLCHAIN_BUILDROOT_LTO
+	bool "Link Time Optimisations (LTO) (experimental)"
+	depends on BR2_TOOLCHAIN_BUILDROOT_GOLD
+	depends on BR2_arm || BR2_armeb || BR2_i386 || BR2_x86_64
+	help
+	  This option builds GCC with suppport for Link Time
+	  Optimisation (LTO). To enable this option you must be using
+	  gold as the linker and enable the use of the linker plugin
+	  by compiling with the -fuse-linker-plugin flag.
+
+	  http://gcc.gnu.org/wiki/LinkTimeOptimization
+
 source "package/uclibc/Config.in"
 source "package/glibc/Config.in"
 source "package/binutils/Config.in.host"
