123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // Copyright 2015 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- #include <stdint.h>
- #include <stdio.h>
- #include <dlfcn.h>
- int check_int8(void* handle, const char* fname, int8_t want) {
- int8_t (*fn)();
- fn = (int8_t (*)())dlsym(handle, fname);
- if (!fn) {
- fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
- return 1;
- }
- signed char ret = fn();
- if (ret != want) {
- fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
- return 1;
- }
- return 0;
- }
- int check_int32(void* handle, const char* fname, int32_t want) {
- int32_t (*fn)();
- fn = (int32_t (*)())dlsym(handle, fname);
- if (!fn) {
- fprintf(stderr, "ERROR: missing %s: %s\n", fname, dlerror());
- return 1;
- }
- int32_t ret = fn();
- if (ret != want) {
- fprintf(stderr, "ERROR: %s=%d, want %d\n", fname, ret, want);
- return 1;
- }
- return 0;
- }
- // Tests libgo.so to export the following functions.
- // int8_t DidInitRun() // returns true
- // int8_t DidMainRun() // returns true
- // int32_t FromPkg() // returns 1024
- int main(int argc, char** argv) {
- void* handle = dlopen(argv[1], RTLD_LAZY | RTLD_GLOBAL);
- if (!handle) {
- fprintf(stderr, "ERROR: failed to open the shared library: %s\n",
- dlerror());
- return 2;
- }
- int ret = 0;
- ret = check_int8(handle, "DidInitRun", 1);
- if (ret != 0) {
- return ret;
- }
- ret = check_int8(handle, "DidMainRun", 0);
- if (ret != 0) {
- return ret;
- }
- ret = check_int32(handle, "FromPkg", 1024);
- if (ret != 0) {
- return ret;
- }
- // test.bash looks for "PASS" to ensure this program has reached the end.
- printf("PASS\n");
- return 0;
- }
|