#ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef CHANGE_SRC_ACTUAL_FUNCTION_H_ #define CHANGE_SRC_ACTUAL_FUNCTION_H_ #include #include #include #include #include namespace { template using function_ptr = Result(*)(Arguments...); template FunctionPtr get_actual_function(const std::string& symbol_name) { const void* symbol_address{ dlsym(RTLD_NEXT, symbol_name.c_str()) }; FunctionPtr actual_function{}; std::memcpy(&actual_function, &symbol_address, sizeof(symbol_address)); return actual_function; } } namespace actual { static auto write = get_actual_function< function_ptr >("write"); static auto writev = get_actual_function< function_ptr >("writev"); static auto rename = get_actual_function< function_ptr >("rename"); static auto rmdir = get_actual_function< function_ptr >("rmdir"); static auto unlink = get_actual_function< function_ptr >("unlink"); static auto unlinkat = get_actual_function< function_ptr >("unlinkat"); static auto mmap = get_actual_function< function_ptr >("mmap"); } #endif // CHANGE_SRC_ACTUAL_FUNCTION_H_