2013-03-14 23 views
1

我试图通过其地址在内存中获取符号名称由它的地址符号的更多信息。我使用dlfcn.hint dladdr(void *addr, Dl_info *info)函数来获取信息:我如何获得有关在内存

 
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 for QGst::PropertyProbe 
QGst::PropertyProbe::_ZTVN4QGst13PropertyProbeE: 14u entries 
... 
80 (int (*)(...))QGst::PropertyProbe::_ZTv0_n24_N4QGst13PropertyProbeD1Ev 
... 

但它不是由dladdr通过其地址寻找到共享对象时dlopen和符号_ZTVN4QGst13PropertyProbeEdlsym并通过列表迭代,我已经得到发现的虚拟函数指针。 v表中的所有其他功能可通过dladdr找到。

回答

1

我试图让符号名称由它的地址在内存中。

为了什么?

我使用int提供dladdr()...

您需要了解的第一件事情是,dladdr只着眼于ELF形象,这往往远小于的动态符号表静态符号表。您可以使用nm -D查看动态符号表的内容。

举例来说,如果你没有-Wl,-E-rdynamic标志链路a.out可执行文件,然后main不会出现出现在动态符号表中,从而将“看不见” dladdr

你需要知道的第二件事是,当你链接共享库,你可以控制什么符号和不从它那里得到出口(出口符号是具有动态符号表项的)。有多种方法可以做到这一点:链接器版本脚本,-fvisibility标志,attribute((visibility(...)))

这一切是说,寻找一个符号,dladdr不能告诉你任何事情不应该在所有的令人吃惊。