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