Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DSO中的SIGSEGV,混合C/C和#x2B+;_C++_C_Shared Libraries_Swi Prolog_Segmentation Fault - Fatal编程技术网

C++ DSO中的SIGSEGV,混合C/C和#x2B+;

C++ DSO中的SIGSEGV,混合C/C和#x2B+;,c++,c,shared-libraries,swi-prolog,segmentation-fault,C++,C,Shared Libraries,Swi Prolog,Segmentation Fault,我使用C++的SWI Prolog,试图集成其他资源。 它基本上是有效的,但任何抛出异常的尝试都会导致SIGSEGV。异常通常用于验证用户参数,因此是界面的基本部分 我正在从源代码处编译SWI Prolog(通过提供的脚本),CXX标志是 -c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC 我使用相同的标志来编译我的C++代码,它是在A中组装的。因此,在SWI Prolog中动态加载(我想通过DLOPEN)。 SEGV显示IP at、INTERNAIN _uCX

我使用C++的SWI Prolog,试图集成其他资源。 它基本上是有效的,但任何抛出异常的尝试都会导致SIGSEGV。异常通常用于验证用户参数,因此是界面的基本部分

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

-c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC
我使用相同的标志来编译我的C++代码,它是在A中组装的。因此,在SWI Prolog中动态加载(我想通过DLOPEN)。 SEGV显示IP at、INTERNAIN _uCXA_allocate_异常后检查堆栈(通过GDB)。很可能_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 <malloc@plt>
0x00007ffff1d80233  <+19>:              test   %rax,%rax
0x00007ffff1d80236  <+22>:              mov    %rax,%rbx
0x00007ffff1d80239  <+25>:              je     0x7ffff1d802d8 <__cxa_allocate_exception+184>
0x00007ffff1d8023f  <+31>:              callq  0x7ffff1d1efc0 <__cxa_get_globals@plt>
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
函数的汇编程序代码转储\uuuu cxa\u allocate\u异常:
0x00007ffff1d80220:推送%r12
0x00007ffff1d80222:lea 0x80(%rdi),%r12
0x00007ffff1d80229:推送%rbp
0x00007ffff1d8022a:mov%r12,%rdi
0x00007ffff1d8022d:推送%rbx
0x00007FF1D8022E:调用0x7ffff1d1de30
0x00007ffff1d80233:测试%rax,%rax
0x00007ffff1d80236:mov%rax,%rbx
0x00007FF1D80239:je 0x7FF1D802D8
0x00007ffff1d8023f:调用0x7ffff1d1efc0
0x00007ffff1d80244:添加$0x1,0x8(%rax)
0x00007ffff1d80248:测试$0x1,%bl
0x00007ffff1d8024b:mov%rbx,%rdi
0x00007ffff1d8024e:mov$0x80,%edx
0x00007ffff1d80253:jne 0x7ffff1d803d0
0x00007ffff1d80259:测试$0x2,%dil
我所能找到的似乎是中肯的说法

该异常需要进行typeinfo查找

这可能解释了SIGSEGV

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

从Prolog调用时,您不能向Prolog内核抛出任何异常。C++接口将捕获PrExabor及其子类,并将它们转换成Prolog异常。不得允许所有其他异常从您的库中逃逸


由于SWI Prolog是LGPL,您可能正在动态链接到它。因此,你必须确保所有被抛出的C++都对ELF系统有默认的可见性。< /P>我不能帮助你,但是如果你在这里没有答案,试试SWI Prolog邮件列表——Jan对这个列表非常有帮助和关注:@沙基:我已经在那里发布了(15 FEB,C++ FLI中的异常),但是没有线索出现。我还发布了一个最小的测试用例(2个文件,2行)来重现这个bug,但我不知道是否有其他人验证了它。。。