cmd/go: skip writing dwarf debug info for ephemeral binaries
Update #6853
For an ephemeral binary - one created, run, and then deleted -
there is no need to write dwarf debug information, since the
binary will not be used with gdb. In this case, instruct the linker
not to spend time and disk space generating the debug information
by passing the -w flag to the linker.
Omitting dwarf information reduces the size of most binaries by 25%.
We may be more aggressive about this in the future.
LGTM=bradfitz, r
R=r, bradfitz
CC=golang-codereviews
https://golang.org/cl/65890043
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index 824351b..dcc24d9 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -1714,6 +1714,10 @@
if buildContext.InstallSuffix != "" {
ldflags = append(ldflags, "-installsuffix", buildContext.InstallSuffix)
}
+ if p.omitDWARF {
+ ldflags = append(ldflags, "-w")
+ }
+
// If the user has not specified the -extld option, then specify the
// appropriate linker. In case of C++ code, use the compiler named
// by the CXX environment variable or defaultCXX if CXX is not set.
diff --git a/src/cmd/go/pkg.go b/src/cmd/go/pkg.go
index 0190b67..3ff3862 100644
--- a/src/cmd/go/pkg.go
+++ b/src/cmd/go/pkg.go
@@ -89,6 +89,7 @@
exeName string // desired name for temporary executable
coverMode string // preprocess Go source files with the coverage tool in this mode
coverVars map[string]*CoverVar // variables created by coverage analysis
+ omitDWARF bool // tell linker not to write DWARF information
}
// CoverVar holds the name of the generated coverage variables targeting the named file.
diff --git a/src/cmd/go/run.go b/src/cmd/go/run.go
index e6dadd2..8d42622 100644
--- a/src/cmd/go/run.go
+++ b/src/cmd/go/run.go
@@ -58,6 +58,7 @@
if p.Error != nil {
fatalf("%s", p.Error)
}
+ p.omitDWARF = true
for _, err := range p.DepsErrors {
errorf("%s", err)
}
diff --git a/src/cmd/go/test.go b/src/cmd/go/test.go
index dcba12e..26b7f87 100644
--- a/src/cmd/go/test.go
+++ b/src/cmd/go/test.go
@@ -654,6 +654,7 @@
pkgdir: testDir,
fake: true,
Stale: true,
+ omitDWARF: !testC && !testNeedBinary,
}
if pxtest != nil {
pmain.imports = append(pmain.imports, pxtest)
diff --git a/test/run.go b/test/run.go
index e5190e4..9a4d794 100644
--- a/test/run.go
+++ b/test/run.go
@@ -200,7 +200,7 @@
func linkFile(runcmd runCmd, goname string) (err error) {
pfile := strings.Replace(goname, ".go", "."+letter, -1)
- _, err = runcmd("go", "tool", ld, "-o", "a.exe", "-L", ".", pfile)
+ _, err = runcmd("go", "tool", ld, "-w", "-o", "a.exe", "-L", ".", pfile)
return
}