annotate libgo/misc/cgo/testsovar/so_test.go @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // Copyright 2019 The Go Authors. All rights reserved.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // license that can be found in the LICENSE file.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // +build cgo
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 package so_test
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 import (
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 "io/ioutil"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 "log"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 "os"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 "os/exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 "path/filepath"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 "runtime"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 "strings"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 "testing"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 func requireTestSOSupported(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 t.Helper()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 switch runtime.GOARCH {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 case "arm", "arm64":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 if runtime.GOOS == "darwin" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 t.Skip("No exec facility on iOS.")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 case "ppc64":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 if runtime.GOOS == "linux" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 case "mips64le", "mips64":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 t.Skip("External linking not implemented on mips64.")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 if runtime.GOOS == "android" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 t.Skip("No exec facility on Android.")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 func TestSO(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 requireTestSOSupported(t)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 GOPATH, err := ioutil.TempDir("", "cgosotest")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 log.Fatal(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 defer os.RemoveAll(GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 modRoot := filepath.Join(GOPATH, "src", "cgosotest")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 if err := overlayDir(modRoot, "testdata"); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 cmd.Dir = modRoot
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 cmd.Stderr = new(strings.Builder)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 out, err := cmd.Output()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 lines := strings.Split(string(out), "\n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 if len(lines) != 3 || lines[2] != "" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 cc := lines[0]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 if cc == "" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 t.Fatal("CC environment variable (go env CC) cannot be empty")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 gogccflags := strings.Split(lines[1], " ")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 // build shared object
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 ext := "so"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 args := append(gogccflags, "-shared")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 switch runtime.GOOS {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 case "darwin":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 ext = "dylib"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 args = append(args, "-undefined", "suppress", "-flat_namespace")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 case "windows":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 ext = "dll"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 args = append(args, "-DEXPORT_DLL")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 case "aix":
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 ext = "so.1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 sofname := "libcgosotest." + ext
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 args = append(args, "-o", sofname, "cgoso_c.c")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 cmd = exec.Command(cc, args...)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 cmd.Dir = modRoot
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 out, err = cmd.CombinedOutput()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 if runtime.GOOS == "aix" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 // Shared object must be wrapped by an archive
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 cmd.Dir = modRoot
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 out, err = cmd.CombinedOutput()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 cmd.Dir = modRoot
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 out, err = cmd.CombinedOutput()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 cmd = exec.Command("./main.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 cmd.Dir = modRoot
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 if runtime.GOOS != "windows" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 s := "LD_LIBRARY_PATH"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 if runtime.GOOS == "darwin" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 s = "DYLD_LIBRARY_PATH"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 cmd.Env = append(os.Environ(), s+"=.")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 // On FreeBSD 64-bit architectures, the 32-bit linker looks for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 // different environment variables.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 out, err = cmd.CombinedOutput()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 }