Как определить, какая динамическая библиотека отвечает за создание указателя?

Предположим, у вас есть программа, которая загружает несколько общих объектов / динамических библиотек, используя dlopen (). Имея указатель на глобальный объект (например, статическую переменную-член), возможно ли определить, что указатель расположен на границе какой библиотеки?

4

Решение

Вы можете проанализировать карты процесса с файлом /proc/self/maps и посмотреть, где адрес указателя ограничен, глобальная переменная будет расположена в .data или .bss сегменты.

Библиотека примеров lib.c:

static int object;

int *
dummy(void)
{
return &object;
}

test.cошибки не обрабатываются для простоты:

#include <stdio.h>
#include <dlfcn.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>
#include <linux/limits.h>

static void which_library(void *p);

int
main(int argc, char **argv)
{
void *handle;
void *object;

handle = dlopen("./lib.so", RTLD_NOW);
assert(handle);

object = ((int *(*)(void)) dlsym(handle, "dummy"))();
which_library(object);
dlclose(handle);

return 0;
}

static void
which_library(void *p)
{
FILE *maps;
char buffer[49+PATH_MAX+1];

maps = fopen("/proc/self/maps", "r");
assert(maps);

while(fgets(buffer, sizeof(buffer) - 1, maps)) {
char path[PATH_MAX+1];
uintptr_t starts;
uintptr_t ends;

sscanf(buffer, "%" PRIxPTR "-%" PRIxPTR " %*s %*x %*x:%*x %*d %s", &starts, &ends, path);
if((uintptr_t)p >= starts && (uintptr_t)p < ends) {
printf("%p => %s\n", p, path);
break;
}
}

fclose(maps);
}

Тестовое задание:

$ gcc -Wall -shared lib.c -o lib.so
$ gcc -Wall test.c -ldl
$ ./a.out
0xb779f5f8 => /home/barakat/Desktop/lib.so
$
5

Другие решения


По вопросам рекламы [email protected]