c++ - 如何获取 C++ 中函数的重整符号?

标签 c++ shared-libraries dlopen

上下文

我正在使用 dlmopen 加载我无法修改的共享库的多个实例(专有)。我这样做是因为这个库与线程不兼容,所以我需要为每个线程加载它的独立版本。

void *handle = dlmopen(LM_ID_NEWLM, "/myLib.so", RTLD_LAZY);

为了获得我需要的功能,我调用 dlsym :

void * test_load = dlsym(handle, <function_symbol>);

我的问题是:

我如何让 知道:

  • 我的库是用 C++ 编写的(又名函数符号被破坏)
  • 我无法修改库(又名 extern "C" 来获取可预测符号)

我知道 dlopen/dlmopen 最初是在 C 中使用,而不是在 C++ 中使用,但除非有其他方法可以多次加载相同的共享库,否则我会陷入困境

最佳答案

How do i get <function_symbol> knowing that

想必您知道要调用哪个函数。假设它的名字是 somelib::Init(int, char**) .

  1. 查找该函数地址:
    nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\) .
    这应该会产生类似 12345fa T somelib::Init... 的结果

  2. 找到该符号的损坏名称:nm -D libsomelib.so | grep '^12345fa ' .
    这应该会产生类似 12345fa T _ZN7somelib4InitEiPPc 的结果.

dlsym 中使用损坏的名称打电话。


无法映射somelib::Init(int, char**)其损坏的名称,因为该映射不是 1:1 并且取决于用于构建 libsomelib.so 的确切编译器.

关于c++ - 如何获取 C++ 中函数的重整符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73419669/

相关文章:

linux - 在符号和共享库之间强制映射

c++ - 在运行时检查动态库的兼容性

c++ - 使用 libxml2 执行递归 XPath 查询的最有效方法是什么?

ios - dylib 或可执行导出列表

c++ - 从 int|double 到 string 的转换的简洁 C++ 习语是什么?

windows - 如何在 Windows 上通过 Cmake 使用 Tesseract OCR?

c - 在 Unix 中编程 : Sharing libraries with libraries

Android 和 Eclipse - 引用库

C++ uint64 和 *uint64 有什么区别?

c++ - 在我的代码中假定为 "syntax error","missing ' ;' before ' .'"