DSO中的SIGSEGV,混合C / C ++

我正在为C ++使用SWI-Prolog 外语接口 ,试图集成其他一些资源。

它主要起作用,但任何抛出exception的尝试都会导致SIGSEGV。 例外通常用于validation用户参数,因此是界面的基本部分。

我正在从源代码(通过提供的脚本)编译SWI-Prolog,并且CXX标志是

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

我正在使用相同的标志来编译我的C ++代码,它是在.so中组装的,在SWI-Prolog中动态加载(我认为通过dlopen)。

在SEGV显示IP在,__cxa_allocate_exception内部之后检查堆栈(通过GDB)。 可能__cxa_get_globals @ plt无法访问。

  Dump of assembler code for function __cxa_allocate_exception: 0x00007ffff1d80220 : push %r12 0x00007ffff1d80222 : lea 0x80(%rdi),%r12 0x00007ffff1d80229 : push %rbp 0x00007ffff1d8022a : mov %r12,%rdi 0x00007ffff1d8022d : push %rbx 0x00007ffff1d8022e : callq 0x7ffff1d1de30  0x00007ffff1d80233 : test %rax,%rax 0x00007ffff1d80236 : mov %rax,%rbx 0x00007ffff1d80239 : je 0x7ffff1d802d8  0x00007ffff1d8023f : callq 0x7ffff1d1efc0  0x00007ffff1d80244 : addl $0x1,0x8(%rax) 0x00007ffff1d80248 : test $0x1,%bl 0x00007ffff1d8024b : mov %rbx,%rdi 0x00007ffff1d8024e : mov $0x80,%edx 0x00007ffff1d80253 : jne 0x7ffff1d803d0  0x00007ffff1d80259 : test $0x2,%dil 

我能找到的唯一资源似乎是相关的主张

该exception需要typeinfo查找

这可以理解SIGSEGV。

但我现在无法继续。 当然,我希望在一些神奇的CXX或LD旗帜。 或者我应该装饰我的库入口点(我熟悉Windows declspec(s),我广泛使用它们来构建MFC扩展DLL)或者其他什么?

从Prolog调用时,不能将任何exception抛入Prolog内核。 C ++接口将捕获PlException及其子类,并将它们转换为Prologexception。 不得允许所有其他例外逃离您的图书馆。

由于SWI Prolog是LGPL,您可能正在动态链接到它。 因此,您必须确保所有抛出的C ++在ELF系统上具有默认可见性。