2015-04-14 32 views
4

如何从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++标识符的名称。

+0

[从demangled名获得重整名称(http://stackoverflow.com/questions/12400105/getting-mangled-name-from-demangled-name) –

+0

忙玲的可能重复的是特定的平台。也就是说,一些平台非常稳定地遵循一个固定的ABI,因此您可以自己实施规则。以下是[Itanium ABI破坏规则](https://mentorembedded.github.io/cxx-abi/abi.html#mangling)。 –

+0

克++规则在这里:http://www.ofb.net/gnu/gcc/gxxint_15.html。这应该不难实现。最困难的部分是解析输入 - 如果声明为extern“C”',你甚至必须考虑不改变名称 - 如果你解析的源文件可以很好地从你感兴趣的方法中移除在。 –

回答

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 

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