diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index df74338593..0c2bc5f268 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -2943,7 +2943,9 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, pcCFLAGS, pcLDFLAGS, cgofi var linkobj []string var bareLDFLAGS []string - // filter out -lsomelib, -l somelib, *.{so,dll,dylib}, and (on Darwin) -framework X + // When linking relocatable objects, various flags need to be + // filtered out as they are inapplicable and can cause some linkers + // to fail. for i := 0; i < len(cgoLDFLAGS); i++ { f := cgoLDFLAGS[i] switch { @@ -2959,7 +2961,6 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, pcCFLAGS, pcLDFLAGS, cgofi case strings.HasSuffix(f, ".dylib"), strings.HasSuffix(f, ".so"), strings.HasSuffix(f, ".dll"): - continue // Remove any -fsanitize=foo flags. // Otherwise the compiler driver thinks that we are doing final link // and links sanitizer runtime into the object file. But we are not doing @@ -2968,6 +2969,16 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, pcCFLAGS, pcLDFLAGS, cgofi // See issue 8788 for details. case strings.HasPrefix(f, "-fsanitize="): continue + // runpath flags not applicable unless building a shared + // object or executable; see issue 12115 for details. This + // is necessary as Go currently does not offer a way to + // specify the set of LDFLAGS that only apply to shared + // objects. + case strings.HasPrefix(f, "-Wl,-rpath"): + if f == "-Wl,-rpath" || f == "-Wl,-rpath-link" { + // Skip following argument to -rpath* too. + i++ + } default: bareLDFLAGS = append(bareLDFLAGS, f) }