#define _GNU_SOURCE #include #include void close_so(void **handle) { int rc; rc = dlclose(*handle); if (rc != 0) { fprintf(stderr, "warning: failed to dlclose: %s\n", dlerror()); } } int main(int argc, char **argv) { int rc; int err; if (argc != 2) { fprintf(stderr, "usage: %s \n", argc > 0 ? argv[0] : ""); return -1; } char const *libtest = argv[1]; void *handle; handle = dlopen(libtest, RTLD_NOW); if (handle == NULL) { fprintf(stderr, "failed to dlopen %s: %s\n", libtest, dlerror()); return -1; } void *_dlclose __attribute__((cleanup(close_so))) = handle; void *sym; sym = dlsym(handle, "await_input"); if (sym == NULL) { fprintf(stderr, "failed to dlsym `await_input` function: %s\n", dlerror()); return -1; } int (*await_input)(void) = sym; return await_input(); }