Как я могу получить больше информации о символе по его адресу в памяти
Я пытаюсь получить имя символа по его адресу в памяти. я использую 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.