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