Centos编译中

时间:2016-11-22 17:09:47

标签: dynamic dll compilation shared-libraries

我遇到了一个有趣的问题。我正在编译我的应用程序代码,并在我的centos 6计算机上使用 ace库(版本6_1_1 。一切都很好。当我查看在centos 6机器上编译的ace库的符号时,它看起来像这样:

  

bash-4.1 $ nm ace / libACE.so.6.1.1 | grep handle_sig 000f9430 T.   _ZN15ACE_Sig_Adapter13handle_signalEiP7siginfoP8ucontext 000b84d0Ť_ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext 00079f10Ť_ZN18ACE_Service_Config13handle_signalEiP7siginfoP8ucontext 000f26d0Ť_ZN19ACE_Process_Manager13handle_signalEiP7siginfoP8ucontext 0007ee70Ť_ZN19ACE_Service_Manager13handle_signalEiP7siginfoP8ucontext   000cf920 T.   _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP7siginfoP8ucontext 000f8b80 T _ZN22ACE_Shared_Memory_Pool13handle_signalEiP7siginfoP8ucontext   的bash-4.1 $

但是当我在 centos 7 machine 上编译同一个项目时,符号会改变:

  

bash#nm ace / 6_1_1 / ace / libACE.so.6.1.1 | grep handle_sig 000fa090 T   _ZN15ACE_Sig_Adapter13handle_signalEiP9siginfo _t P8ucontext 000b9570 T   _ZN17ACE_Event_Handler13handle_signalEiP9siginfo _t P8ucontext 0007e070 T   _ZN18ACE_Service_Config13handle_signalEiP9siginfo _t P8ucontext 000f3500 T   _ZN19ACE_Process_Manager13handle_signalEiP9siginfo _t P8ucontext 00081cb0 T   _ZN19ACE_Service_Manager13handle_signalEiP9siginfo _t P8ucontext 000d1990 T   _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP9siginfo _t P8ucontext 000f93d0 T   _ZN22ACE_Shared_Memory_Pool13handle_signalEiP9siginfo _t P8ucontext bash#

请注意,siginfo中还有一个额外的 _t 。因此,我的链接此库的应用程序无法在运行时启动,从而给出了错误:

  

符号“_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext”   找不到

另一个有趣的要点是,如果我将已编译的ace库从我的 centos 6 box 复制到 centos 7 box ,我的应用程序运行正常。

我对如何解决这个问题很感兴趣。在这方面的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

  

但是当我在centos 7机器上编译相同的项目时,符号会改变:

Centos 7上的Glibc可能已经改变了公共标题中的一种类型,导致mangler发出不同的符号:

$ echo _ZN15ACE_Sig_Adapter13handle_signalEiP7siginfoP8ucontext | c++filt
ACE_Sig_Adapter::handle_signal(int, siginfo*, ucontext*)
$ echo _ZN15ACE_Sig_Adapter13handle_signalEiP9siginfo_tP8ucontext | c++filt
ACE_Sig_Adapter::handle_signal(int, siginfo_t*, ucontext*)

请注意,新方法现在使用的是siginfo_t而不是siginfo(如果你谷歌搜索" siginfo_t vs siginfo&#34,你会看到数百个投诉。)

  

另一个有趣的注意事项是,如果我复制已编译的王牌   从我的centos 6 box到centos 7 box的库,我的应用程序工作正常。

这是向后兼容性 - 您可以(通常)在旧版本的发行版上运行与其较新版本相关联的应用。

相反,无法保证向前兼容性(在您的情况下 - 将旧应用程序与新库链接)。

  

我对如何解决这个问题很感兴趣。

如果您只对新的CentOS感兴趣 - 重建所有代码。如果你想在旧版本上运行 - 建立在最旧的版本上并分发它。