setup: < /p>
libcuda.so.1 Symlinks My Proxy (libcuda_override.so). < /P>
< /li>
(libcuda_real.so.1). < /p>
< /li>
I вручную перехватывает Cuinit и направляйте другие вызовы в реальную библиотеку. < /p>
< /li>
< /ul>
. Для других функций CUDA (например, CugetProcaddress_v2). Динамический линкер ожидает, что все символы CUDA будут определены в моем прокси, но я хочу только перехватывать определенные функции (например, Cuinit). < /P>
То, что я хочу: < /p>
только перехваченные функции (например, cuinit) в моем проксе. /> Автоматически пересылайте все другие символы в реальную либерацию. /> < /li>
Предпочитаю решение, которое не требует поддержания полного списка символов. < /p>
< /li>
< /ul>
Текущий код: < /p>
Код: Выделить всё
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
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(sym);
}
extern "C" __attribute__((visibility("default")))
CUresult cuInit(unsigned int Flags) {
static auto real = resolve("cuInit");
std::cout
Ошибка:
./libcuda.so.1: undefined symbol: cuGetProcAddress_v2 (fatal)Вопрос:
Есть ли способ явно перехватывать только Cuinit (или подмножество функций) и неявно направить все другие символы в реальную либеруда.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... g-them-all
Мобильная версия