Как прокси -дипломировать функции CUDA без явного объявления их всех?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как прокси -дипломировать функции CUDA без явного объявления их всех?

Сообщение Anonymous »

Я пытаюсь перехватить вызовы API драйвера CUDA (например, Cuinit), создав прокси -библиотеку (libcuda_override.so), которая направляет призывы к настоящему Libcuda.so. Мой текущий подход: < /p>
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»