aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-11-10 09:59:42 -0800
committerIan Lance Taylor <iant@golang.org>2016-11-10 18:46:00 +0000
commitb77bff97c4817656dd3bf49f14d1834c411be084 (patch)
tree4150a5a07eb2bc24577fcabce756efaae751c334
parenta0d2e9699f1cc83a854c52843ff15d07f83bce47 (diff)
downloadgo-b77bff97c4817656dd3bf49f14d1834c411be084.tar.gz
go-b77bff97c4817656dd3bf49f14d1834c411be084.zip
cmd/go: -ldflags=-linkmode=external requires runtime/cgo
We add runtime/cgo to the list of import paths for various cases that imply external linking mode, but before this change we did not add for an explicit request of external linking mode. This fixes the case where you are using a non-default buildmode that implies a different compilation option (for example, -buildmode=pie implies -shared) and the runtime/cgo package for that option is stale. No test, as I'm not sure how to write one. It would require forcing a stale runtime/cgo. Change-Id: Id0409c7274ce67fe15d910baf587d3220cb53d83 Reviewed-on: https://go-review.googlesource.com/33070 Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com>
-rw-r--r--src/cmd/go/pkg.go19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/cmd/go/pkg.go b/src/cmd/go/pkg.go
index 079412ce8a..23d3114682 100644
--- a/src/cmd/go/pkg.go
+++ b/src/cmd/go/pkg.go
@@ -913,11 +913,22 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
importPaths = append(importPaths, "syscall")
}
- // Currently build modes c-shared, pie, plugin, and -linkshared force
- // external linking mode, and external linking mode forces an
- // import of runtime/cgo.
+ // Currently build modes c-shared, pie (on systems that do not
+ // support PIE with internal linking mode), plugin, and
+ // -linkshared force external linking mode, as of course does
+ // -ldflags=-linkmode=external. External linking mode forces
+ // an import of runtime/cgo.
pieCgo := buildBuildmode == "pie" && (buildContext.GOOS != "linux" || buildContext.GOARCH != "amd64")
- if p.Name == "main" && !p.Goroot && (buildBuildmode == "c-shared" || buildBuildmode == "plugin" || pieCgo || buildLinkshared) {
+ linkmodeExternal := false
+ for i, a := range buildLdflags {
+ if a == "-linkmode=external" {
+ linkmodeExternal = true
+ }
+ if a == "-linkmode" && i+1 < len(buildLdflags) && buildLdflags[i+1] == "external" {
+ linkmodeExternal = true
+ }
+ }
+ if p.Name == "main" && !p.Goroot && (buildBuildmode == "c-shared" || buildBuildmode == "plugin" || pieCgo || buildLinkshared || linkmodeExternal) {
importPaths = append(importPaths, "runtime/cgo")
}