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

Я пытаюсь получить имя символа по его адресу в памяти. я использую 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,

2 ответа

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

Зачем?

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

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

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

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

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

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

Другие вопросы по тегам