xref: /aosp_15_r20/external/AFLplusplus/test/test-dlopen.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
2*08b48e0bSAndroid Build Coastguard Worker #include <errno.h>
3*08b48e0bSAndroid Build Coastguard Worker #include <dlfcn.h>
4*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
5*08b48e0bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)6*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
7*08b48e0bSAndroid Build Coastguard Worker 
8*08b48e0bSAndroid Build Coastguard Worker   if (!getenv("TEST_DLOPEN_TARGET")) {
9*08b48e0bSAndroid Build Coastguard Worker 
10*08b48e0bSAndroid Build Coastguard Worker     fprintf(stderr, "Error: TEST_DLOPEN_TARGET not set!\n");
11*08b48e0bSAndroid Build Coastguard Worker     return 1;
12*08b48e0bSAndroid Build Coastguard Worker 
13*08b48e0bSAndroid Build Coastguard Worker   }
14*08b48e0bSAndroid Build Coastguard Worker 
15*08b48e0bSAndroid Build Coastguard Worker   void *lib = dlopen(getenv("TEST_DLOPEN_TARGET"), RTLD_LAZY);
16*08b48e0bSAndroid Build Coastguard Worker   if (!lib) {
17*08b48e0bSAndroid Build Coastguard Worker 
18*08b48e0bSAndroid Build Coastguard Worker     perror(dlerror());
19*08b48e0bSAndroid Build Coastguard Worker     return 2;
20*08b48e0bSAndroid Build Coastguard Worker 
21*08b48e0bSAndroid Build Coastguard Worker   }
22*08b48e0bSAndroid Build Coastguard Worker 
23*08b48e0bSAndroid Build Coastguard Worker   int (*func)(int, char **) = dlsym(lib, "main_exported");
24*08b48e0bSAndroid Build Coastguard Worker   if (!func) {
25*08b48e0bSAndroid Build Coastguard Worker 
26*08b48e0bSAndroid Build Coastguard Worker     fprintf(stderr, "Error: main_exported not found!\n");
27*08b48e0bSAndroid Build Coastguard Worker     return 3;
28*08b48e0bSAndroid Build Coastguard Worker 
29*08b48e0bSAndroid Build Coastguard Worker   }
30*08b48e0bSAndroid Build Coastguard Worker 
31*08b48e0bSAndroid Build Coastguard Worker   // must use deferred forkserver as otherwise AFL++ instrumentation aborts
32*08b48e0bSAndroid Build Coastguard Worker   // because all dlopen() of instrumented libs must be before the forkserver
33*08b48e0bSAndroid Build Coastguard Worker   __AFL_INIT();
34*08b48e0bSAndroid Build Coastguard Worker 
35*08b48e0bSAndroid Build Coastguard Worker   fprintf(stderr, "Running main_exported\n");
36*08b48e0bSAndroid Build Coastguard Worker   return func(argc, argv);
37*08b48e0bSAndroid Build Coastguard Worker 
38*08b48e0bSAndroid Build Coastguard Worker }
39*08b48e0bSAndroid Build Coastguard Worker 
40