1#include <dlfcn.h>
2#include <stddef.h>
3#include <stdio.h>
4
5extern int foo(void)
6{
7    return 42;
8}
9
10int (*func_ptr)(void) = foo;
11
12int main(void)
13{
14    void*  lib = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);
15    void*  symbol;
16
17#if 0
18    /* The Gold linker will garbage-collect unused global functions
19     * even if --Wl,--export-dynamic is used. So use a dummy global
20     * variable reference here to prevent this.
21     */
22    if (foo() != 42)
23        return 3;
24#endif
25
26    if (lib == NULL) {
27        fprintf(stderr, "Could not open self-executable with dlopen(NULL) !!: %s\n", dlerror());
28        return 1;
29    }
30    symbol = dlsym(lib, "foo");
31    if (symbol == NULL) {
32        fprintf(stderr, "Could not lookup symbol inside executable !!: %s\n", dlerror());
33        return 2;
34    }
35    dlclose(lib);
36    return 0;
37}
38