/* Compile and link with: * * gcc -rdynamic -ldl -o dltest dltest.c */ #include #include #include int foo_11 = 16; int foo_8 = 19; int foo_5 = 20; int foo_14 = 22; int foo_10 = 32; int foo_2 = 42; int foo_6 = 50; int foo_15 = 51; int foo_1 = 57; int foo_3 = 68; int foo_0 = 76; int foo_12 = 80; int foo_4 = 82; int foo_9 = 84; int foo_13 = 88; int foo_7 = 98; int main(int argc, char **argv) { void *dlhand; int *foo = NULL; /* Our dynamically loaded stuff */ int userin = -1; char symname[100]; dlhand = dlopen(NULL, RTLD_LAZY|RTLD_LOCAL); if(dlhand == NULL) { /* ack fail */ fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } dlerror(); /* clear error flag */ while (1) { printf("Enter a number between 0 and 15, -1 to quit: "); scanf(" %i", &userin); if(userin == -1) { break; } else if(userin > 15 || userin < 0) { continue; } snprintf(symname, 100, "foo_%i", userin); foo = dlsym(dlhand, symname); if(foo == NULL) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } printf("Your magically-obtained result is: %d\n", *foo); } dlclose(dlhand); return 0; }