1 # Issue 52863.
2
3 # We manually create a .syso and a .a file in package a,
4 # such that the .syso file only works when linked against the .a file.
5 # Package a has #cgo LDFLAGS to make this happen.
6 #
7 # Package c imports package a, and uses cgo itself.
8 # The generation of the _cgo_import.go for package c will fail,
9 # because it won't know that it has to link against a/libb.a
10 # (because we don't gather the #cgo LDFLAGS from all transitively
11 # imported packages).
12 #
13 # The _cgo_import.go file is only needed for internal linking.
14 # When generating _cgo_import.go for package c fails, an ordinary
15 # external link should still work. But an internal link is expected
16 # to fail, because the failure to create _cgo_import.go should cause
17 # the linker to report an inability to internally link.
18
19 [short] skip
20 [!cgo] skip
21 [!exec:ar] skip
22
23 cc -c -o a/b.syso b/b.c
24 cc -c -o b/lib.o b/lib.c
25 exec ar rc a/libb.a b/lib.o
26
27 go build
28 ! stderr 'undefined reference'
29
30 ! go build -ldflags=-linkmode=internal
31 stderr 'some packages could not be built to support internal linking.*m/c|requires external linking|does not support internal cgo'
32
33 # Test for issue #68743.
34 go build -x m/d
35 ! stderr 'undefined reference'
36 stderr 'test for internal linking'
37
38 -- go.mod --
39 module m
40
41 -- a/a.go --
42 package a
43
44 // #cgo LDFLAGS: -L. -lb
45 // extern int CFn(int);
46 import "C"
47
48 func GoFn(v int) int { return int(C.CFn(C.int(v))) }
49
50 -- b/b.c --
51 extern int LibFn(int);
52 int CFn(int i) { return LibFn(i); }
53
54 -- b/lib.c --
55 int LibFn(int i) { return i; }
56
57 -- c/c.go --
58 package c
59
60 // static int D(int i) { return i; }
61 import "C"
62
63 import "m/a"
64
65 func Fn(i int) (int, int) {
66 return a.GoFn(i), int(C.D(C.int(i)))
67 }
68
69 -- d/d.go --
70 // Package d is a copy of package c, to build with -x.
71 package d
72
73 // static int D(int i) { return i; }
74 import "C"
75
76 import "m/a"
77
78 func Fn(i int) (int, int) {
79 return a.GoFn(i), int(C.D(C.int(i)))
80 }
81
82 -- main.go --
83 package main
84
85 import "m/c"
86
87 func main() {
88 println(c.Fn(0))
89 }
90
View as plain text