]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go, cmd/link: silence bogus Apple Xcode warning
authorRuss Cox <rsc@golang.org>
Wed, 24 Oct 2018 16:01:13 +0000 (12:01 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 25 Oct 2018 13:37:38 +0000 (13:37 +0000)
Certain installations of Xcode are affected by a bug that causes
them to print an inconsequential link-time warning that looks like:

ld: warning: text-based stub file /System/Library/Frameworks//Security.framework/Security.tbd and library file /System/Library/Frameworks//Security.framework/Security are out of sync. Falling back to library file for linking.

This has nothing to do with Go, and we've sent this repro case
to Apple:

$ pkgutil --pkg-info=com.apple.pkg.CLTools_Executables | grep version
version: 10.0.0.0.1.1535735448
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ cat > issue.c
int main() { return 0; }
^D
$ clang issue.c -framework CoreFoundation
ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation are out of sync. Falling back to library file for linking.
$

Even if Apple does release a fixed Xcode, many people are seeing
this useless warning, and we might as well make it go away.

Fixes #26073.

Change-Id: Ifc17ba7da1f6b59e233c11ebdab7241cb6656324
Reviewed-on: https://go-review.googlesource.com/c/144112
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
src/cmd/go/internal/work/exec.go
src/cmd/link/internal/ld/lib.go

index 6ae263431cc21c5b6a2232f113d532f6e36733e7..99a500f11ff75826ace1adf07e7b545c4ed2eedf 100644 (file)
@@ -2080,14 +2080,37 @@ func (b *Builder) ccompile(a *Action, p *load.Package, outfile string, flags []s
 }
 
 // gccld runs the gcc linker to create an executable from a set of object files.
-func (b *Builder) gccld(p *load.Package, objdir, out string, flags []string, objs []string) error {
+func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string, objs []string) error {
        var cmd []string
        if len(p.CXXFiles) > 0 || len(p.SwigCXXFiles) > 0 {
                cmd = b.GxxCmd(p.Dir, objdir)
        } else {
                cmd = b.GccCmd(p.Dir, objdir)
        }
-       return b.run(nil, p.Dir, p.ImportPath, b.cCompilerEnv(), cmd, "-o", out, objs, flags)
+
+       cmdargs := []interface{}{cmd, "-o", outfile, objs, flags}
+       dir := p.Dir
+       out, err := b.runOut(dir, b.cCompilerEnv(), cmdargs...)
+       if len(out) > 0 {
+               // Filter out useless linker warnings caused by bugs outside Go.
+               // See also cmd/link/internal/ld's hostlink method.
+               var save [][]byte
+               for _, line := range bytes.SplitAfter(out, []byte("\n")) {
+                       // golang.org/issue/26073 - Apple Xcode bug
+                       if bytes.Contains(line, []byte("ld: warning: text-based stub file")) {
+                               continue
+                       }
+                       save = append(save, line)
+               }
+               out = bytes.Join(save, nil)
+               if len(out) > 0 {
+                       b.showOutput(nil, dir, p.ImportPath, b.processOutput(out))
+                       if err != nil {
+                               err = errPrintedOutput
+                       }
+               }
+       }
+       return err
 }
 
 // Grab these before main helpfully overwrites them.
index 0f5617246be730302d2d9e72f3354a03bf105a47..2075066e31b3c76264f97b5bb0f11a69126bdc09 100644 (file)
@@ -1338,9 +1338,24 @@ func (ctxt *Link) hostlink() {
                ctxt.Logf("\n")
        }
 
-       if out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput(); err != nil {
+       out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput()
+       if err != nil {
                Exitf("running %s failed: %v\n%s", argv[0], err, out)
-       } else if len(out) > 0 {
+       }
+
+       // Filter out useless linker warnings caused by bugs outside Go.
+       // See also cmd/go/internal/work/exec.go's gccld method.
+       var save [][]byte
+       for _, line := range bytes.SplitAfter(out, []byte("\n")) {
+               // golang.org/issue/26073 - Apple Xcode bug
+               if bytes.Contains(line, []byte("ld: warning: text-based stub file")) {
+                       continue
+               }
+               save = append(save, line)
+       }
+       out = bytes.Join(save, nil)
+
+       if len(out) > 0 {
                // always print external output even if the command is successful, so that we don't
                // swallow linker warnings (see https://golang.org/issue/17935).
                ctxt.Logf("%s", out)