如何通过内存中的地址获取有关符号的更多信息

时间:2013-03-14 14:12:57

标签: c++ linux dlopen thunk dladdr

我正在尝试通过内存中的地址获取符号名称。我使用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找到。

2 个答案:

答案 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