簡體   English   中英

如何在 C++ 中獲取 function 的損壞符號?

[英]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>);

我的問題是:

我如何得到 <function_symbol> 知道:

  • 我的圖書館在 C++ (又名 function 符號被損壞)
  • 我無法修改庫(又名沒有extern "C"來獲得可預測的符號)

我知道 dlopen/dlmopen 最初打算用於 C,而不是 C++,但除非有其他方法可以多次加載同一個共享庫,否則我被卡住了

我如何知道 <function_symbol>

想必你知道你想調用哪個function。 假設它的名字是somelib::Init(int, char**)

  1. 找到function地址:
    nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\) nm -CD libsomelib.so | grep 'somelib::Init\(int, char\*\*\)
    這應該產生類似12345fa T somelib::Init...

  2. 找到該符號的錯位名稱: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM