C++ 如何通过它获得更多关于符号的信息';内存中的地址
我试图通过它在内存中的地址来获取符号名。我使用C++ 如何通过它获得更多关于符号的信息';内存中的地址,c++,linux,dlopen,thunk,dladdr,C++,Linux,Dlopen,Thunk,Dladdr,我试图通过它在内存中的地址来获取符号名。我使用dlfcn.h中的int dladdr(void*addr,Dl_info*info)函数获取信息: typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at
dlfcn.h
中的int 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;
但是当我通过symbol的dlopen
和dlsym
查看共享对象并遍历虚拟函数指针列表时,dladdr
没有找到它。v表中的所有其他函数都可以通过dladdr
Tryobjdump--syms
找到。应该打印(损坏的)符号名称及其地址。看
我试图通过它在内存中的地址来获取符号名
为什么
我使用int-dladdr()
首先需要了解的是,dladdr
只查看ELF图像的动态符号表,它通常比静态符号表小得多。您可以使用nm-D
查看动态符号表的内容
例如,如果在没有-Wl,-E
或-rdynamic
标志的情况下链接a.out
可执行文件,则main
将不会出现在动态符号表中,因此dladdr
将“不可见”
您需要知道的第二件事是,当您链接共享库时,您可以精确地控制哪些符号可以从中导出,哪些符号不能从中导出(导出的符号是具有动态符号表项的符号)。执行此操作的方法有多种:链接器版本脚本、-fvisibility
标志、属性((可见性(…))
所有这一切都意味着,找到一个dladdr
无法告诉您任何信息的符号一点也不奇怪。objdump--syms libQtGStreamer-0.10.so.0
返回符号表:无符号
Vtable for QGst::PropertyProbe
QGst::PropertyProbe::_ZTVN4QGst13PropertyProbeE: 14u entries
...
80 (int (*)(...))QGst::PropertyProbe::_ZTv0_n24_N4QGst13PropertyProbeD1Ev
...