CentOS编译中未定义的符号错误



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

bash-4.1 $ nm ace/libace.so.6.1.1 |grep handle_sig 000f9430 t 000CF920 t _ZN20ACE_MMAP_MEMORY_POOL13HANDLE_SIGNALEIP7SIGINFOP8UCONTEXT 000F8B80 T _ZN22ACE_SHARED_MEMORY_POOL13HANDLE_SIGNELE_SIGNALEIP7SIGEALEIP7SIGINFOP8UCONTEXTEXTEXT 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" 找不到

要注意的另一个有趣的点是,如果我从我的 Centos 6 Box Centos 7 Box 中复制编译ACE库,我的应用程序正常工作。

我迷失了如何解决此问题。在此方面的任何帮助将不胜感激!

但是,当我在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(如果您在Google上进行" siginfo_t vs siginfo"的Google,您会看到数百个投诉)。

要注意的另一个有趣的点是,如果我复制了汇编的王牌 我的CentOS 6盒中的库中Centos 7盒子,我的应用程序正常工作。

这是向后的兼容性 - 您可以(通常)运行在较新版本的旧版本上链接的应用程序。

相反,不保证远期兼容性(在您的情况下 - 链接旧应用程序与新图书馆链接)。

我迷失了如何解决这个问题。

如果您只对新的Centos感兴趣 - 重建所有代码。如果您想在较旧版本上运行 - 构建最古老的版本并分发。

最新更新