2

我试图通过它在内存中的地址来获取符号名称。我使用int dladdr(void *addr, Dl_info *info)函数 fromdlfcn.h来获取信息:

类型定义结构{
 常量字符 *dli_fname; /* 共享对象的路径名
                                          包含地址 */
 无效*dli_fbase;/* 共享对象的地址
                                          已加载 */
 常量字符 *dli_sname; /* 与地址最近的符号名称
                                          低于地址 */
 无效*dli_saddr;/* 命名符号的确切地址
                                          在 dli_sname */
} DL_信息;

但此函数找不到与地址匹配的符号,并将 dli_sname 和 saddr 设置为 NULL。

在这种情况下,如何获取符号名称或有关符号的任何其他信息(种类、属性等)?

注意:我要查找的符号名称是_ZTv0_n24_N4QGst13PropertyProbeD0Ev. QGst::PropertyProbe它在类的vtable 中列出g++ -fdump-class-hierarchy

QGst::PropertyProbe 的 Vtable
QGst::PropertyProbe::_ZTVN4QGst13PropertyProbeE: 14u 个条目
...
80 (int (*)(...))QGst::PropertyProbe::_ZTv0_n24_N4QGst13PropertyProbeD1Ev
...

但是,当我通过和符号查看共享对象并遍历虚函数指针列表dladdr时,我没有通过它的地址找到它。v-table 中的所有其他函数都由 找到。dlopendlsym_ZTVN4QGst13PropertyProbeEdladdr

4

2 回答 2

3

我试图通过它在内存中的地址来获取符号名称。

做什么的?

我使用 int dladdr() ...

首先需要了解的是,dladdr只看ELF 映像的动态符号表,它通常比静态符号表小得多。可以看到动态符号表的内容nm -D

例如,如果你链接的a.out可执行文件不带-Wl,-E-rdynamic标志,那么main将不会出现在动态符号表中,从而将“不可见”到dladdr.

您需要知道的第二件事是,当您链接共享库时,您可以准确控制哪些符号可以从其中导出和不导出(导出的符号是具有动态符号表条目的符号)。有多种方法可以做到这一点:链接器版本脚本、-fvisibility标志、attribute((visibility(...))).

这就是说,找到一个dladdr无法告诉您任何信息的符号一点也不奇怪。

于 2013-03-18T04:15:10.027 回答
0

试试objdump --syms。那应该打印(损坏的)符号名称及其地址。请参阅http://linux.die.net/man/1/objdump

于 2013-03-14T14:21:51.197 回答