【问题标题】:Undefined symbol error in Centos compileCentos 编译中的未定义符号错误
【发布时间】:2016-11-22 17:09:47
【问题描述】:

我遇到了一个有趣的问题。我正在编译我的应用程序代码,并在我的 centos 6 机器上使用 ace 库(version 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吨 _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP7siginfoP8ucontext 000f8b80 T _ZN22ACE_Shared_Memory_Pool13handle_signalEiP7siginfoP8ucontext bash-4.1$

但是当我在 centos 7 机器上编译同一个项目时,符号发生了变化:

bash# nm ace/6_1_1/ace/libACE.so.6.1.1 | grep handle_sig 000fa090 T _ZN15ACE_Sig_Adapter13handle_signalEiP9siginfo_tP8ucontext 000b9570 T _ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext 0007e070 T _ZN18ACE_Service_Config13handle_signalEiP9siginfo_tP8ucontext 000f3500 T _ZN19ACE_Process_Manager13handle_signalEiP9siginfo_tP8ucontext 00081cb0 T _ZN19ACE_Service_Manager13handle_signalEiP9siginfo_tP8ucontext 000d1990 T _ZN20ACE_MMAP_Memory_Pool13handle_signalEiP9siginfo_tP8ucontext 000f93d0 T _ZN22ACE_Shared_Memory_Pool13handle_signalEiP9siginfo_tP8ucontext bash#

请注意,siginfo 中有一个额外的 _t。所以,我链接这个库的应用程序在运行时无法启动给我这个错误:

符号“_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext” 没找到

另一个值得注意的有趣点是,如果我将编译好的 ace 库从我的 centos 6 盒子 复制到 centos 7 盒子,我的应用程序可以正常工作。

我不知道如何解决这个问题。在这方面的任何帮助将不胜感激!

【问题讨论】:

    标签: dynamic dll compilation shared-libraries


    【解决方案1】:

    但是当我在 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”,您会看到数百条投诉)。

    另一个值得注意的有趣点是,如果我复制已编译的 ace 从我的 centos 6 盒子到 centos 7 盒子的库,我的应用程序工作正常。

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

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

    我不知道如何解决这个问题。

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

    【讨论】:

    • 感谢您的回复。我一直在新的 CentOS 本身(即 Centos 7.2)上编译应用程序和库。正如您在上面指出的那样,当我在 Centos 6 和 Centos 7 上编译它时,符号是不同的。我也在用最新的glibc编译。有什么可以进一步调试的指针吗?
    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2014-09-07
    • 2022-01-15
    • 2011-12-10
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多