Switch to using gold linker by default
authorJohn Marino <draco@marino.st>
Sat, 14 Nov 2015 14:26:33 +0000 (15:26 +0100)
committerJohn Marino <draco@marino.st>
Sun, 15 Nov 2015 08:27:09 +0000 (09:27 +0100)
DragonFly has always used the "GNU ld" linker to build itself.  Now that
the ELF boot loader has been fixed to handle zero-offset headers (seen
with zero-length ELF notes), the newer gold linker can handle being the
default.  That's what this commit does.

People can continue with the classic linker by putting the following in
/etc/make.conf:  WORLD_LDVER=ld.bfd
... and setting "LDVER=ld.bfd" in their environment.

The gold linker does not use the bfd library and thus is limited to the
ELF format (fine for DF).  It's code is much cleaner (c++), so it's easy
to understand and modify, and it reportedly links complex c++ object
files significantly faster than the BFD-based linker.  Both linkers are
written by the same person, Ian Lance Taylor.

Makefile.inc1
share/man/man5/make.conf.5
usr.bin/objformat/objformat.1
usr.bin/objformat/objformat.c

index dad0688..0c7edbc 100644 (file)
@@ -124,7 +124,7 @@ DESTDIRBASE:=               ${OBJTREE}${.CURDIR}
 
 # This section sets the tools used to build the world/kernel
 WORLD_CCVER?=          gcc50
-WORLD_LDVER?=          ld.bfd
+WORLD_LDVER?=          ld.gold
 WORLD_BINUTILSVER?=    binutils225
 
 # Set the backup parameters if they are not already defined
index a528223..346ee56 100644 (file)
@@ -135,9 +135,9 @@ is the default value.
 Controls which linker to use by default.  Currently accepted
 values are
 .Dq ld.gold
-(GNU Gold linker) and
+(GNU gold linker, default) and
 .Dq ld.bfd
-(default).
+(classic GNU ld linker).
 .It Va WORLD_LDVER
 .Pq Vt str
 Controls which linker builds the base system, including
index 45280b2..c660701 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/usr.bin/objformat/objformat.1,v 1.3.2.4 2002/06/21 15:28:32 charnier Exp $
 .\"
-.Dd February 24, 2012
+.Dd November 14, 2015
 .Dt OBJFORMAT 1
 .Os
 .Sh NAME
@@ -86,10 +86,13 @@ The
 component to be used for compiler paths.
 .It Ev LDVER
 If this variable is defined as
-.Dq ld.gold
-then the ld command will be an alias for the gold linker.  If it is
-undefined or any other value, the ld command will execute the classic
-gnu linker.
+.Dq ld.bfd
+then the ld command will be an alias for the classic
+.Dq GNU ld
+linker. If it is undefined or any other value, the ld command will
+execute the newer
+.Dq GNU gold
+linker.
 .It Ev OBJFORMAT_PATH
 If
 .Ev OBJFORMAT_PATH
index 4de25d9..aa4937a 100644 (file)
 #define        BINUTILSVER_DEFAULT "binutils225"
 #endif
 
-#define LINKER_DEFAULT "ld.bfd"
+#define LINKER_BFD     "ld.bfd"
 #define LINKER_GOLD    "ld.gold"
+#define LINKER_DEFAULT LINKER_GOLD
+#define LINKER_ALT     LINKER_BFD
 
 #ifndef OBJFORMAT_PATH_DEFAULT
 #define OBJFORMAT_PATH_DEFAULT ""
@@ -94,13 +96,13 @@ static struct command commands[] = {
 int
 main(int argc, char **argv)
 {
-       char ld_orig[] = LINKER_DEFAULT;
-       char ld_gold[] = LINKER_GOLD;
+       char ld_def[] = LINKER_DEFAULT;
+       char ld_alt[] = LINKER_ALT;
        struct command *cmds;
        char objformat[32];
        char *path, *chunk;
        char *cmd, *newcmd = NULL;
-       char *ldcmd = ld_orig;
+       char *ldcmd = ld_def;
        const char *objformat_path;
        const char *ccver;
        const char *buver;
@@ -149,8 +151,8 @@ main(int argc, char **argv)
                        if (buver == NULL)
                            buver = BINUTILSVER_DEFAULT;
                        ldver = getenv("LDVER");
-                       if ((ldver != NULL) && (strcmp(ldver, ld_gold) == 0))
-                           ldcmd = ld_gold;
+                       if ((ldver != NULL) && (strcmp(ldver, ld_alt) == 0))
+                           ldcmd = ld_alt;
                        base_path = "/usr/libexec";
                        use_objformat = 1;
                        env_value = buver;