我正在尝试通过内存中的地址获取符号名称。我使用int dladdr(void *addr, Dl_info *info)
中的dlfcn.h
函数来获取信息:
typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info;
但是这个函数找不到与地址匹配的符号,并将dli_sname和saddr设置为NULL。
在这种情况下,如何获取符号的名称或有关符号的任何其他信息(种类,属性等)?
注意:我想要找到的符号名称为_ZTv0_n24_N4QGst13PropertyProbeD0Ev
。它由QGst::PropertyProbe
列在g++ -fdump-class-hierarchy
课程的vtable中列出:
Vtable for QGst::PropertyProbe QGst::PropertyProbe::_ZTVN4QGst13PropertyProbeE: 14u entries ... 80 (int (*)(...))QGst::PropertyProbe::_ZTv0_n24_N4QGst13PropertyProbeD1Ev ...
但dladdr
找不到符号dlopen
的{{1}}和dlsym
共享对象,并且通过虚函数指针列表。 v表中的所有其他函数均由_ZTVN4QGst13PropertyProbeE
找到。
答案 0 :(得分:1)
我正在尝试通过内存中的地址获取符号名称。
为什么?
我使用int dladdr()...
您需要了解的第一件事是dladdr
仅查看ELF图像的动态符号表,该表通常比 static 小得多符号表。您可以使用nm -D
查看动态符号表的内容。
例如,如果您链接a.out
可执行文件但没有-Wl,-E
或-rdynamic
标记,则main
将不会出现在动态符号表中,因此将“不可见“到dladdr
。
您需要知道的第二件事是,当您链接共享库时,您可以准确控制哪些符号执行和不从中导出(导出的符号是具有动态符号表条目的符号)。执行此操作的方法有多种:链接器版本脚本,-fvisibility
标志,attribute((visibility(...)))
。
所有这一切都是为了找到一个dladdr
无法告诉你任何事情的符号,这一点都不应该令人惊讶。
答案 1 :(得分:0)
试试objdump --syms
。那应该打印(受损)符号名称及其地址。请参阅http://linux.die.net/man/1/objdump。