diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index 2ffba875c5234539d1aad3e2628874365142486d..52c6f4cd14b85b5f5ff8dc791cae2e4f4767c2bf 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -917,14 +917,12 @@ func strnput(s string, n int) {
 	}
 }
 
-var addstrdata_name string
-
 func addstrdata1(arg string) {
-	if strings.HasPrefix(arg, "VALUE:") {
-		addstrdata(addstrdata_name, arg[6:])
-	} else {
-		addstrdata_name = arg
+	i := strings.Index(arg, "=")
+	if i < 0 {
+		Exitf("-X flag requires argument of the form importpath.name=value")
 	}
+	addstrdata(arg[:i], arg[i+1:])
 }
 
 func addstrdata(name string, value string) {
diff --git a/src/cmd/link/internal/ld/pobj.go b/src/cmd/link/internal/ld/pobj.go
index 60d584fc73e7787fbee9b72044bc6a6a9be9fb9e..20f060cb05c10864af55f019f6220b70d2466929 100644
--- a/src/cmd/link/internal/ld/pobj.go
+++ b/src/cmd/link/internal/ld/pobj.go
@@ -102,7 +102,7 @@ func Ldmain() {
 	obj.Flagint64("T", "set text segment `address`", &INITTEXT)
 	obj.Flagfn0("V", "print version and exit", doversion)
 	obj.Flagcount("W", "disassemble input", &Debug['W'])
-	obj.Flagfn1("X", "set the value of a string variable; the next two arguments are its name and value", addstrdata1)
+	obj.Flagfn1("X", "add string value `definition` of the form importpath.name=value", addstrdata1)
 	obj.Flagcount("Z", "clear stack frame on entry", &Debug['Z'])
 	obj.Flagcount("a", "disassemble output", &Debug['a'])
 	obj.Flagstr("buildid", "record `id` as Go toolchain build id", &buildid)
@@ -132,21 +132,39 @@ func Ldmain() {
 	obj.Flagcount("v", "print link trace", &Debug['v'])
 	obj.Flagcount("w", "disable DWARF generation", &Debug['w'])
 
-	// Clumsy hack to preserve old behavior of -X taking two arguments.
+	obj.Flagstr("cpuprofile", "write cpu profile to `file`", &cpuprofile)
+	obj.Flagstr("memprofile", "write memory profile to `file`", &memprofile)
+	obj.Flagint64("memprofilerate", "set runtime.MemProfileRate to `rate`", &memprofilerate)
+
+	// Clumsy hack to preserve old two-argument -X name val syntax for old scripts.
+	// Rewrite that syntax into new syntax -X name=val.
+	// TODO(rsc): Delete this hack in Go 1.6 or later.
+	var args []string
 	for i := 0; i < len(os.Args); i++ {
 		arg := os.Args[i]
-		if (arg == "--X" || arg == "-X") && i+2 < len(os.Args) {
-			os.Args[i+2] = "-X=VALUE:" + os.Args[i+2]
+		if (arg == "-X" || arg == "--X") && i+2 < len(os.Args) && !strings.Contains(os.Args[i+1], "=") {
+			fmt.Fprintf(os.Stderr, "link: warning: option %s %s %s may not work in future releases; use %s %s=%s\n",
+				arg, os.Args[i+1], os.Args[i+2],
+				arg, os.Args[i+1], os.Args[i+2])
+			args = append(args, arg)
+			args = append(args, os.Args[i+1]+"="+os.Args[i+2])
 			i += 2
-		} else if (strings.HasPrefix(arg, "--X=") || strings.HasPrefix(arg, "-X=")) && i+1 < len(os.Args) {
-			os.Args[i+1] = "-X=VALUE:" + os.Args[i+1]
+			continue
+		}
+		if (strings.HasPrefix(arg, "-X=") || strings.HasPrefix(arg, "--X=")) && i+1 < len(os.Args) && strings.Count(arg, "=") == 1 {
+			fmt.Fprintf(os.Stderr, "link: warning: option %s %s may not work in future releases; use %s=%s\n",
+				arg, os.Args[i+1],
+				arg, os.Args[i+1])
+			args = append(args, arg+"="+os.Args[i+1])
 			i++
+			continue
 		}
+		args = append(args, arg)
 	}
-	obj.Flagstr("cpuprofile", "write cpu profile to `file`", &cpuprofile)
-	obj.Flagstr("memprofile", "write memory profile to `file`", &memprofile)
-	obj.Flagint64("memprofilerate", "set runtime.MemProfileRate to `rate`", &memprofilerate)
+	os.Args = args
+
 	obj.Flagparse(usage)
+
 	startProfile()
 	Ctxt.Bso = &Bso
 	Ctxt.Debugvlog = int32(Debug['v'])
diff --git a/test/linkx.go b/test/linkx.go
index 151b6db1eca8aaa793258d1aa6eeb89ece04f64d..40ec1b99f69219112d777e0c6ca09ee7dc150988 100644
--- a/test/linkx.go
+++ b/test/linkx.go
@@ -9,10 +9,12 @@
 
 package main
 
+import "fmt"
+
 var tbd string
 var overwrite string = "dibs"
 
 func main() {
-	println(tbd)
-	println(overwrite)
+	fmt.Println(tbd)
+	fmt.Println(overwrite)
 }
diff --git a/test/linkx_run.go b/test/linkx_run.go
index f3029f50a97a8269ff3a1878b6b7d9edef9ebd7d..cc0f55cf9281f309e362472c2332b5ce3c5aaf8b 100644
--- a/test/linkx_run.go
+++ b/test/linkx_run.go
@@ -10,23 +10,33 @@
 package main
 
 import (
+	"bytes"
 	"fmt"
 	"os"
 	"os/exec"
 )
 
 func main() {
+	test(" ") // old deprecated syntax
+	test("=") // new syntax
+}
+
+func test(sep string) {
 	// 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()
+	cmd := exec.Command("go", "run", "-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
+	var out, errbuf bytes.Buffer
+	cmd.Stdout = &out
+	cmd.Stderr = &errbuf
+	err := cmd.Run()
 	if err != nil {
-		fmt.Println(string(out))
+		fmt.Println(errbuf.String())
+		fmt.Println(out.String())
 		fmt.Println(err)
 		os.Exit(1)
 	}
 
 	want := "hello\ntrumped\n"
-	got := string(out)
+	got := out.String()
 	if got != want {
 		fmt.Printf("got %q want %q\n", got, want)
 		os.Exit(1)