From 7171f533d0bc21c600ea070ed7d593f35f4a1d44 Mon Sep 17 00:00:00 2001 From: Shenghou Ma Date: Fri, 23 Nov 2012 19:58:46 +0800 Subject: [PATCH] cmd/go: fix data race on cgoLibGccFile Fixes #4426. R=dvyukov CC=golang-dev https://golang.org/cl/6851099 --- src/cmd/go/build.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 5c1c783ab4..7e3d2f496d 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -1478,7 +1478,7 @@ func gccgoCleanPkgpath(p *Package) string { func (b *builder) libgcc(p *Package) (string, error) { f, err := b.runOut(p.Dir, p.ImportPath, b.gccCmd(p.Dir), "-print-libgcc-file-name") if err != nil { - return "", nil + return "", fmt.Errorf("gcc -print-libgcc-file-name: %v (%s)", err, f) } return strings.Trim(string(f), "\r\n"), nil } @@ -1542,7 +1542,10 @@ func envList(key string) []string { var cgoRe = regexp.MustCompile(`[/\\:]`) -var cgoLibGccFile string +var ( + cgoLibGccFile string + cgoLibGccFileOnce sync.Once +) func (b *builder) cgo(p *Package, cgoExe, obj string, gccfiles []string) (outGo, outObj []string, err error) { if goos != toolGOOS { @@ -1633,13 +1636,17 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, gccfiles []string) (outGo, bareLDFLAGS = append(bareLDFLAGS, f) } } - if cgoLibGccFile == "" { - var err error + + cgoLibGccFileOnce.Do(func() { cgoLibGccFile, err = b.libgcc(p) - if err != nil { - return nil, nil, err + }) + if cgoLibGccFile == "" { + if err == nil { + err = errors.New("failed to get libgcc filename") } + return nil, nil, err } + var staticLibs []string if goos == "windows" { // libmingw32 and libmingwex might also use libgcc, so libgcc must come last -- 2.48.1