【问题标题】:How can I get more information about symbol by it's address in memory如何通过符号在内存中的地址获取有关符号的更多信息
【发布时间】:2013-03-14 14:12:57
【问题描述】:

我正在尝试通过其在内存中的地址来获取符号名称。我使用来自dlfcn.hint dladdr(void *addr, Dl_info *info) 函数来获取信息:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ linux dlopen thunk dladdr


    【解决方案1】:

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

    为了什么?

    我使用 int dladdr() ...

    首先要明白dladdr只看ELF图像的动态符号表,往往比静态符号表小很多. nm -D可以看到动态符号表的内容。

    例如,如果您链​​接a.out 可执行文件而没有-Wl,-E-rdynamic 标志,则main 将不会出现在动态符号表中,因此对于dladdr 将是“不可见的”。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • objdump --syms libQtGStreamer-0.10.so.0 返回SYMBOL TABLE: no symbols
      猜你喜欢
      • 2010-10-20
      • 2012-08-05
      • 2012-04-08
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2021-06-13
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多