上下文
我正在使用 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**)
.
查找该函数地址:
nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\)
.
这应该会产生类似12345fa T somelib::Init...
的结果找到该符号的损坏名称:
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/