2012-02-15 18 views
1

私はSWI-Prolog foreign language interfaceをC++に使用しています。他のリソースを統合しようとしています。DSOのSIGSEGV、混合C/C++

ほとんどの場合動作しますが、例外をスローしようとするとSIGSEGVになります。例外は、ユーザパラメータの検証に日常的に使用されるため、インタフェースの基本的な部分です。私は私のC++コードをコンパイルするために同じフラグを使用してい

私は(提供されるスクリプトを介して)ソースからのSWI-Prologのをコンパイルしていて、CXXフラグが

-c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC 

である、すなわち、で組み立てられます。 SWI-Prologに動的にロードされます(dlopenを介して、私は思っています)。

SEGVの後のスタックの検査では、__cxa_allocate_exception内の< + 36>にIPが表示されます。おそらく__cxa_get_globals @ pltにはアクセスできません。

 Dump of assembler code for function __cxa_allocate_exception: 
0x00007ffff1d80220 <+0>:    push %r12 
0x00007ffff1d80222 <+2>:    lea 0x80(%rdi),%r12 
0x00007ffff1d80229 <+9>:    push %rbp 
0x00007ffff1d8022a <+10>:    mov %r12,%rdi 
0x00007ffff1d8022d <+13>:    push %rbx 
0x00007ffff1d8022e <+14>:    callq 0x7ffff1d1de30 <[email protected]> 
0x00007ffff1d80233 <+19>:    test %rax,%rax 
0x00007ffff1d80236 <+22>:    mov %rax,%rbx 
0x00007ffff1d80239 <+25>:    je  0x7ffff1d802d8 <__cxa_allocate_exception+184> 
0x00007ffff1d8023f <+31>:    callq 0x7ffff1d1efc0 <[email protected]> 
0x00007ffff1d80244 <+36>:    addl $0x1,0x8(%rax) 
0x00007ffff1d80248 <+40>:    test $0x1,%bl 
0x00007ffff1d8024b <+43>:    mov %rbx,%rdi 
0x00007ffff1d8024e <+46>:    mov $0x80,%edx 
0x00007ffff1d80253 <+51>:    jne 0x7ffff1d803d0 <__cxa_allocate_exception+432> 
0x00007ffff1d80259 <+57>:    test $0x2,%dil 

私はそれを見つけることができましたonly resource

は例外がtypeinfoの検索

を必要とし、これはSIGSEGVの感覚を作ることができる適切な請求

です。

しかし、今は進めません。もちろん、私は魔法のCXXまたはLDフラグで願っています。 ライブラリのエントリポイントをデコレートする必要がありますか(Windowsのdeclspecに精通していますか、MFC拡張DLLをビルドするためにそれらを広範囲に使用しました)

+0

私はお手伝いできませんが、ここで回答が得られない場合は、SWI-Prologメーリングリストをお試しください.Janはこのリストに非常に役立ちます:http://www.swi-prolog。 org/Mailinglist.html – sharky

+0

@sharky:私はすでにそこに投稿していますが(C++ FLIで15回の例外があります)、ヒントはありません。私はバグを再現するために最低限のテストケース(文字通り2行の2ファイル)を投稿しましたが、他の誰かがそれを検証したかどうかわかりません... – CapelliC

答えて

0

Prologから呼び出された場合、Prologカーネルに例外をスローすることはできません。 C++インタフェースはPlExceptionとそのサブクラスを捕捉し、それらをProlog例外に変換します。他のすべての例外は、あなたのライブラリをエスケープすることを許されてはなりません。

SWI PrologはLGPLなので、おそらく動的にリンクしているはずです。したがって、スローされるすべてのC++にELFシステムのデフォルトの可視性があることを確認する必要があります。