diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 38151abca8..799536c544 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -47,5 +47,6 @@ func TestCallbackStack(t *testing.T) { testCallbackStack(t) } func TestFpVar(t *testing.T) { testFpVar(t) } func Test4339(t *testing.T) { test4339(t) } func Test6390(t *testing.T) { test6390(t) } +func Test5986(t *testing.T) { test5986(t) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } diff --git a/misc/cgo/test/issue5986.go b/misc/cgo/test/issue5986.go new file mode 100644 index 0000000000..4f772cdb96 --- /dev/null +++ b/misc/cgo/test/issue5986.go @@ -0,0 +1,32 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cgotest + +/* +#cgo LDFLAGS: -lm +#include +#include + +static void output5986() +{ + int current_row = 0, row_count = 0; + double sum_squares = 0; + do { + if (current_row == 10) { + current_row = 0; + } + ++row_count; + } + while (current_row++ != 1); + double d = sqrt(sum_squares / row_count); + printf("sqrt is: %g\n", d); +} +*/ +import "C" +import "testing" + +func test5986(t *testing.T) { + C.output5986() +} diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 6f35a87f1e..07d8f9ddc4 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -2034,8 +2034,9 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, gccfiles []string, gxxfile var staticLibs []string if goos == "windows" { - // libmingw32 and libmingwex might also use libgcc, so libgcc must come last - staticLibs = []string{"-lmingwex", "-lmingw32"} + // libmingw32 and libmingwex might also use libgcc, so libgcc must come last, + // and they also have some inter-dependencies, so must use linker groups. + staticLibs = []string{"-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group"} } if cgoLibGccFile != "" { staticLibs = append(staticLibs, cgoLibGccFile)