如何无需显式声明所有CUDA函数即可代理CUDA驱动API调用?
CUDA驱动API拦截代理库的符号转发问题
背景与当前实现
我尝试创建代理库libcuda_override.so,通过转发调用至真实libcuda.so来拦截cuInit等CUDA驱动API调用,当前实现方案的环境配置如下:
libcuda.so.1符号链接指向代理库libcuda_override.so;- 代理库动态加载真实库
libcuda_real.so.1; - 仅手动拦截
cuInit,其余调用计划转发至真实库。
问题现象
设置LD_LIBRARY_PATH=./运行Python脚本时,出现cuGetProcAddress_v2等其他CUDA函数的符号查找错误。动态链接器要求代理库定义所有CUDA符号,但我仅需拦截cuInit等特定函数。
期望目标
- 仅在代理库中解析
cuInit等被拦截的函数; - 无需手动声明,自动将其余所有符号转发至真实
libcuda.so。
约束条件
- 避免解析
cuda.h或手动声明所有CUDA函数; - 优先选择无需维护完整符号列表的方案。
当前代码
static void* real_libcuda = nullptr; static std::once_flag libcuda_loaded; static void ensure_real_libcuda_loaded() { std::call_once(libcuda_loaded, []() { const char* msg = "[🔥 LIBCUDA WRAP LOADED]\n"; size_t msg_len = 0; while (msg[msg_len] != '\0') { ++msg_len; } write(STDERR_FILENO, msg, msg_len); const char* libcuda_path = "libcuda_real.so.1"; real_libcuda = dlopen(libcuda_path, RTLD_LAZY | RTLD_GLOBAL); if (!real_libcuda) { fprintf(stderr, "[‼️] Failed to load real libcuda.so.1 from %s: %s\n", libcuda_path, dlerror()); _exit(1); } }); } __attribute__((constructor)) static void libcuda_wrap_ctor() { ensure_real_libcuda_loaded(); } template<typename T> T resolve(const char* name) { ensure_real_libcuda_loaded(); void* sym = dlsym(real_libcuda, name); if (!sym) { fprintf(stderr, "[‼️] dlsym failed for %s: %s\n", name, dlerror()); } return reinterpret_cast<T>(sym); } extern "C" __attribute__((visibility("default"))) CUresult cuInit(unsigned int Flags) { static auto real = resolve<CUresult(*)(unsigned int)>("cuInit"); std::cout << "[🟢 cuInit intercepted]\n"; return real ? real(Flags) : CUDA_ERROR_UNKNOWN; }
错误信息
./libcuda.so.1: undefined symbol: cuGetProcAddress_v2 (fatal)
技术疑问
是否存在仅显式拦截cuInit(或部分函数),无需手动声明即可隐式转发其余所有符号至真实libcuda.so的实现方式?
内容的提问来源于stack exchange,提问作者D1_
相关产品推荐
相关产品推荐

