#include <dlfcn.h> #include <stddef.h> #include <stdio.h> extern int foo(void) { return 42; } int (*func_ptr)(void) = foo; int main(void) { void* lib = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); void* symbol; #if 0 /* The Gold linker will garbage-collect unused global functions * even if --Wl,--export-dynamic is used. So use a dummy global * variable reference here to prevent this. */ if (foo() != 42) return 3; #endif if (lib == NULL) { fprintf(stderr, "Could not open self-executable with dlopen(NULL) !!: %s\n", dlerror()); return 1; } symbol = dlsym(lib, "foo"); if (symbol == NULL) { fprintf(stderr, "Could not lookup symbol inside executable !!: %s\n", dlerror()); return 2; } dlclose(lib); return 0; }