16f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner#include <dlfcn.h> 26f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner#include <stddef.h> 36f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner#include <stdio.h> 46f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner 56f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turnerextern int foo(void) 66f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner{ 76f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner return 42; 86f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner} 96f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner 106f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turnerint (*func_ptr)(void) = foo; 116f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner 126f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turnerint main(void) 136f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner{ 146f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner void* lib = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); 156f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner void* symbol; 166f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner 176f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner#if 0 186f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner /* The Gold linker will garbage-collect unused global functions 196f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner * even if --Wl,--export-dynamic is used. So use a dummy global 206f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner * variable reference here to prevent this. 216f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner */ 226f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner if (foo() != 42) 236f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner return 3; 246f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner#endif 256f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner 266f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner if (lib == NULL) { 276f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner fprintf(stderr, "Could not open self-executable with dlopen(NULL) !!: %s\n", dlerror()); 286f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner return 1; 296f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner } 306f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner symbol = dlsym(lib, "foo"); 316f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner if (symbol == NULL) { 326f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner fprintf(stderr, "Could not lookup symbol inside executable !!: %s\n", dlerror()); 336f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner return 2; 346f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner } 356f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner dlclose(lib); 366f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner return 0; 376f09971503f9bea177168d1599e925a5b22d18ddDavid 'Digit' Turner} 38