#define _GNU_SOURCE #include #include #include #include #include #include "pupy_load.h" #include "debug.h" #ifndef DEFAULT_ENV_CLEANUP #define DEFAULT_ENV_CLEANUP "__CLEANUP" #endif static pthread_t thread_id; static int __argc = 0; static char ** __argv = NULL; static void * thread_start(void *arg) { return (void *) mainThread(__argc, __argv, true); } static void unloader(void) { dprint("Wait until pupy thread exits\n"); pthread_join(thread_id, NULL); dprint("Sutting down\n"); } void _exit(int status) { dprint("Catch exit"); __attribute__((noreturn)) void (*orig_exit)(int status) = dlsym(RTLD_NEXT, "_exit"); if (!strcmp(getenv("HOOK_EXIT"), "1")) { dprint("Hook exit"); unloader(); } orig_exit(status); } static void _fill_argv(int argc, char* argv[], char* envp[]) { dprint("fill_argv called: %d/%p/%p\n", argc, argv, envp); #ifdef DEBUG int i; for (i=0; i