C++ 如何将dlsym映射到非静态C++;成员函数的方式类似于C函数?
我仔细研究并测试了以下URL, 以及 我的问题是如何将DLSEIM映射到与C函数示例类似的非静态C++成员函数。如果我用C函数语法代替非静态C++成员函数,则得到NO-op.<C++ 如何将dlsym映射到非静态C++;成员函数的方式类似于C函数?,c++,linux,g++,dlsym,C++,Linux,G++,Dlsym,我仔细研究并测试了以下URL, 以及 我的问题是如何将DLSEIM映射到与C函数示例类似的非静态C++成员函数。如果我用C函数语法代替非静态C++成员函数,则得到NO-op.< void *lib; /* void pointer named lib */ void (*sayHello)(void); /* void pointer named sayHello */ lib = dlopen("helloWorld.so", RTLD_NOW);
void *lib; /* void pointer named lib */
void (*sayHello)(void); /* void pointer named sayHello */
lib = dlopen("helloWorld.so", RTLD_NOW);
*(void **) (&sayHello) = dlsym(lib,"_ZN19CDataTransferServer10InitializeEi13CC_SAMPLETYPEjjj");
非常感谢您的帮助。请考虑使用
readelf -Ws libmy.so
或
C++没有ABI(应用程序二进制接口)和链接是编译器(甚至编译器版本)依赖。@ Baselev,编译器标签是G++(Ubuntu 4.84-2Ubuntu1~14.04)4.84. @ diter LucCKin,是C++的名字与这个目的有关吗?@ Riffpe,MunLin是绝对相关的。请编辑你的帖子,包括失败的C++尝试,而不是无关的C。我是否需要包含任何头文件来解析损坏的名称,例如:_zn19CDATATransferServer10InitializeEEI13CC_SAMPLETYPEjjj?您需要DataTransferServer的定义才能有一个指向其方法的类型指针。我只包含了DataServer.h,并使用g++-g-DLINUX-I/home/vend/developmentMono/SmartCamXi\u Hybrid/include test.cpp进行编译-ldl并获得以下编译器错误:test.cpp:33:48:错误:“\u zn19cdatatransferserver10initializeeei13cc\u SAMPLETYPEjjj”未在此作用域中声明*(bool**)(&sayHello)=(bool*)dlsym(句柄,\u zn19cdatatransferserver10initializeeei13cc\u sampletypejj);请建议解决这些错误的方法。谢谢。我刚刚被告知,由于使用C函数,所以不能使用DLOPEN和DLSEM访问C++类。相反,此URL中描述了一种更好的方法。感谢您的帮助。您应该提供字符串文字,而不是符号作为dlsym的参数。每一个C++方法都是一个C函数,其中有一个被命名的名字(至少在GCC世界中)。
nm -g libmy.o