Как я могу получить больше информации о символе по его адресу в памяти

Я пытаюсь получить имя символа по его адрес в памяти. я использую int dladdr(void *addr, Dl_info *info) функция от dlfcn.h чтобы получить информацию:

typedef struct {
const char * dli_fname; / * Путь общего объекта, который
содержит адрес * /
void * dli_fbase; / * Адрес, по которому разделяемый объект
загружен * /
const char * dli_sname; / * Имя ближайшего символа с адресом
ниже, чем адрес * /
void * dli_saddr; / * Точный адрес символа с именем
в dli_sname * /
} Dl_info;

Но эта функция не может найти символ, соответствующий адресу, и устанавливает dli_sname и saddr в NULL.

Как я могу получить название символа или любую другую информацию (вид, атрибуты и т. Д.) О символе в этом случае?

НОТА: Название символа, который я пытаюсь найти, _ZTv0_n24_N4QGst13PropertyProbeD0Ev, Это перечислено в vtable класса QGst::PropertyProbe от g++ -fdump-class-hierarchy:

Vtable для QGst :: PropertyProbe
QGst :: PropertyProbe :: _ ZTVN4QGst13PropertyProbeE: 14u записей
...
80 (int (*) (...)) QGst :: PropertyProbe :: _ ZTv0_n24_N4QGst13PropertyProbeD1Ev
...

Но это не найдено dladdr по его адресу, который я получил при просмотре общего объекта dlopen а также dlsym символа _ZTVN4QGst13PropertyProbeE и перебирая список указателей виртуальных функций. Все остальные функции в v-таблице находятся dladdr,

1

Решение

Я пытаюсь получить имя символа по его адресу в памяти.

Зачем?

Я использую int dladdr () …

Первое, что вам нужно понять, это то, что dladdr только смотрит на динамический таблица символов изображения ELF, которая часто намного меньше, чем статический таблица символов. Вы можете увидеть содержимое таблицы динамических символов с nm -D,

Например, если вы ссылаетесь a.out исполняемый без -Wl,-E или же -rdynamic флаг, то main не появится, появится в таблице динамических символов, и, следовательно, будет «невидимым» для dladdr,

Второе, что вам нужно знать, это то, что когда вы связываете разделяемую библиотеку, вы можете точно контролировать, что символы делают и не экспортируются из нее (экспортированные символы имеют те, которые имеют записи в таблице динамических символов). Для этого есть разные способы: скрипты линкерной версии, -fvisibility флаги, attribute((visibility(...))),

Все это означает, что найти символ, который dladdr не могу ничего рассказать о том, что не должно удивлять.

1

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

Пытаться objdump --syms, Это должно напечатать (искалеченные) имена символов и их адреса. Увидеть http://linux.die.net/man/1/objdump.

0

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