从C++中获取受损的符号名称

Mr *_*ooz 5 c++ linux g++

如何从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
Run Code Online (Sandbox Code Playgroud)

我有一个客户端程序,可以加载实现该接口的插件:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

如何编写get_mangled_name函数来计算函数的错位名称foo并将其作为字符串返回?

想到的一种方法是编译interface.o和使用nm -A interface.o | grep foo以获取受损的名称,然后将其复制并粘贴为硬编码字符串client.h,但这感觉就像是错误的方法.

想到的另一种方法是强制interface.h成为一个纯C接口,我将所有C++数据编组成一个通过C接口发送的大blob,然后在另一侧重建C++对象.这也感觉不是最理想的.

编辑

请注意,这实际上是一个与来自demangled name的mang mangled name有关的独特问题.我想知道如何在编译时从C++本身内部获取损坏的值,从编译器可用的类型信息,仅给出C++标识符的名称.

dav*_*let 1

您可以通过将函数声明为以下方式来防止损坏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
Run Code Online (Sandbox Code Playgroud)

...并确保在构成共享库的所有源文件中 #include 该头文件,因为此声明会影响编译器发出的相关函数的定义和引用。请注意,您的函数签名仍然可以使用非 POD 类型,例如 std::string。