objformat: Add LINKERVER environment variable recognition
authorJohn Marino <draco@marino.st>
Sun, 12 Feb 2012 09:48:33 +0000 (10:48 +0100)
committerJohn Marino <draco@marino.st>
Sun, 12 Feb 2012 11:48:25 +0000 (12:48 +0100)
objformat will now scan for the LINKERVER environment variable.  If this
variable exists *AND* it has the value of "ld.gold", the command "ld"
will point at the gold linker.  In every other case, it will point at
the classic "gnu ld" linker.

The relative command position of "ld" was moved to after the compiler
group because it's a popular command and having it towards the front
means less time in the search loop.

usr.bin/objformat/objformat.1
usr.bin/objformat/objformat.c

index 2f145c6..834406f 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 May 23, 2009
+.Dd Feb 12, 2012
 .Dt OBJFORMAT 1
 .Os
 .Sh NAME
@@ -84,6 +84,12 @@ component to be used for binutils paths.
 The
 .Dq <ccver>
 component to be used for compiler paths.
+.It Ev LINKERVER
+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.
 .It Ev OBJFORMAT_PATH
 If
 .Ev OBJFORMAT_PATH
index ba80010..ed0d2de 100644 (file)
 #define        BINUTILSVER_DEFAULT "binutils222"
 #endif
 
+#define LINKER_DEFAULT "ld.bfd"
+#define LINKER_GOLD    "ld.gold"
+
 #ifndef OBJFORMAT_PATH_DEFAULT
 #define OBJFORMAT_PATH_DEFAULT ""
 #endif
 
-enum cmd_type { OBJFORMAT, COMPILER, BINUTILS };
+enum cmd_type { OBJFORMAT, COMPILER, BINUTILS, LINKER };
 
 struct command {
        const char *cmd;
@@ -63,13 +66,13 @@ static struct command commands[] = {
        {"g++",         COMPILER},
        {"gcc",         COMPILER},
        {"gcov",        COMPILER},
+       {"ld",          LINKER},
        {"addr2line",   BINUTILS},
        {"ar",          BINUTILS},
        {"as",          BINUTILS},
        {"c++filt",     BINUTILS},
        {"elfedit",     BINUTILS},
        {"gprof",       BINUTILS},
-       {"ld",          BINUTILS},
        {"nm",          BINUTILS},
        {"objcopy",     BINUTILS},
        {"objdump",     BINUTILS},
@@ -86,13 +89,17 @@ static struct command commands[] = {
 int
 main(int argc, char **argv)
 {
+       char ld_orig[] = LINKER_DEFAULT;
+       char ld_gold[] = LINKER_GOLD;
        struct command *cmds;
        char objformat[32];
        char *path, *chunk;
        char *cmd, *newcmd = NULL;
+       char *ldcmd = ld_orig;
        const char *objformat_path;
        const char *ccver;
        const char *buver;
+       const char *ldver;
        const char *env_value = NULL;
        const char *base_path = NULL;
        int use_objformat = 0;
@@ -116,9 +123,8 @@ main(int argc, char **argv)
 
        if ((ccver = getenv("CCVER")) == NULL || ccver[0] == 0)
                ccver = CCVER_DEFAULT;
-       if ((buver = getenv("BINUTILSVER")) == NULL) {
+       if ((buver = getenv("BINUTILSVER")) == NULL)
                buver = BINUTILSVER_DEFAULT;
-       }
 
        if (cmds) {
                switch (cmds->type) {
@@ -132,6 +138,15 @@ main(int argc, char **argv)
                        use_objformat = 1;
                        env_value = buver;
                        break;
+               case LINKER:
+                       ldver = getenv("LINKERVER");
+                       if ((ldver != NULL) && (strcmp(ldver, ld_gold) == 0))
+                           ldcmd = ld_gold;
+                       base_path = "/usr/libexec";
+                       use_objformat = 1;
+                       env_value = buver;
+                       cmd = ldcmd;
+                       break;
                case OBJFORMAT:
                        break;
                default: