如何使用LD_PRELOAD对libnvvm.so中的api进行拦截?

我的CUDA版本为11.5,我想使用LD_PRELOAD对libnvvm.so中的api进行拦截,实现自己的版本,但是我的拦截并不成功。
我编写了如下的代码对libnvvm.so中的nvvmAddModuleToProgram函数进行拦截。
nvcc.cpp:

#include "/usr/include/nvvm.h"
#include <dlfcn.h>
#include <filesystem>
#include <iostream>
#include <cstdio>
#include <list>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
#define LIBNVVM "libnvvm.so"
static void* libnvvm = NULL;
std::ofstream logFile("log.txt", std::ios::app);
#define bind_lib(lib) \
if (!libnvvm) \
{ \
    libnvvm = dlopen(lib, RTLD_NOW | RTLD_GLOBAL); \
    if (!libnvvm) \
    { \
        fprintf(stderr, "Error loading %s: %s\n", lib, dlerror()); \
        abort(); \
    } \
}
#define bind_sym(handle, sym, retty, ...) \
typedef retty (*sym##_func_t)(__VA_ARGS__); \
static sym##_func_t sym##_real = NULL; \
if (!sym##_real) \
{ \
    sym##_real = (sym##_func_t)dlsym(handle, #sym); \
    if (!sym##_real) \
    { \
        fprintf(stderr, "Error loading %s: %s\n", #sym, dlerror()); \
        abort(); \
    } \
}
nvvmResult nvvmAddModuleToProgram(nvvmProgram prog, const char *bitcode, size_t size, const char *name)
{
    logFile << "here" << std::endl;
    bind_lib(LIBNVVM);
    bind_sym(libnvvm, nvvmAddModuleToProgram, nvvmResult, nvvmProgram, const char*, size_t, const char*);
    return nvvmAddModuleToProgram_real(prog, bitcode, size, name);  
}

我使用g++ -g -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -fPIC nvcc.cpp -shared -o libnvcc.so -ldl命令将nvcc.cpp编译为libnvcc.so共享库
然后使用LD_PRELOAD=/home/qzy/myfile/testcuda/libnvcc.so nvcc -o test test.cu -keep命令对libnvcc.so进行预加载,期待其中的nvvmAddModuleToProgram函数能够对libnvvm.so中的函数进行拦截。
如果拦截成功,则会在log.txt中打印出here,然而log.txt没有任何内容,说明拦截失败。
我怎么才能对libnvvm.so中的api进行正确拦截?
谢谢!