我對C++使用SWI-Prolog foreign language interface,嘗試集成其他一些資源。DSO中的SIGSEGV,混合C/C++
它主要工作,但任何試圖拋出異常結果在SIGSEGV。例外情況通常用於驗證用戶參數,因此是界面的基本組成部分。
我從源代碼編譯SWI-Prolog的(通過提供的腳本),以及CXX標誌是
-c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC
我使用相同的標誌編譯我C++代碼,被組裝在一。所以,動態加載在SWI-Prolog中(我認爲通過dlopen)。
在SEGV顯示IP爲< +36>後,在__cxa_allocate_exception中檢查堆棧(通過GDB)。可能__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我已經能夠找到,這似乎相關的索賠
例外要求所屬類別查找
,這可能使SIGSEGV感。
但是我現在無法繼續。當然,我希望在一些神奇的CXX或LD標誌。 或者我應該裝飾我的庫入口點(我熟悉Windows declspec(s),我廣泛使用它們來構建MFC擴展dll)或其他?
我不能幫你,但如果你在這裏沒有得到答案,請嘗試使用SWI-Prolog郵件列表 - Jan非常有幫助,並且注意到這個列表:http://www.swi-prolog。 org/Mailinglist.html – sharky 2012-02-28 22:00:46
@sharky:我已經在那裏發佈了(15 feb,C++ FLI中的例外),但沒有線索。我還發布了一個最小的測試用例(2個字面2行文件)來重現該錯誤,但我不知道是否有人驗證了它... – CapelliC 2012-02-28 23:27:12