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  }