1
0
mirror of https://github.com/golang/go synced 2024-11-20 01:34:41 -07:00

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
This commit is contained in:
Ian Lance Taylor 2013-04-12 13:21:17 -07:00
parent 813590b145
commit 696901204f

View 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,13 +320,10 @@ 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) {
if(iscgo && externalobj)
linkmode = LinkExternal;
else
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)