#define _GNU_SOURCE #include #include #include #include #include #include "pupy_load.h" #include "tmplibrary.h" #include "debug.h" static pthread_t thread_id; static int __argc = 0; static char ** __argv = NULL; static int __to_wait = 0; static void * thread_start(void *arg) { mainThread(__argc, __argv, true); return NULL; } 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 (%d)\n", __to_wait); __attribute__((noreturn)) void (*orig_exit)(int status) = dlsym(RTLD_NEXT, "_exit"); if (__to_wait) { dprint("Hook exit\n"); unloader(); } orig_exit(status); } static void __atexit() { dprint("At exit\n"); _exit(0); } static void __on_exit(int status, void *data) { dprint("On exit\n"); _exit(status); } static void _pupy_main(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