I'm using dlmopen to load multiple instance of a shared library which I can't modify (proprietary). I do this because this library is not thread-compatible, so I need an independent version of it to be loaded for each thread.
void *handle = dlmopen(LM_ID_NEWLM, "/myLib.so", RTLD_LAZY);
In order to get the function I need, I call dlsym :
void * test_load = dlsym(handle, <function_symbol>);
My question is :
How do i get <function_symbol> knowing that:
extern "C" to get a predicable symbol)I know that dlopen/dlmopen is initially meant to be used in C, not C++, but unless there is an other way to load many time the same shared library, I am stuck
How do i get <function_symbol> knowing that
Presumably you know which function you want to call. Let's say its name is somelib::Init(int, char**).
Find that function address:
nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\).
This should produce something like 12345fa T somelib::Init...
Find the mangled name of that symbol: nm -D libsomelib.so | grep '^12345fa '.
This should produce something like 12345fa T _ZN7somelib4InitEiPPc.
Use the mangled name in the dlsym call.
There is no way to map somelib::Init(int, char**) to its mangled name because that mapping is not a 1:1 and depends on the exact compiler used to build libsomelib.so.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With