Я пытаюсь подключить функции библиотеки cudnn. Первый метод работает, а второй нет.
первый метод:
// hook.cpp
typedef int(*cudnnConvolutionForward_fp)(void* , const void* , const void* , const void* , const void* , void* , void* , size_t , const void*, const void* , void*);
int cudnnConvolutionForward(void* handle, const void* alpha, const void* xDesc, const void* x, const void* convDesc, void* algo, void* workSpace, size_t bytes, const void *beta, const void* yDesc, void *y) {
int ret;
cudnnConvolutionForward_fp orig_cudnnConvolutionForward;
orig_cudnnConvolutionForward = reinterpret_cast<cudnnConvolutionForward_fp>(dlsym(RTLD_NEXT, "cudnnConvolutionForward"));
ret = orig_cudnnConvolutionForward(handle, alpha, xDesc, x, convDesc, algo, workSpace, bytes, beta, yDesc, y);
std::cout << "hook success: cunnConvolutionForward";
return ret;
}
Затем скомпилируйте hook.cpp в hook.so. Предположим, что тестовая программа называется «cudnnTest», и назовите ее:
LD_PRELOAD=hook.so ./cudnnTest
второй метод:
// hook.cpp
typedef int(*cudnnConvolutionForward_fp)(void* , const void* , const void* , const void* , const void* , void* , void* , size_t , const void*, const void* , void*);
static void print_message(const std::string& str) {
std::cout << "hook success: " << str << std::endl;
}
void* general_hook(const std::string& str) {
void* ret;
ret = dlsym(RTLD_NEXT, str.c_str());
print_message(str);
return ret;
}
cudnnConvolutionForward_fp cudnnConvolutionForward = reinterpret_cast<cudnnConvolutionForward_fp>(general_hook("cudnnConvolutionForward"));
скомпилируйте hook.cpp в hook.so и протестируйте таким же образом, но он показывает:
hook success: cudnnConvolutionForward
Segmentation fault (core dumped)
используя gdb для отладки, он показывает:
Thread 1 "cudnnTest" received signal SIGSEGV, Segmentation fault.
0x00007ffff7dd6098 in cudnnConvolutionForward () from ../hooktest/cudnn_hook.so
(gdb) bt
#0 0x00007ffff7dd6098 in cudnnConvolutionForward () from ../hooktest/cudnn_hook.so
#1 0x000000000040189d in main ()
Кто-нибудь может мне помочь и выяснить, что не так с второй метод? большое спасибо!
Задача ещё не решена.
Других решений пока нет …