diff options
Diffstat (limited to 'src/cmd/link/link_test.go')
| -rw-r--r-- | src/cmd/link/link_test.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index a770c91936..7d0033f1d1 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -17,6 +17,8 @@ import ( "runtime" "strings" "testing" + + "cmd/internal/sys" ) var AuthorPaidByTheColumnInch struct { @@ -1150,3 +1152,46 @@ func TestUnlinkableObj(t *testing.T) { t.Errorf("link failed: %v. output:\n%s", err, out) } } + +// TestResponseFile tests that creating a response file to pass to the +// external linker works correctly. +func TestResponseFile(t *testing.T) { + t.Parallel() + + testenv.MustHaveGoBuild(t) + + // This test requires -linkmode=external. Currently all + // systems that support cgo support -linkmode=external. + testenv.MustHaveCGO(t) + + tmpdir := t.TempDir() + + src := filepath.Join(tmpdir, "x.go") + if err := os.WriteFile(src, []byte(`package main; import "C"; func main() {}`), 0666); err != nil { + t.Fatal(err) + } + + cmd := testenv.Command(t, testenv.GoToolPath(t), "build", "-o", "output", "x.go") + cmd.Dir = tmpdir + + // Add enough arguments to push cmd/link into creating a response file. + var sb strings.Builder + sb.WriteString(`'-ldflags=all="-extldflags=`) + for i := 0; i < sys.ExecArgLengthLimit/len("-g"); i++ { + if i > 0 { + sb.WriteString(" ") + } + sb.WriteString("-g") + } + sb.WriteString(`"'`) + cmd = testenv.CleanCmdEnv(cmd) + cmd.Env = append(cmd.Env, "GOFLAGS="+sb.String()) + + out, err := cmd.CombinedOutput() + if len(out) > 0 { + t.Logf("%s", out) + } + if err != nil { + t.Error(err) + } +} |
