# Issue 52863. # We manually create a .syso and a .a file in package a, # such that the .syso file only works when linked against the .a file. # Package a has #cgo LDFLAGS to make this happen. # # Package c imports package a, and uses cgo itself. # The generation of the _cgo_import.go for package c will fail, # because it won't know that it has to link against a/libb.a # (because we don't gather the #cgo LDFLAGS from all transitively # imported packages). # # The _cgo_import.go file is only needed for internal linking. # When generating _cgo_import.go for package c fails, an ordinary # external link should still work. But an internal link is expected # to fail, because the failure to create _cgo_import.go should cause # the linker to report an inability to internally link. [short] skip [!cgo] skip [!exec:ar] skip 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 -- a/a.go -- package a // #cgo LDFLAGS: -L. -lb // extern int CFn(int); import "C" func GoFn(v int) int { return int(C.CFn(C.int(v))) } -- b/b.c -- extern int LibFn(int); int CFn(int i) { return LibFn(i); } -- b/lib.c -- int LibFn(int i) { return i; } -- c/c.go -- package c // 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))) } -- 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 import "m/c" func main() { println(c.Fn(0)) }