1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <dlfcn.h>
8
9 int check_int8(void* handle, const char* fname, int8_t want) {
10 int8_t (*fn)();
11 fn = (int8_t (*)())dlsym(handle, fname);
12 if (!fn) {
13 fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
14 return 1;
15 }
16 signed char ret = fn();
17 if (ret != want) {
18 fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
19 return 1;
20 }
21 return 0;
22 }
23
24 int check_int32(void* handle, const char* fname, int32_t want) {
25 int32_t (*fn)();
26 fn = (int32_t (*)())dlsym(handle, fname);
27 if (!fn) {
28 fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
29 return 1;
30 }
31 int32_t ret = fn();
32 if (ret != want) {
33 fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
34 return 1;
35 }
36 return 0;
37 }
38
39 // Tests libgo.so to export the following functions.
40 // int8_t DidInitRun() // returns true
41 // int8_t DidMainRun() // returns true
42 // int32_t FromPkg() // returns 1024
43 int main(int argc, char** argv) {
44 void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
45 if (!handle) {
46 fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
47 dlerror());
48 return 2;
49 }
50
51 int ret = 0;
52 ret = check_int8(handle, "DidInitRun", 1);
53 if (ret != 0) {
54 return ret;
55 }
56
57 ret = check_int8(handle, "DidMainRun", 0);
58 if (ret != 0) {
59 return ret;
60 }
61
62 ret = check_int32(handle, "FromPkg", 1024);
63 if (ret != 0) {
64 return ret;
65 }
66 // test.bash looks for "PASS" to ensure this program has reached the end.
67 printf("PASS\n");
68 return 0;
69 }
70
View as plain text