Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过它获得更多关于符号的信息';内存中的地址_C++_Linux_Dlopen_Thunk_Dladdr - Fatal编程技术网

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

Try
objdump--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 ...