]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: always do external link for -linkmode=external
authorIan Lance Taylor <iant@golang.org>
Fri, 12 Apr 2013 20:21:17 +0000 (13:21 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 12 Apr 2013 20:21:17 +0000 (13:21 -0700)
There are tests in run.bash for -linkmode=external.

Fixes #5238.

R=golang-dev, bradfitz, remyoudompheng, r
CC=golang-dev
https://golang.org/cl/8716044

src/cmd/ld/lib.c

index d22c0870f671d2e343001b6a2edcc57487b2af5d..47339d4e53a3518857144cf602efa1beb2770a86 100644 (file)
@@ -45,6 +45,10 @@ int  nlibdir = 0;
 static int     maxlibdir = 0;
 static int     cout = -1;
 
+// Set if we see an object compiled by the host compiler that is not
+// from a package that is known to support internal linking mode.
+static int     externalobj = 0;
+
 static void    hostlinksetup(void);
 
 char*  goroot;
@@ -295,6 +299,19 @@ loadlib(void)
                loadinternal("math");
        if(flag_race)
                loadinternal("runtime/race");
+       if(linkmode == LinkExternal) {
+               // This indicates a user requested -linkmode=external.
+               // The startup code uses an import of runtime/cgo to decide
+               // whether to initialize the TLS.  So give it one.  This could
+               // be handled differently but it's an unusual case.
+               loadinternal("runtime/cgo");
+               // Pretend that we really imported the package.
+               // This will do no harm if we did in fact import it.
+               s = lookup("go.importpath.runtime/cgo.", 0);
+               s->type = SDATA;
+               s->dupok = 1;
+               s->reachable = 1;
+       }
 
        for(i=0; i<libraryp; i++) {
                if(debug['v'])
@@ -303,14 +320,11 @@ loadlib(void)
                objfile(library[i].file, library[i].pkg);
        }
        
-       if(linkmode == LinkExternal && !iscgo)
-               linkmode = LinkInternal;
-
-       // If we got this far in automatic mode, there were no
-       // cgo uses that suggest we need external mode.
-       // Switch to internal.
        if(linkmode == LinkAuto) {
-               linkmode = LinkInternal;
+               if(iscgo && externalobj)
+                       linkmode = LinkExternal;
+               else
+                       linkmode = LinkInternal;
        }
 
        if(linkmode == LinkInternal) {
@@ -532,8 +546,8 @@ ldhostobj(void (*ld)(Biobuf*, char*, int64, char*), Biobuf *f, char *pkg, int64
                }
        }
 
-       if(!isinternal && linkmode == LinkAuto)
-               linkmode = LinkExternal;
+       if(!isinternal)
+               externalobj = 1;
 
        if(nhostobj >= mhostobj) {
                if(mhostobj == 0)