从 C++ 内部获取损坏的符号名称
get mangled symbol name from inside C++
如何从 C++ 程序中获取函数的错位名称?
例如,假设我有一个 header:
// 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
函数的错位名称并将其 return 作为字符串?
我想到的一种方法是编译 interface.o
并使用 nm -A interface.o | grep foo
获取错位的名称,然后 copy-and-paste 它作为 hard-coded 字符串进入 client.h
,但这感觉像是错误的方法。
我想到的另一种方法是强制 interface.h
成为纯 C 接口,我将所有 C++ 数据编组到一个通过 C 接口发送的大 blob,然后让 C++ objects 在另一边重建。这也感觉不太理想。
编辑
请注意,这实际上是一个与 Getting mangled name from demangled 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.
如何从 C++ 程序中获取函数的错位名称?
例如,假设我有一个 header:
// 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
函数的错位名称并将其 return 作为字符串?
我想到的一种方法是编译 interface.o
并使用 nm -A interface.o | grep foo
获取错位的名称,然后 copy-and-paste 它作为 hard-coded 字符串进入 client.h
,但这感觉像是错误的方法。
我想到的另一种方法是强制 interface.h
成为纯 C 接口,我将所有 C++ 数据编组到一个通过 C 接口发送的大 blob,然后让 C++ objects 在另一边重建。这也感觉不太理想。
编辑
请注意,这实际上是一个与 Getting mangled name from demangled 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.