私は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をビルドするためにそれらを広範囲に使用しました)
私はお手伝いできませんが、ここで回答が得られない場合は、SWI-Prologメーリングリストをお試しください.Janはこのリストに非常に役立ちます:http://www.swi-prolog。 org/Mailinglist.html – sharky
@sharky:私はすでにそこに投稿していますが(C++ FLIで15回の例外があります)、ヒントはありません。私はバグを再現するために最低限のテストケース(文字通り2行の2ファイル)を投稿しましたが、他の誰かがそれを検証したかどうかわかりません... – CapelliC