Перехват DLSYM с адресамизанициализатором вызывает неопределенное поведение и смертоносное.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перехват DLSYM с адресамизанициализатором вызывает неопределенное поведение и смертоносное.

Сообщение Anonymous »

Я пытаюсь перехватить вызовы DLSYM с использованием LD_PRELOAD. Чтобы отлаживать библиотеку, я строю ее с помощью AddersSanitizer. Однако это приводит к неопределенному поведению, где иногда оно работает, в других случаях он сбои с адресами -анитилизаторами: DeadlySignal. < /P>
минимальный пример < /h1>

Код: Выделить всё

crash_preload.c:

#define _GNU_SOURCE
#include
#include
#include
#include

typedef void* (*dlsym_t)(void*, const char*);
static dlsym_t real_dlsym = NULL;
static int in_dlsym = 0;

static bool moduleLoaded = false;
__attribute__((constructor))
static void onModuleLoad() {
moduleLoaded = true;
}

static int numCalls = 0;
static void setup_real_dlsym() {
// Try loading the specific symbol version from GLIBC
real_dlsym = (dlsym_t)dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.2.5");
if (!real_dlsym) {
real_dlsym = (dlsym_t)dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.17");
}

if (!real_dlsym) {
fprintf(stderr, "Failed to resolve dlsym from GLIBC_2.2.5 or GLIBC_2.17\n");
exit(1);
}

// Call dlsym through the resolved symbol to get the unversioned one
real_dlsym = (dlsym_t)real_dlsym(RTLD_NEXT, "dlsym");
if (!real_dlsym) {
fprintf(stderr, "Failed to resolve final dlsym via resolved dlsym\n");
exit(1);
}
}

void* dlsym(void* handle, const char* symbol) {
numCalls++;
if (!real_dlsym) {
setup_real_dlsym();
}
if (in_dlsym || !real_dlsym) {
return NULL; // prevent recursion
}

if (moduleLoaded) {
printf("Intercepted dlsym: %s, numCalls: %d\n", symbol, numCalls);
}

in_dlsym = 1;
void* result = real_dlsym(handle, symbol);
in_dlsym = 0;
return result;
}
< /code>
построить и запустить < /h2>
gcc -fsanitize=address -fPIC -shared -o crash_preload.so crash_preload.c -ldl
LD_PRELOAD=/lib/x86_64-linux-gnu/libasan.so.6:`readlink -f crash_preload.so` python
< /code>
проблема < /h1>
Поведение не согласован: < /p>

Иногда питон начинается нормально, а перехват DLSYM работает < /li>
Другие времена. Проблема в том, что Либасан вызывает DLSYM до того, как какие -либо статические переменные в моей библиотеке станут инициализированы. Я думаю, что это может привести к какой -то странной коррупции, в которой куча даже не инициализируется, поэтому любые призывы к Malloc внутренне в DLSYM были бы не определенными.
Я не уверен, где даже начать отлаживать это, авария, кажется, произойдет во время ранней инициализации, и я не могу легко добавить вывод отладки на этом этапе.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -deadlysig
Ответить

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

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

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

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

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