#include #include typedef void* dllib_t; typedef void* opqst_t; dllib_t open_library(const char* library, int* err) { dllib_t lib = dlopen(library, RTLD_LAZY); if (!lib) { fprintf(stderr, "Error opening shared library: %s\n", dlerror()); *err = 1; } *err = 0; return lib; } void* getsym(dllib_t handle, char* sym, int* err) { void* ret = dlsym(handle, sym); if (!ret) { fprintf(stderr, "Unable to read symbol '%s'\n", sym); *err |= 1; return NULL; } return ret; } void use_library(int argc, char** argv, dllib_t lib, int* err) { *err = 0; opqst_t (*init)(int* argc, char*** argv) = getsym(lib, "plugin_init", err); void (*teardown)() = getsym(lib, "plugin_teardown", err); opqst_t (*sym)(opqst_t) = getsym(lib, "handle_thing", err); if (*err) { fprintf(stderr, "Unable to find symbol call_in.\n"); return; } opqst_t st = init(&argc, &argv); for (int i = 0; i < 100000; ++ i) { st = sym(st); printf("stable_ptr: %p\n", st); } teardown(); } int main(int argc, char** argv) { if (!argv[0] && !argv[1]) { fprintf(stderr, "Missing argument.\n"); return 1; } int err = 0; dllib_t lib = open_library(argv[1], &err); if (err) { return err; } use_library(argc, argv, lib, &err); return 0; }