[英]How to get the mangled symbol of a function in C++?
我正在使用 dlmopen 加載我無法修改的共享庫的多個實例(專有)。 我這樣做是因為這個庫不是線程兼容的,所以我需要為每個線程加載它的獨立版本。
void *handle = dlmopen(LM_ID_NEWLM, "/myLib.so", RTLD_LAZY);
為了得到我需要的 function,我調用 dlsym:
void * test_load = dlsym(handle, <function_symbol>);
我的問題是:
extern "C"
來獲得可預測的符號)我知道 dlopen/dlmopen 最初打算用於 C,而不是 C++,但除非有其他方法可以多次加載同一個共享庫,否則我被卡住了
我如何知道 <function_symbol>
想必你知道你想調用哪個function。 假設它的名字是somelib::Init(int, char**)
。
找到function地址:
nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\)
nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\)
。
這應該產生類似12345fa T somelib::Init...
找到該符號的錯位名稱: nm -D libsomelib.so | grep '^12345fa '
nm -D libsomelib.so | grep '^12345fa '
。
這應該產生類似12345fa T _ZN7somelib4InitEiPPc
的東西。
在dlsym
調用中使用損壞的名稱。
沒有辦法將 map somelib::Init(int, char**)
其混亂的名稱,因為該映射不是 1:1 並且取決於用於構建libsomelib.so
的確切編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.