Commit 8bbd8006 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/go: put user ldflags at the end of the linker invocation

If the user provided a key but no value via -ldflag -X,
another linker flag was used as the value.

Placing the user's flags at the end avoids this problem.
It also provides the user the opportunity to
override existing linker flags.

Fixes #8810.

Change-Id: I96f4190713dc9a9c29142e56658446fba7fb6bc8
Reviewed-on: https://go-review.googlesource.com/2242Reviewed-by: 's avatarMinux Ma <minux@golang.org>
parent 79c4fad8
......@@ -1776,9 +1776,7 @@ func (gcToolchain) ld(b *builder, p *Package, out string, allactions []*action,
cxx = true
}
}
ldflags := buildLdflags
// Limit slice capacity so that concurrent appends do not race on the shared array.
ldflags = ldflags[:len(ldflags):len(ldflags)]
var ldflags []string
if buildContext.InstallSuffix != "" {
ldflags = append(ldflags, "-installsuffix", buildContext.InstallSuffix)
}
......@@ -1824,6 +1822,7 @@ func (gcToolchain) ld(b *builder, p *Package, out string, allactions []*action,
}
}
}
ldflags = append(ldflags, buildLdflags...)
return b.run(".", p.ImportPath, nil, tool(archChar+"l"), "-o", out, importArgs, ldflags, mainpkg)
}
......
......@@ -16,6 +16,7 @@ import (
)
func main() {
// Successful run
cmd := exec.Command("go", "run", "-ldflags=-X main.tbd hello -X main.overwrite trumped -X main.nosuchsymbol neverseen", "linkx.go")
out, err := cmd.CombinedOutput()
if err != nil {
......@@ -30,4 +31,12 @@ func main() {
fmt.Printf("got %q want %q\n", got, want)
os.Exit(1)
}
// Issue 8810
cmd = exec.Command("go", "run", "-ldflags=-X main.tbd", "linkx.go")
_, err = cmd.CombinedOutput()
if err == nil {
fmt.Println("-X linker flag should not accept keys without values")
os.Exit(1)
}
}
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