【问题标题】:How to map dlsym to a non-static C++ member function in a manner similar to a C function?如何以类似于 C 函数的方式将 dlsym 映射到非静态 C++ 成员函数?
【发布时间】:2016-01-04 18:11:14
【问题描述】:

我仔细研究和测试了以下 URL,Calling function in shared library (Linux) get Segmentation Fault 以及https://git.xeserv.us/Quora/dlsym-example/src/master/testprog.c。 我的问题是如何将 dlsym 映射到类似于此 C 函数示例的非静态 C++ 成员函数。如果我用 C 函数语法替换非静态 C++ 成员函数,我会得到一个空操作。

   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");

感谢任何帮助。

【问题讨论】:

  • C++ 没有 ABI(应用程序二进制接口)并且链接依赖于编译器(甚至是编译器版本)。
  • @Basilev,编译器标签为 g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4。
  • @Dieter Lücking,C++ 名称修改是否与此目的相关?
  • @richpe,重整是绝对相关的。请编辑您的帖子以包含您失败的 C++ 尝试,而不是无关的 C 尝试。

标签: c++ linux g++ dlsym


【解决方案1】:

考虑通过使用

提取的重命名方法加载方法
readelf -Ws libmy.so

nm -g libmy.o

【讨论】:

  • 感谢您的出色回答。我是否需要包含任何可以解析损坏名称的头文件,例如:_ZN19CDataTransferServer10InitializeEi13CC_SAMPLETYPEjjj?
  • 您将需要一个 DataTransferServer 的定义来获得指向其方法的类型化指针。
  • 我刚刚包含 DataServer.h 并使用 g++ -g -DLINUX -I /home/vend/developmentMono/SmartCamXi_Hybrid/Include test.cpp -ldl 编译并得到以下编译器错误:test.cpp: 33:48: 错误: '_ZN19CDataTransferServer10InitializeEi13CC_SAMPLETYPEjjj' 未在此范围内声明 *(bool **)(&sayHello) = (bool *)dlsym(handle,_ZN19CDataTransferServer10InitializeEi13CC_SAMPLETYPEjjj);请提出解决这些错误的方法。谢谢。
  • 我刚刚得知您不能使用 dlopen 和 dlsym 访问 c++ 类,因为它们是 C 函数。相反,在此 URL stackoverflow.com/questions/496664/… 中描述了一种更好的方法。感谢您的所有帮助。
  • 您应该提供字符串文字,而不是符号作为 dlsym 的参数。每个 C++ 方法都是一个名称混乱的 C 函数(至少在 GCC 世界中)。
猜你喜欢
  • 2010-11-02
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多