}
// gccld runs the gcc linker to create an executable from a set of object files.
-// Any error output is only displayed for BuildN or BuildX.
func (b *Builder) gccld(a *Action, objdir, outfile string, flags []string, objs []string) error {
p := a.Package
sh := b.Shell(a)
}
cmdargs := []any{cmd, "-o", outfile, objs, flags}
- out, err := sh.runOut(base.Cwd(), 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
- var skipLines int
- 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
- }
+ _, err := sh.runOut(base.Cwd(), b.cCompilerEnv(), cmdargs...)
- if skipLines > 0 {
- skipLines--
- continue
- }
-
- // Remove duplicate main symbol with runtime/cgo on AIX.
- // With runtime/cgo, two main are available:
- // One is generated by cgo tool with {return 0;}.
- // The other one is the main calling runtime.rt0_go
- // in runtime/cgo.
- // The second can't be used by cgo programs because
- // runtime.rt0_go is unknown to them.
- // Therefore, we let ld remove this main version
- // and used the cgo generated one.
- if p.ImportPath == "runtime/cgo" && bytes.Contains(line, []byte("ld: 0711-224 WARNING: Duplicate symbol: .main")) {
- skipLines = 1
- continue
- }
-
- save = append(save, line)
- }
- out = bytes.Join(save, nil)
- }
// Note that failure is an expected outcome here, so we report output only
// in debug mode and don't report the error.
if cfg.BuildN || cfg.BuildX {
- sh.reportCmd("", "", out, nil)
+ saw := "succeeded"
+ if err != nil {
+ saw = "failed"
+ }
+ sh.ShowCmd("", "%s # test for internal linking errors (%s)", joinUnambiguously(str.StringList(cmdargs...)), saw)
}
+
return err
}
cc -c -o a/b.syso b/b.c
cc -c -o b/lib.o b/lib.c
exec ar rc a/libb.a b/lib.o
+
go build
+! stderr 'undefined reference'
+
! go build -ldflags=-linkmode=internal
stderr 'some packages could not be built to support internal linking.*m/c|requires external linking|does not support internal cgo'
+# Test for issue #68743.
+go build -x m/d
+! stderr 'undefined reference'
+stderr 'test for internal linking'
+
-- go.mod --
module m
return a.GoFn(i), int(C.D(C.int(i)))
}
+-- d/d.go --
+// Package d is a copy of package c, to build with -x.
+package d
+
+// static int D(int i) { return i; }
+import "C"
+
+import "m/a"
+
+func Fn(i int) (int, int) {
+ return a.GoFn(i), int(C.D(C.int(i)))
+}
+
-- main.go --
package main