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
9int 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
24int 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
43int 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