2016-11-22 32 views
0

興味深い問題が発生しました。私のアプリケーションコードをコンパイルしていて、エースライブラリ(バージョン6_1_1をmy centos 6マシンに使用していました。すべてうまくいった。私はCentOSの6マシン上でコンパイルエースライブラリのシンボルを見てみると、それは次のようになります。CentOSで未定義のシンボルエラーが発生しました

bash-4.1$ nm ace/libACE.so.6.1.1 | grep handle_sig 000f9430 T _ZN15ACE_Sig_Adapter13handle_signalEiP7siginfoP8ucontext 000b84d0 T _ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext 00079f10 T _ZN18ACE_Service_Config13handle_signalEiP7siginfoP8ucontext 000f26d0 T _ZN19ACE_Process_Manager13handle_signalEiP7siginfoP8ucontext 0007ee70 T _ZN19ACE_Service_Manager13handle_signalEiP7siginfoP8ucontext 000cf920 T _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が追加されています。だから、私のこのライブラリは私にそのエラーを与えて実行時に起動に失敗したリンクアプリケーション:注意すべき

symbol "_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext" not found

もう一つの興味深い点は、私がのCentOSへの私のCentOSの6箱からコンパイルエースライブラリをコピーする場合ということです7ボックス、私のアプリケーションは正常に動作します。

この問題を解決する方法がわかりません。この点についての助けに感謝します!

答えて

0

But when i compile the same project on centos 7 machine, the symbols change:

はおそらくCentOSに7上のglibcは異なる記号を放出するマングラーを引き起こした公共ヘッダー内のいずれかのタイプを変更しました:新しい方法は、今ではなくSIGINFOよりsiginfo_tを使用していることを

$ 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*) 

お知らせ(あなた'LL "siginfo_t vs siginfo"についてgoogleの場合は何百もの苦情を参照してください)。

の下位互換性です

Another interesting point to note is that if i copy the compiled ace library from my centos 6 box into centos 7 box, my application works fine.

- あなたは(通常は)それは新しいバージョンだのディストリビューションの古いバージョンにリンクされたアプリを実行することができます。

逆に、互換性がありません(古いアプリケーションと新しいライブラリのリンク)。

I am lost on how to fix this issue.

新しいCentOSにのみ興味がある場合は、すべてのコードを再構築してください。古いバージョンで実行したい場合は、古いものをビルドして配布します。

+0

返信いただきありがとうございます。私はアプリケーションとライブラリを新しいCentOS自体、つまりCentos 7.2でコンパイルしています。あなたが上で指摘したように、Centos 6とCentos 7をコンパイルするとシンボルが異なります。私も最新のglibcを使ってコンパイルしています。これをさらにデバッグするためのポインタ? –

関連する問題