/* * Copyright 2010-2019 NVIDIA Corporation. All rights reserved * * Sample CUPTI app to query domains and events supported by device * */ #if !defined(_GNU_SOURCE) # define _GNU_SOURCE // to get definition of RTLD_NEXT #endif #include #include #include #include ////////////////////////////// // stuff brought in for perf #include #include #include #include #include #include #include #include #include #include #include #include #include #include "manager.hpp" using namespace std; using main_function = int (*)(int, char**, char**); using libc_start_main_function = int (*)(int (*main)(int, char**, char**), int argc, char** ubp_av, void (*init)(void), void (*fini)(void), void (*rtld_fini)(void), void(*stack_end)); static libc_start_main_function real_libc_start_main = nullptr; static main_function real_main = nullptr; static int fake_main(int argc, char* argv[], char* envp[]) { printf("calling main\n"); return real_main(argc, argv, envp); } // extern "C" needed to disable name mangling extern "C" int __libc_start_main(int (*main)(int, char**, char**), int argc, char** ubp_av, void (*init)(void), void (*fini)(void), void (*rtld_fini)(void), void(*stack_end)) { int ret; real_main = main; real_libc_start_main = (libc_start_main_function) dlsym(RTLD_NEXT, "__libc_start_main"); register_callback(); ret = real_libc_start_main(fake_main, argc, ubp_av, init, fini, rtld_fini, stack_end); remove_callback(); return ret; }