| | |
| | |
| | |
| |
|
| | #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; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | 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; |
| | } |
| | |
| | printf("PASS\n"); |
| | return 0; |
| | } |
| |
|