簡體   English   中英

從C ++中獲取受損的符號名稱

[英]get mangled symbol name from inside C++

如何從C ++程序中獲取函數的錯位名稱?

例如,假設我有一個標題:

// interface.h
#ifndef INTERFACE_H
#define INTERFACE_H
typedef void (*FooFunc)(int x, int y, double z, ...more complicated stuff...);
void foo(int x, int y, double z, ...more complicated stuff...);
#endif

我有一個客戶端程序,可以加載實現該接口的插件:

// client.h
#include "interface.h"
void call_plugin(so_filename)
{
    void *lib = dlopen(so_filename, ...);
    // HOW DO I IMPLEMENT THE NEXT LINE?
    static const char *mangled_name = get_mangled_name(foo);
    FooFunc func = (FooFunc)dlsym(lib, mangled_name);
    func(x, y, z, ...);
    dlclose(lib);
}

如何編寫get_mangled_name函數來計算foo函數的get_mangled_name名稱並將其作為字符串返回?

想到的一種方法是編譯interface.o並使用nm -A interface.o | grep foo nm -A interface.o | grep foo獲取受損的名稱然后將其作為硬編碼字符串復制並粘貼到client.h ,但這感覺就像是錯誤的方法。

想到的另一種方法是強制interface.h成為一個純C接口,我將所有C ++數據編組成一個通過C接口發送的大塊,然后在另一側重建C ++對象。 這也感覺不是最理想的。

編輯

請注意,這實際上是一個與來自demangled name的mang mangled name有關的獨特問題。 我想知道如何在編譯時從C ++本身內部獲取損壞的值,從編譯器可用的類型信息,僅給出C ++標識符的名稱。

您可以通過將函數聲明為extern "C"來防止修改:

// interface.h
#ifndef INTERFACE_H
#define INTERFACE_H
typedef void (*FooFunc)(int x, int y, double z, ...more complicated stuff...);
extern "C" void foo(int x, int y, double z, ...more complicated stuff...);
#endif

...並確保#include組成共享庫的所有源文件中的頭文件,因為此聲明會影響編譯器發出的相關函數的定義和引用。 請注意,您的函數簽名仍然可以使用非POD類型,例如std :: string。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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