]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: depend on runtime/cgo if external linking mode is forced
authorIan Lance Taylor <iant@golang.org>
Mon, 20 Apr 2015 18:47:08 +0000 (11:47 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 21 Apr 2015 17:35:33 +0000 (17:35 +0000)
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>

src/cmd/go/build.go
src/cmd/go/pkg.go

index 6734d53d5b2640c97f0caa367dbb9bd849751353..e470cacda81bc5dd5344cc3656df0165f89b6d8b 100644 (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{}
        }
index 8bf0f568f792041a5581b1dd1d352e415d0e9035..11986ccfbf6d72bf554d57fc981ac57dbd47b8a4 100644 (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")