Commit 1773cdd0 authored by Russ Cox's avatar Russ Cox

cmd/link: fix -X importpath.name=value when import path needs escaping

After the final slash, dots are %-escaped when constructing a symbol name,
so that in the actual symbol table, the import path githost.com/my.git
becomes githost.com/my%2egit. In this case, -X githost.com/my.git.Value=foo
needs to set githost.com/my%2egit.Value. This is a detail of the object format
and not something users should know or depend on, so apply the escaping
as needed.

People who have run across this already and figured out and started using
the escaped forms with -X will find those forms not working anymore.
That is, -X githost.com/my%2egit.Value=foo is the Go 1.7 workaround but
will stop working in Go 1.8 once this proper fix is in place.
People who need to keep scripts working with older and newer versions of Go
can safely pass both forms, and one will be ignored:

    -X githost.com/my%2egit.Value=foo -X githost.com/my.git.Value=foo

Fixes #16710.

Change-Id: I0e994ccdd412a4eb8349fefce9aeb3bfc9a83cd8
Reviewed-on: https://go-review.googlesource.com/31970
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 03d641b9
...@@ -3432,3 +3432,21 @@ func TestMatchesOnlySubtestParallelIsOK(t *testing.T) { ...@@ -3432,3 +3432,21 @@ func TestMatchesOnlySubtestParallelIsOK(t *testing.T) {
tg.grepBothNot(noMatchesPattern, "go test did say [no tests to run]") tg.grepBothNot(noMatchesPattern, "go test did say [no tests to run]")
tg.grepBoth(okPattern, "go test did not say ok") tg.grepBoth(okPattern, "go test did not say ok")
} }
func TestLinkXImportPathEscape(t *testing.T) {
// golang.org/issue/16710
tg := testgo(t)
defer tg.cleanup()
tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
exe := "./linkx" + exeSuffix
tg.creatingTemp(exe)
tg.run("build", "-o", exe, "-ldflags", "-X=my.pkg.Text=linkXworked", "my.pkg/main")
out, err := exec.Command(exe).CombinedOutput()
if err != nil {
tg.t.Fatal(err)
}
if string(out) != "linkXworked\n" {
tg.t.Log(string(out))
tg.t.Fatal(`incorrect output: expected "linkXworked\n"`)
}
}
package main
import "my.pkg"
func main() {
println(pkg.Text)
}
package pkg
var Text = "unset"
...@@ -1025,11 +1025,12 @@ func strnputPad(s string, n int, pad []byte) { ...@@ -1025,11 +1025,12 @@ func strnputPad(s string, n int, pad []byte) {
var strdata []*Symbol var strdata []*Symbol
func addstrdata1(ctxt *Link, arg string) { func addstrdata1(ctxt *Link, arg string) {
i := strings.Index(arg, "=") eq := strings.Index(arg, "=")
if i < 0 { dot := strings.LastIndex(arg[:eq+1], ".")
if eq < 0 || dot < 0 {
Exitf("-X flag requires argument of the form importpath.name=value") Exitf("-X flag requires argument of the form importpath.name=value")
} }
addstrdata(ctxt, arg[:i], arg[i+1:]) addstrdata(ctxt, pathtoprefix(arg[:dot])+arg[dot:eq], arg[eq+1:])
} }
func addstrdata(ctxt *Link, name string, value string) { func addstrdata(ctxt *Link, name string, value string) {
......
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