1
0
mirror of https://github.com/golang/go synced 2024-11-23 21:00:06 -07:00

cmd/go: depend on runtime/cgo if external linking mode is forced

In external linking mode, the linker automatically imports
runtime/cgo.  When the user uses non-standard compilation options,
they have to know to run go install runtime/cgo.  When the go tool
adds non-standard compilation options itself, we can't force the user
to do that.  So add the dependency ourselves.

Bad news: we don't currently have a clean way to know whether we are
going to use external linking mode.  This CL duplicates logic split
between cmd/6l and cmd/internal/ld.

Good news: adding an unnecessary dependency on runtime/cgo does no
real harm.  We aren't going to force the linker to pull it in, we're
just going to build it so that its available if the linker wants it.

Change-Id: Ide676339d4e8b1c3d9792884a2cea921abb281b7
Reviewed-on: https://go-review.googlesource.com/9115
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Ian Lance Taylor 2015-04-20 11:47:08 -07:00
parent e00e65638a
commit af161c577c
2 changed files with 18 additions and 0 deletions

View File

@ -425,6 +425,16 @@ func runBuild(cmd *Command, args []string) {
if buildBuildmode == "shared" {
a = b.libaction(libname(args))
mode = depMode
// Currently build mode shared forces external linking
// mode, and external linking mode forces an import of
// runtime/cgo.
var stk importStack
p := loadPackage("runtime/cgo", &stk)
if p.Error != nil {
fatalf("load runtime/cgo: %v", p.Error)
}
a.deps = append(a.deps, b.action(mode, depMode, p))
} else {
a = &action{}
}

View File

@ -534,6 +534,14 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
if len(p.CgoFiles) > 0 && (!p.Standard || !cgoSyscallExclude[p.ImportPath]) {
importPaths = append(importPaths, "syscall")
}
// Currently build mode c-shared, or -linkshared, forces
// external linking mode, and external linking mode forces an
// import of runtime/cgo.
if p.Name == "main" && !p.Goroot && (buildBuildmode == "c-shared" || buildLinkshared) {
importPaths = append(importPaths, "runtime/cgo")
}
// Everything depends on runtime, except runtime and unsafe.
if !p.Standard || (p.ImportPath != "runtime" && p.ImportPath != "unsafe") {
importPaths = append(importPaths, "runtime")