From: Ian Lance Taylor Date: Fri, 12 Apr 2013 20:21:17 +0000 (-0700) Subject: cmd/ld: always do external link for -linkmode=external X-Git-Tag: go1.1rc2~109 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=696901204f2e7a5180ed4beb4046fbfea05841b2;p=gostls13.git cmd/ld: always do external link for -linkmode=external 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 --- diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index d22c0870f6..47339d4e53 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -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= mhostobj) { if(mhostobj == 0)