C ++成员函数的GCC别名属性

时间:2015-12-30 15:25:59

标签: c++ gcc attributes alias abi

由于系统标头中的类型更改,我在Linux上遇到了可移植性问题。 siginfo_t类型已从命名结构(struct siginfo)更改为未命名结构。对我来说,这在RHEL6和RHEL7之间发生了变化。

我们在一些地方使用ACE,并且在一些公开的接口中有siginfo_t。结果是在RHEL7上编译的代码不会链接到在RHEL6上构建的库。目前,我需要支持这一点。

在RHEL6中,一个问题函数输入为:

ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*) 

在RHEL7中,它看起来像这样:

ACE_Event_Handler::handle_signal(int, siginfo_t*, ucontext*) 

这些被破坏成不同的符号,导致链接期间失败或运行时符号查找失败。

一个相对简单的解决方案是使用函数别名。但是,我不想修改头文件。我有点挣扎,因为这是一个虚拟成员函数。

我尝试在基于RHEL7构建的ACE版本的Event_Handler.cpp中执行此操作:

struct siginfo;
ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*)
__attribute__((
  alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));

有了这个,GCC抱怨说没有宣布这个功能。我最终能够做到这一点,但只有这个丑陋的黑客:

extern "C" int _ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext()
__attribute__((
  alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));

需要'extern“C”'来防止重新破坏被破坏的名称。

有没有更优雅的方法来实现这一点而不会遇到编译器投诉?

0 个答案:

没有答案