...

Text file src/cmd/cgo/internal/testcshared/testdata/main1.c

Documentation: cmd/cgo/internal/testcshared/testdata

     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}

View as plain text