Commit 69690120 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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
parent 813590b1
...@@ -45,6 +45,10 @@ int nlibdir = 0; ...@@ -45,6 +45,10 @@ int nlibdir = 0;
static int maxlibdir = 0; static int maxlibdir = 0;
static int cout = -1; 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); static void hostlinksetup(void);
char* goroot; char* goroot;
...@@ -295,6 +299,19 @@ loadlib(void) ...@@ -295,6 +299,19 @@ loadlib(void)
loadinternal("math"); loadinternal("math");
if(flag_race) if(flag_race)
loadinternal("runtime/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++) { for(i=0; i<libraryp; i++) {
if(debug['v']) if(debug['v'])
...@@ -303,13 +320,10 @@ loadlib(void) ...@@ -303,13 +320,10 @@ loadlib(void)
objfile(library[i].file, library[i].pkg); 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) { if(linkmode == LinkAuto) {
if(iscgo && externalobj)
linkmode = LinkExternal;
else
linkmode = LinkInternal; linkmode = LinkInternal;
} }
...@@ -532,8 +546,8 @@ ldhostobj(void (*ld)(Biobuf*, char*, int64, char*), Biobuf *f, char *pkg, int64 ...@@ -532,8 +546,8 @@ ldhostobj(void (*ld)(Biobuf*, char*, int64, char*), Biobuf *f, char *pkg, int64
} }
} }
if(!isinternal && linkmode == LinkAuto) if(!isinternal)
linkmode = LinkExternal; externalobj = 1;
if(nhostobj >= mhostobj) { if(nhostobj >= mhostobj) {
if(mhostobj == 0) if(mhostobj == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment