[英]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.