+++ /dev/null
---- gcc-4.2.0-20070316/gcc/config/alpha/linux-elf.h.orig 2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/alpha/linux-elf.h 2007-04-18 07:14:56.875631582 -0400
-@@ -40,7 +40,7 @@
-
- #define ELF_DYNAMIC_LINKER LINUX_DYNAMIC_LINKER
-
--#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
-+#define LINK_SPEC "-m elf64alpha --hash-style=gnu %{G*} %{relax:-relax} \
- %{O*:-O3} %{!O*:-O1} \
- %{shared:-shared} \
- %{!shared: \
---- gcc-4.2.0-20070316/gcc/config/s390/linux.h.orig 2006-12-12 10:21:53.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/s390/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -78,7 +78,7 @@
-
- #undef LINK_SPEC
- #define LINK_SPEC \
-- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
-+ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --hash-style=gnu \
- %{shared:-shared} \
- %{!shared: \
- %{static:-static} \
---- gcc-4.2.0-20070316/gcc/config/sparc/linux.h.orig 2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/sparc/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -133,7 +133,7 @@
-
-
- #undef LINK_SPEC
--#define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
-+#define LINK_SPEC "-m elf32_sparc --hash-style=gnu -Y P,/usr/lib %{shared:-shared} \
- %{!mno-relax:%{!r:-relax}} \
- %{!shared: \
- %{!ibcs: \
---- gcc-4.2.0-20070316/gcc/config/sparc/linux64.h.orig 2006-03-02 17:47:02.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/sparc/linux64.h 2007-04-18 07:16:49.644880415 -0400
-@@ -121,7 +121,7 @@
- { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \
- { "link_arch", LINK_ARCH_SPEC },
-
--#define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,%R/usr/lib %{shared:-shared} \
-+#define LINK_ARCH32_SPEC "-m elf32_sparc --hash-style=gnu -Y P,%R/usr/lib %{shared:-shared} \
- %{!shared: \
- %{!ibcs: \
- %{!static: \
-@@ -130,7 +130,7 @@
- %{static:-static}}} \
- "
-
--#define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \
-+#define LINK_ARCH64_SPEC "-m elf64_sparc --hash-style=gnu -Y P,%R/usr/lib64 %{shared:-shared} \
- %{!shared: \
- %{!ibcs: \
- %{!static: \
-@@ -211,7 +211,7 @@
- #else /* !SPARC_BI_ARCH */
-
- #undef LINK_SPEC
--#define LINK_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \
-+#define LINK_SPEC "-m elf64_sparc --hash-style=gnu -Y P,%R/usr/lib64 %{shared:-shared} \
- %{!shared: \
- %{!ibcs: \
- %{!static: \
---- gcc-4.2.0-20070316/gcc/config/i386/linux.h.orig 2006-04-06 18:16:11.000000000 -0400
-+++ gcc-4.2.0-20070316/gcc/config/i386/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -109,7 +109,7 @@
- { "dynamic_linker", LINUX_DYNAMIC_LINKER }
-
- #undef LINK_SPEC
--#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
-+#define LINK_SPEC "-m %(link_emulation) --hash-style=gnu %{shared:-shared} \
- %{!shared: \
- %{!ibcs: \
- %{!static: \
---- gcc-4.2.0-20070316/gcc/config/i386/linux64.h.orig 2006-02-18 06:12:51.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/i386/linux64.h 2007-04-18 07:14:56.875631582 -0400
-@@ -65,7 +65,7 @@
- #endif
-
- #undef LINK_SPEC
--#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} \
-+#define LINK_SPEC "%{" SPEC_64 ":-m elf_x86_64} %{" SPEC_32 ":-m elf_i386} --hash-style=gnu \
- %{shared:-shared} \
- %{!shared: \
- %{!static: \
---- gcc-4.2.0-20070316/gcc/config/ia64/linux.h.orig 2006-12-12 10:21:53.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/ia64/linux.h 2007-04-18 07:14:56.875631582 -0400
-@@ -40,7 +40,7 @@
- #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
-
- #undef LINK_SPEC
--#define LINK_SPEC "\
-+#define LINK_SPEC "--hash-style=gnu \
- %{shared:-shared} \
- %{!shared: \
- %{!static: \
---- gcc-4.2.0-20070316/gcc/config/rs6000/sysv4.h.orig 2007-03-09 19:59:15.000000000 -0500
-+++ gcc-4.2.0-20070316/gcc/config/rs6000/sysv4.h 2007-04-18 07:14:56.872300144 -0400
-@@ -902,7 +902,7 @@
- #define LINUX_DYNAMIC_LINKER \
- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
-
--#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \
- %{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}"
-
---- gcc-4.2.0-20070316/gcc/config/rs6000/linux64.h.orig 2006-07-14 11:54:23.000000000 -0400
-+++ gcc-4.2.0-20070316/gcc/config/rs6000/linux64.h 2007-04-18 07:18:14.042413298 -0400
-@@ -351,11 +351,11 @@
- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
-
-
--#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux --hash-style=gnu %{!shared: %{!static: \
- %{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}"
-
--#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \
-+#define LINK_OS_LINUX_SPEC64 "-m elf64ppc --hash-style=gnu %{!shared: %{!static: \
- %{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}"
-
--- /dev/null
+http://patchwork.ozlabs.org/patch/102292/
+http://codereview.appspot.com/4664051/
+http://sourceware.org/ml/binutils/2011-01/msg00178.html
+http://anonscm.debian.org/viewvc/gcccvs/branches/sid/gcc-4.6/debian/patches/gold-and-ld.diff
+
+Index: gcc/doc/invoke.texi
+===================================================================
+--- gcc/doc/invoke.texi (revision 175346)
++++ gcc/doc/invoke.texi (working copy)
+@@ -418,7 +418,7 @@
+ -funit-at-a-time -funroll-all-loops -funroll-loops @gol
+ -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops @gol
+ -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol
+--fwhole-program -fwpa -fuse-linker-plugin @gol
++-fwhole-program -fwpa -fuse-ld -fuse-linker-plugin @gol
+ --param @var{name}=@var{value}
+ -O -O0 -O1 -O2 -O3 -Os -Ofast}
+
+@@ -8017,6 +8017,16 @@
+
+ Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
+
++@item -fuse-ld=gold
++Use the @command{gold} linker instead of the default linker.
++This option is only necessary if GCC has been configured with
++@option{--enable-gold} and @option{--enable-ld=default}.
++
++@item -fuse-ld=bfd
++Use the @command{ld.bfd} linker instead of the default linker.
++This option is only necessary if GCC has been configured with
++@option{--enable-gold} and @option{--enable-ld}.
++
+ @item -fcprop-registers
+ @opindex fcprop-registers
+ After register allocation and post-register allocation instruction splitting,
+Index: gcc/configure
+===================================================================
+--- gcc/configure (revision 175346)
++++ gcc/configure (working copy)
+@@ -681,6 +681,7 @@
+ gcc_cv_objdump
+ ORIGINAL_NM_FOR_TARGET
+ gcc_cv_nm
++ORIGINAL_GOLD_FOR_TARGET
+ ORIGINAL_LD_FOR_TARGET
+ ORIGINAL_PLUGIN_LD_FOR_TARGET
+ gcc_cv_ld
+@@ -21131,6 +21132,21 @@
+ fi
+ fi
+
++gcc_cv_ld_gold_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gold
++
++if test "${gcc_cv_gold+set}" = set; then :
++
++else
++
++if test -f $gcc_cv_ld_gold_srcdir/configure.ac \
++ && test -f ../gold/Makefile \
++ && test x$build = x$host; then
++ gcc_cv_gold=../gold/ld-new$build_exeext
++else
++ gcc_cv_gold=''
++fi
++fi
++
+ ORIGINAL_PLUGIN_LD_FOR_TARGET=$gcc_cv_ld
+ PLUGIN_LD=`basename $gcc_cv_ld`
+
+@@ -21170,6 +21186,9 @@
+ ;;
+ esac
+
++ORIGINAL_GOLD_FOR_TARGET=$gcc_cv_gold
++
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking what linker to use" >&5
+ $as_echo_n "checking what linker to use... " >&6; }
+ if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then
+Index: gcc/gcc.c
+===================================================================
+--- gcc/gcc.c (revision 175346)
++++ gcc/gcc.c (working copy)
+@@ -657,6 +657,9 @@
+ }"PLUGIN_COND_CLOSE" \
+ %{flto|flto=*:%<fcompare-debug*} \
+ %{flto} %{flto=*} %l " LINK_PIE_SPEC \
++ "%{fuse-ld=gold:%{fuse-ld=bfd:%e-fuse-ld=gold and -fuse-ld=bfd may not be used together}} \
++ %{fuse-ld=gold:-use-gold} \
++ %{fuse-ld=bfd:-use-ld}" \
+ "%X %{o*} %{e*} %{N} %{n} %{r}\
+ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}}\
+ %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
+Index: gcc/opts.c
+===================================================================
+--- gcc/opts.c (revision 175346)
++++ gcc/opts.c (working copy)
+@@ -1729,8 +1729,9 @@
+ dc->max_errors = value;
+ break;
+
++ case OPT_fuse_ld_:
+ case OPT_fuse_linker_plugin:
+- /* No-op. Used by the driver and passed to us because it starts with f.*/
++ /* No-op. Used by the driver and passed to us because it starts with f. */
+ break;
+
+ case OPT_Wuninitialized:
+Index: gcc/configure.ac
+===================================================================
+--- gcc/configure.ac (revision 175346)
++++ gcc/configure.ac (working copy)
+@@ -1974,6 +1974,17 @@
+ AC_PATH_PROG(gcc_cv_ld, $LD_FOR_TARGET)
+ fi])
+
++gcc_cv_ld_gold_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gold
++
++AS_VAR_SET_IF(gcc_cv_gold,, [
++if test -f $gcc_cv_ld_gold_srcdir/configure.ac \
++ && test -f ../gold/Makefile \
++ && test x$build = x$host; then
++ gcc_cv_gold=../gold/ld-new$build_exeext
++else
++ gcc_cv_gold=''
++fi])
++
+ ORIGINAL_PLUGIN_LD_FOR_TARGET=$gcc_cv_ld
+ PLUGIN_LD=`basename $gcc_cv_ld`
+ AC_ARG_WITH(plugin-ld,
+@@ -2003,6 +2014,9 @@
+ *) AC_CONFIG_FILES(collect-ld:exec-tool.in, [chmod +x collect-ld]) ;;
+ esac
+
++ORIGINAL_GOLD_FOR_TARGET=$gcc_cv_gold
++AC_SUBST(ORIGINAL_GOLD_FOR_TARGET)
++
+ AC_MSG_CHECKING(what linker to use)
+ if test "$gcc_cv_ld" = ../ld/ld-new$build_exeext; then
+ # Single tree build which includes ld. We want to prefer it
+Index: gcc/exec-tool.in
+===================================================================
+--- gcc/exec-tool.in (revision 175346)
++++ gcc/exec-tool.in (working copy)
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+
+-# Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc.
++# Copyright (C) 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
+ # This file is part of GCC.
+
+ # GCC is free software; you can redistribute it and/or modify
+@@ -21,11 +21,13 @@
+
+ ORIGINAL_AS_FOR_TARGET="@ORIGINAL_AS_FOR_TARGET@"
+ ORIGINAL_LD_FOR_TARGET="@ORIGINAL_LD_FOR_TARGET@"
++ORIGINAL_GOLD_FOR_TARGET="@ORIGINAL_GOLD_FOR_TARGET@"
+ ORIGINAL_PLUGIN_LD_FOR_TARGET="@ORIGINAL_PLUGIN_LD_FOR_TARGET@"
+ ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@"
+ exeext=@host_exeext@
+ fast_install=@enable_fast_install@
+ objdir=@objdir@
++version="1.1"
+
+ invoked=`basename "$0"`
+ id=$invoked
+@@ -36,15 +38,44 @@
+ dir=gas
+ ;;
+ collect-ld)
+- # when using a linker plugin, gcc will always pass '-plugin' as the
+- # first or second option to the linker.
+- if test x"$1" = "x-plugin" || test x"$2" = "x-plugin"; then
+- original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
+- else
+- original=$ORIGINAL_LD_FOR_TARGET
++ prog=ld-new$exeext
++ # Look for the a command line option
++ # specifying the linker to be used.
++ case " $* " in
++ *\ -use-gold\ *)
++ original=$ORIGINAL_GOLD_FOR_TARGET
++ dir=gold
++ ;;
++ *\ -use-ld\ * | *\ -use-ld.bfd\ *)
++ original=$ORIGINAL_LD_FOR_TARGET
++ dir=ld
++ ;;
++ *\ -plugin\ *)
++ original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
++ dir=ld
++ ;;
++ *)
++ original=$ORIGINAL_LD_FOR_TARGET
++ dir=ld
++ ;;
++ esac
++
++ # If the selected linker has not been configured then
++ # try using the others, in the order PLUGIN-LD, LD, GOLD.
++ if test x"$original" = x; then
++ if test x"$ORIGINAL_PLUGIN_LD_FOR_TARGET" != x; then
++ original=$ORIGINAL_PLUGIN_LD_FOR_TARGET
++ dir=ld
++ elif test x"$ORIGINAL_LD_FOR_TARGET" != x; then
++ original=$ORIGINAL_LD_FOR_TARGET
++ dir=ld
++ elif test x"$ORIGINAL_GOLD_FOR_TARGET" != x; then
++ original=$ORIGINAL_GOLD_FOR_TARGET
++ dir=gold
++ # Otherwise do nothing - the case statement below
++ # will issue an error message for us.
++ fi
+ fi
+- prog=ld-new$exeext
+- dir=ld
+ id=ld
+ ;;
+ nm)
+@@ -61,29 +92,58 @@
+ scriptdir=`cd "$tdir" && pwd`
+
+ if test -x $scriptdir/../$dir/$prog; then
+- test "$fast_install" = yes || exec $scriptdir/../$dir/$prog ${1+"$@"}
++ if test "$fast_install" = yes; then
++ # If libtool did everything it needs to do, there's a fast path.
++ lt_prog=$scriptdir/../$dir/$objdir/lt-$prog
+
+- # if libtool did everything it needs to do, there's a fast path
+- lt_prog=$scriptdir/../$dir/$objdir/lt-$prog
+- test -x $lt_prog && exec $lt_prog ${1+"$@"}
+-
+- # libtool has not relinked ld-new yet, but we cannot just use the
+- # previous stage (because then the relinking would just never happen!).
+- # So we take extra care to use prev-ld/ld-new *on recursive calls*.
+- eval LT_RCU="\${LT_RCU_$id}"
+- test x"$LT_RCU" = x"1" && exec $scriptdir/../prev-$dir/$prog ${1+"$@"}
+-
+- eval LT_RCU_$id=1
+- export LT_RCU_$id
+- $scriptdir/../$dir/$prog ${1+"$@"}
+- result=$?
+- exit $result
+-
++ if test -x $lt_prog; then
++ original=$lt_prog
++ else
++ # Libtool has not relinked ld-new yet, but we cannot just use the
++ # previous stage (because then the relinking would just never happen!).
++ # So we take extra care to use prev-ld/ld-new *on recursive calls*.
++ eval LT_RCU="\${LT_RCU_$id}"
++ if test x"$LT_RCU" = x"1"; then
++ original=$scriptdir/../prev-$dir/$prog
++ else
++ eval LT_RCU_$id=1
++ export LT_RCU_$id
++ case " $* " in
++ *\ -v\ *)
++ echo "$invoked $version"
++ echo $scriptdir/../$dir/$prog $*
++ ;;
++ esac
++ $scriptdir/../$dir/$prog ${1+"$@"}
++ result=$?
++ exit $result
++ fi
++ fi
++ else
++ original=$scriptdir/../$dir/$prog
++ fi
+ else
+- exec $scriptdir/../prev-$dir/$prog ${1+"$@"}
++ original=$scriptdir/../prev-$dir/$prog
+ fi
+ ;;
+- *)
+- exec $original ${1+"$@"}
++ "")
++ echo "$invoked: executable not configured"
++ exit 1
+ ;;
+ esac
++
++# If -v has been used then display our version number
++# and then echo the command we are about to invoke.
++case " $* " in
++ *\ -v\ *)
++ echo "$invoked $version"
++ echo $original $*
++ ;;
++esac
++
++if test -x $original; then
++ exec "$original" ${1+"$@"}
++else
++ echo "$invoked: unable to locate executable: $original"
++ exit 1
++fi
+Index: gcc/common.opt
+===================================================================
+--- gcc/common.opt (revision 175346)
++++ gcc/common.opt (working copy)
+@@ -2138,6 +2138,9 @@
+ Common Report Var(flag_unwind_tables) Optimization
+ Just generate unwind tables for exception handling
+
++fuse-ld=
++Common Joined Undocumented
++
+ fuse-linker-plugin
+ Common Undocumented
+
+Index: gcc/collect2.c
+===================================================================
+--- gcc/collect2.c (revision 175346)
++++ gcc/collect2.c (working copy)
+@@ -1075,17 +1075,19 @@
+ int
+ main (int argc, char **argv)
+ {
+- static const char *const ld_suffix = "ld";
+- static const char *const plugin_ld_suffix = PLUGIN_LD;
+- static const char *const real_ld_suffix = "real-ld";
++ static const char *const ld_suffix = "ld";
++ static const char *const gold_suffix = "ld.gold";
++ static const char *const bfd_ld_suffix = "ld.bfd";
++ static const char *const plugin_ld_suffix = PLUGIN_LD;
++ static const char *const real_ld_suffix = "real-ld";
+ static const char *const collect_ld_suffix = "collect-ld";
+- static const char *const nm_suffix = "nm";
+- static const char *const gnm_suffix = "gnm";
++ static const char *const nm_suffix = "nm";
++ static const char *const gnm_suffix = "gnm";
+ #ifdef LDD_SUFFIX
+- static const char *const ldd_suffix = LDD_SUFFIX;
++ static const char *const ldd_suffix = LDD_SUFFIX;
+ #endif
+- static const char *const strip_suffix = "strip";
+- static const char *const gstrip_suffix = "gstrip";
++ static const char *const strip_suffix = "strip";
++ static const char *const gstrip_suffix = "gstrip";
+
+ #ifdef CROSS_DIRECTORY_STRUCTURE
+ /* If we look for a program in the compiler directories, we just use
+@@ -1095,6 +1097,10 @@
+
+ const char *const full_ld_suffix =
+ concat(target_machine, "-", ld_suffix, NULL);
++ const char *const full_gold_suffix =
++ concat (target_machine, "-", gold_suffix, NULL);
++ const char *const full_bfd_ld_suffix =
++ concat (target_machine, "-", bfd_ld_suffix, NULL);
+ const char *const full_plugin_ld_suffix =
+ concat(target_machine, "-", plugin_ld_suffix, NULL);
+ const char *const full_nm_suffix =
+@@ -1110,15 +1116,17 @@
+ const char *const full_gstrip_suffix =
+ concat (target_machine, "-", gstrip_suffix, NULL);
+ #else
+- const char *const full_ld_suffix = ld_suffix;
++ const char *const full_ld_suffix = ld_suffix;
++ const char *const full_gold_suffix = gold_suffix;
++ const char *const full_bfd_ld_suffix = bfd_ld_suffix;
+ const char *const full_plugin_ld_suffix = plugin_ld_suffix;
+- const char *const full_nm_suffix = nm_suffix;
+- const char *const full_gnm_suffix = gnm_suffix;
++ const char *const full_nm_suffix = nm_suffix;
++ const char *const full_gnm_suffix = gnm_suffix;
+ #ifdef LDD_SUFFIX
+- const char *const full_ldd_suffix = ldd_suffix;
++ const char *const full_ldd_suffix = ldd_suffix;
+ #endif
+- const char *const full_strip_suffix = strip_suffix;
+- const char *const full_gstrip_suffix = gstrip_suffix;
++ const char *const full_strip_suffix = strip_suffix;
++ const char *const full_gstrip_suffix = gstrip_suffix;
+ #endif /* CROSS_DIRECTORY_STRUCTURE */
+
+ const char *arg;
+@@ -1132,7 +1140,13 @@
+ const char **c_ptr;
+ char **ld1_argv;
+ const char **ld1;
+- bool use_plugin = false;
++ enum linker_select
++ {
++ DFLT_LINKER,
++ PLUGIN_LINKER,
++ GOLD_LINKER,
++ BFD_LINKER
++ } selected_linker = DFLT_LINKER;
+
+ /* The kinds of symbols we will have to consider when scanning the
+ outcome of a first pass link. This is ALL to start with, then might
+@@ -1209,15 +1223,21 @@
+ else if (! strcmp (argv[i], "-flto-partition=none"))
+ no_partition = true;
+ else if ((! strncmp (argv[i], "-flto=", 6)
+- || ! strcmp (argv[i], "-flto")) && ! use_plugin)
++ || ! strcmp (argv[i], "-flto"))
++ && selected_linker != PLUGIN_LINKER)
+ lto_mode = LTO_MODE_WHOPR;
+ else if (!strncmp (argv[i], "-fno-lto", 8))
+ lto_mode = LTO_MODE_NONE;
+ else if (! strcmp (argv[i], "-plugin"))
+ {
+- use_plugin = true;
++ selected_linker = PLUGIN_LINKER;
+ lto_mode = LTO_MODE_NONE;
+ }
++ else if (! strcmp (argv[i], "-use-gold"))
++ selected_linker = GOLD_LINKER;
++ else if (! strcmp (argv[i], "-use-ld"))
++ selected_linker = BFD_LINKER;
++
+ #ifdef COLLECT_EXPORT_LIST
+ /* since -brtl, -bexport, -b64 are not position dependent
+ also check for them here */
+@@ -1299,36 +1319,109 @@
+ /* Try to discover a valid linker/nm/strip to use. */
+
+ /* Maybe we know the right file to use (if not cross). */
+- ld_file_name = 0;
++ ld_file_name = NULL;
+ #ifdef DEFAULT_LINKER
+ if (access (DEFAULT_LINKER, X_OK) == 0)
+ ld_file_name = DEFAULT_LINKER;
+- if (ld_file_name == 0)
++ if (ld_file_name == NULL)
+ #endif
+ #ifdef REAL_LD_FILE_NAME
+ ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME);
+- if (ld_file_name == 0)
++ if (ld_file_name == NULL)
+ #endif
+ /* Search the (target-specific) compiler dirs for ld'. */
+ ld_file_name = find_a_file (&cpath, real_ld_suffix);
+ /* Likewise for `collect-ld'. */
+- if (ld_file_name == 0)
++ if (ld_file_name == NULL)
+ ld_file_name = find_a_file (&cpath, collect_ld_suffix);
+ /* Search the compiler directories for `ld'. We have protection against
+ recursive calls in find_a_file. */
+- if (ld_file_name == 0)
+- ld_file_name = find_a_file (&cpath,
+- use_plugin
+- ? plugin_ld_suffix
+- : ld_suffix);
++ if (ld_file_name == NULL)
++ switch (selected_linker)
++ {
++ default:
++ case DFLT_LINKER:
++ ld_file_name = find_a_file (&cpath, ld_suffix);
++ break;
++ case PLUGIN_LINKER:
++ ld_file_name = find_a_file (&cpath, plugin_ld_suffix);
++ break;
++ case GOLD_LINKER:
++ ld_file_name = find_a_file (&cpath, gold_suffix);
++ break;
++ case BFD_LINKER:
++ ld_file_name = find_a_file (&cpath, bfd_ld_suffix);
++ break;
++ }
+ /* Search the ordinary system bin directories
+ for `ld' (if native linking) or `TARGET-ld' (if cross). */
+- if (ld_file_name == 0)
+- ld_file_name = find_a_file (&path,
+- use_plugin
+- ? full_plugin_ld_suffix
+- : full_ld_suffix);
++ if (ld_file_name == NULL)
++ switch (selected_linker)
++ {
++ default:
++ case DFLT_LINKER:
++ ld_file_name = find_a_file (&path, full_ld_suffix);
++ break;
++ case PLUGIN_LINKER:
++ ld_file_name = find_a_file (&path, full_plugin_ld_suffix);
++ break;
++ case GOLD_LINKER:
++ ld_file_name = find_a_file (&path, full_gold_suffix);
++ break;
++ case BFD_LINKER:
++ ld_file_name = find_a_file (&path, full_bfd_ld_suffix);
++ break;
++ }
++ /* If we failed to find a plugin-capable linker, try the ordinary one. */
++ if (ld_file_name == NULL && selected_linker == PLUGIN_LINKER)
++ ld_file_name = find_a_file (&cpath, ld_suffix);
+
++ if ((vflag || debug) && ld_file_name == NULL)
++ {
++ struct prefix_list * p;
++ const char * s;
++
++ notice ("collect2: warning: unable to find linker.\n");
++
++#ifdef DEFAULT_LINKER
++ notice (" Searched for this absolute executable:\n");
++ notice (" %s\n", DEFAULT_LINKER);
++#endif
++
++ notice (" Searched in these paths:\n");
++ for (p = cpath.plist; p != NULL; p = p->next)
++ notice (" %s\n", p->prefix);
++ notice (" For these executables:\n");
++ notice (" %s\n", real_ld_suffix);
++ notice (" %s\n", collect_ld_suffix);
++ switch (selected_linker)
++ {
++ default:
++ case DFLT_LINKER: s = ld_suffix; break;
++ case PLUGIN_LINKER: s = plugin_ld_suffix; break;
++ case GOLD_LINKER: s = gold_suffix; break;
++ case BFD_LINKER: s = bfd_ld_suffix; break;
++ }
++ notice (" %s\n", s);
++
++ notice (" And searched in these paths:\n");
++ for (p = path.plist; p != NULL; p = p->next)
++ notice (" %s\n", p->prefix);
++ notice (" For these executables:\n");
++#ifdef REAL_LD_FILE_NAME
++ notice (" %s\n", REAL_LD_FILE_NAME);
++#endif
++ switch (selected_linker)
++ {
++ default:
++ case DFLT_LINKER: s = full_ld_suffix; break;
++ case PLUGIN_LINKER: s = full_plugin_ld_suffix; break;
++ case GOLD_LINKER: s = full_gold_suffix; break;
++ case BFD_LINKER: s = full_bfd_ld_suffix; break;
++ }
++ notice (" %s\n", s);
++ }
++
+ #ifdef REAL_NM_FILE_NAME
+ nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME);
+ if (nm_file_name == 0)