2012-02-15 26 views
1

我對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)或其他?

+0

我不能幫你,但如果你在這裏沒有得到答案,請嘗試使用SWI-Prolog郵件列表 - Jan非常有幫助,並且注意到這個列表:http://www.swi-prolog。 org/Mailinglist.html – sharky 2012-02-28 22:00:46

+0

@sharky:我已經在那裏發佈了(15 feb,C++ FLI中的例外),但沒有線索。我還發布了一個最小的測試用例(2個字面2行文件)來重現該錯誤,但我不知道是否有人驗證了它... – CapelliC 2012-02-28 23:27:12

回答

0

從Prolog調用時,您不能向Prolog內核拋出任何異常。 C++接口將捕獲PlException及其子類並將它們轉換爲Prolog異常。所有其他例外都不能被允許逃離你的圖書館。

由於SWI Prolog是LGPL,因此您可能會動態鏈接到它。因此,您必須確保所有拋出的C++在ELF系統上都具有默認可見性。