如何从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
函数的损坏名称并将其作为字符串返回?浮现在脑海
一种方法是编译interface.o
和使用nm -A interface.o | grep foo
获得重整名称,然后复制并粘贴它作为一个硬编码字符串为client.h
,但感觉像错误的做法。
想到的另一种方法是强制interface.h
成为一个纯粹的C接口,将所有C++数据编组为一个通过C接口发送的大块,然后在另一侧重构C++对象。这也感觉不太理想。
编辑
注意,这实际上是从Getting mangled name from demangled name一个独特的问题。我想知道如何在编译时从C++本身的内部获取损坏的值,从编译器可用的类型信息中获取,只给出一个C++标识符的名称。
[从demangled名获得重整名称(http://stackoverflow.com/questions/12400105/getting-mangled-name-from-demangled-name) –
忙玲的可能重复的是特定的平台。也就是说,一些平台非常稳定地遵循一个固定的ABI,因此您可以自己实施规则。以下是[Itanium ABI破坏规则](https://mentorembedded.github.io/cxx-abi/abi.html#mangling)。 –
克++规则在这里:http://www.ofb.net/gnu/gcc/gxxint_15.html。这应该不难实现。最困难的部分是解析输入 - 如果声明为extern“C”',你甚至必须考虑不改变名称 - 如果你解析的源文件可以很好地从你感兴趣的方法中移除在。 –